Kako prolazi jedan zahtev
- Ulaz: Folder, pročitan rekurzivno u bajtove - Windows Forms
- Orkestracija: WCF servis - WCF, .NET
- Paralelno
- AES - CBC, iz .NET biblioteke - .NET
- RC6 - Ručna implementacija, 20 rundi - C#
- XXTEA - Ručna implementacija, Fajstelova mreža - C#
- Izlaz: Po jedan šifrovan fajl za svaki ulazni - SHA-512 upisan pre i posle
Pregled
Aplikacija radi sa celim folderom, a ne sa pojedinačnim fajlom. Izabere se direktorijum, aplikacija pročita sve u njemu i u svim podfolderima, a zatim jedan od tri simetrična algoritma šifruje ceo skup. Šifrovani fajlovi, dešifrovani fajlovi i heš zapisi upisuju se u foldere koje korisnik izabere.
Algoritma ima tri, a samo je jedan gotov. AES je implementacija iz .NET biblioteke, koju bi koristila svaka ozbiljna aplikacija. RC6 i XXTEA sam napisao po njihovim specifikacijama, i u tome je bio glavni deo posla: proširenje ključa, dopunjavanje blokova, rotacije i namerno prekoračenje celobrojne vrednosti na koje se XXTEA oslanja.
Tehnologije
- Klijent
- Windows FormsC#
- Servis
- WCF.NETC#
Arhitektura
Klijent čita folder
Posle izbora foldera, rekurzivni obilazak čita svaki fajl kao niz bajtova, bez obzira na ekstenziju, i čuva ime, ekstenziju, putanju i sadržaj zajedno kao jedan zapis. Sadržaj se ne tumači, pa .txt i .exe prolaze isti put kroz program.
Čitanje u pozadini, da prozor ne zablokira
U Windows Forms-u sve kontrole pripadaju jednoj, UI niti. Kada bi se veliki folder čitao na njoj, prozor bi se zamrzao, zajedno sa loaderom koji treba da se vrti. Zato se čitanje izvršava kao Task, a nastavak se vraća na sinhronizacioni kontekst forme, jer se samo odatle dugmad smeju ponovo omogućiti.
Lista se šalje servisu
Klijent poziva WCF servis preko HTTP-a. Zbog količine podataka obe strane su morale drugačije da se konfigurišu: limiti bafera su podignuti na najveću vrednost koju int može da primi, a režim prenosa je prebačen sa buffered na streamed, pa se u baferu drži samo zaglavlje poruke, a ne cela lista fajlova. Tajmaut je deset minuta na obe strane.
Servis šifruje, fajl po fajl
Izabrani algoritam dobija listu, ključ i, za AES, inicijalizacioni vektor. RC6 i XXTEA rade samo sa celim blokovima, pa svaki dopunjava niz bajtova do veličine bloka i upisuje originalnu dužinu u prva četiri bajta. Tako dešifrovanje zna tačno koliko dopune da odbaci, umesto da pogađa gde se fajl završava.
Heš na oba kraja
Pored svakog fajla nastaje tekstualni fajl sa četiri SHA-512 vrednosti: pre šifrovanja, posle šifrovanja, pre dešifrovanja i posle dešifrovanja. Važne su prva i poslednja, i moraju biti identične. Na tome se zasniva provera integriteta, i svako može da je ponovi otvaranjem tog fajla.
Šta radi
Ceo folder odjednom
Sa svim podfolderima, do bilo koje dubine. Izlazna struktura foldera prati ulaznu, a računa se iz putanje svakog fajla u odnosu na koreni folder, a ne praćenjem rekurzije.
Tri algoritma, jedna forma
AES sa ključem od 32 znaka i IV od 16 znakova, RC6 i XXTEA sa ključem od 16 znakova. Svaki algoritam ima svoj prozor, a svako polje se validira pre nego što se išta upiše.
Dokaz da je fajl isti
SHA-512 originalnog sadržaja pre šifrovanja poredi se sa SHA-512 sadržaja posle dešifrovanja. Ako su jednaki, ništa nije izgubljeno.
Sekvencijalno ili paralelno
Oba režima postoje, a bira se jednim checkboxom. U paralelnom režimu lista fajlova se obrađuje u paralelnoj petlji, a pošto nijedan fajl ne zavisi od drugog, ništa ne mora da se zaključava ni spaja. Koliko to vredi, pokazuju rezultati ispod.
Progress bar koji prati stvarni posao
Dok servis radi, napreduje prema ukupnom broju bajtova, a kada se poziv vrati, cancellation token ga odmah dopuni do kraja. Tako se završava tačno kada i posao.
Pregled fajlova pre početka
Stablo svih učitanih fajlova, potpuno otvoreno, da se pre početka vidi šta će biti šifrovano.
Rezultati
| Režim | Fajlova | Šifrovanje (s) | Dešifrovanje (s) |
|---|---|---|---|
| Sekvencijalno | 150 | 68,91 | 70,13 |
| Paralelno | 150 | 44,16 | 40,39 |
Istih 150 fajlova, isti RC6 ključ i isti izlazni folderi, jednom u svakom režimu. Paralelno šifrovanje je trajalo 44,16 sekundi umesto 68,91, a dešifrovanje 40,39 umesto 70,13, za više od trećine kraće u oba smera.
Dobitak dolazi od toga što su fajlovi nezavisni: paralelnoj petlji ne trebaju ni zaključavanje ni redosled, pa nijedan fajl ne čeka prethodni.
Šta sam naučio
Poenta projekta je bila da dva od tri algoritma napišem sam, a ne da ih pozovem iz biblioteke. To su kratki algoritmi u kojima je skoro svaka linija bitna: u kom smeru ide rotacija, gde se čuva originalna dužina, i to da XXTEA zahteva da se aritmetika pri prekoračenju prelije, a ne da baci grešku. Heševi koji se poklapaju dokazuju da je sve tačno, bajt po bajt.
Druga polovina je podela na klijent i servis. Kriptografija radi u servisu, a ne u procesu koji iscrtava prozor, i ista tri algoritma može da koristi svako ko može da pozove taj servis.