Pređi na sadržaj
Vuk Cvetković
Projekti

Encryptix

Tri algoritma šifrovanja iza jednog servisa i heš na oba kraja kao dokaz da je fajl vraćen bez izmene.

Godina
2023
Kontekst
Diplomski rad, Elektronski fakultet u Nišu
Domen
Šifrovanje fajlova na desktopu

Kako prolazi jedan zahtev

  1. Ulaz: Folder, pročitan rekurzivno u bajtove - Windows Forms
  2. Orkestracija: WCF servis - WCF, .NET
  3. Paralelno
    • AES - CBC, iz .NET biblioteke - .NET
    • RC6 - Ručna implementacija, 20 rundi - C#
    • XXTEA - Ručna implementacija, Fajstelova mreža - C#
  4. 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 Forms
C#
Servis
WCF
.NET
C#

Arhitektura

  1. 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.

  2. Č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.

  3. 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.

  4. 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.

  5. 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

Encryptix - Rezultati
RežimFajlovaŠifrovanje (s)Dešifrovanje (s)
Sekvencijalno15068,9170,13
Paralelno15044,1640,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.

Svi projekti

Esc