O projektu Detalji Preuzimanja Reference

Uvod

Kriptografija javnog ključa

Kriptografija javnog ključa ili asimetrična kriptografija jedan je od najbitnijih sigurnosnih mehanizama današnjeg Iinterneta. Temelji se na korištenju para ključeva: javnog ključa koji može biti poznat svima, i tajnog ključa koji je je sakriven od javnosti i poznat samo njegovom vlasniku. Ključevi se u većini slučajeva koriste za razmjenu simetričnog ključa koji se zatim koristi za kriptiranje svih ostalih poruka u komunikaciji.

Pretpostavimo da imamo dvije osobe, Alice i Bob, koji žele komunicirati preko interneta bez da im itko može presresti i pročitati poruke. Kako bi zaštitili poruke od takve vrste prisluškivanja, potrebno ih je kriptirati, no prije samom šifriranja potrebno je razmijeniti simetričan ključ kojim će to i napraviti. Ta se razmjena postiže pomoću asimetričnih ključeva na sljedeći način:

  1. Bob generira simetričan ključ K
  2. Bob koristi Alicein javni ključ da kriptira ključ K
  3. Bob šalje Alice kriptirani ključ K
  4. Alice koristi svoj tajni ključ da dekriptira kriptirani ključ K
  5. Alice i Bob koriste ključ K da kriptiraju sve ostale poruke u komunikaciji

Ova metoda je sigurna jer javni i tajni ključ su iznimno različiti ali i dalje ovise jedan o drugome. Ono što jedan ključ kriptira drugi može dekriptirati, no bilo koji ključ ne može dekriptirati ono što je on sam kriptirao. Također, znajući jedan od ta dva ključa, skoro je nemoguće u razumnom vremenu izračunati onaj drugi. Razlog tomu je što se ključevi generiraju jednosmjernim matematičkim funkcijama za koje je nemoguće ili još uvijek nepoznato pronaći reverznu funkciju. Najpoznatiji primjer ovakve generacije jest u RSA algoritmu koji koristi problem faktoriranja iznimno velikih brojeva kako bi se smatrao sigurnim. Klasično računalo, da bi pronašlo faktore nekog broja, nema puno boljeg načina od načina grube sile pa je iz tog razloga dovoljno sporo da se ne smatra ozbiljnom prijetnjom takvom načinu generiranja ključeva.

end to end encryption

Kvantna računala

Na isti način kako su klasična računala transformirala svijet u svijet budućnosti, kvantna računala sada počinju raditi isto. Donose potpuno nove načine računanja koji će pokrenuti eksponencionalan napredak u mnogim područjima primjene. Kvantno računalo rješava mnoge probleme koje klasično računalo u principu neće moći nikada riješiti. No, rješavanje nekih od tih problema može uzrokovati nove probleme. Jedan od tih problema je sigurnost.

Kvantno računalo, sa dovoljno kvantnih bitova, ima sposobnost brzo i efikasno razbiti mnoge od postojećih sustava sigurnosti na internetu. Kvantni algoritmi poput Shorovog algoritma predstavljaju ozbiljan problem za mnoge od sadašnjih načina generiranja asimetričnih ključeva. To je nešto s čim se stručnjaci trenutno sukobljavaju jer je samo pitanje vremena kada će biti moguće konstruirati kvantno računalo sa dovoljno kvantnih bitova za provedbu takvih algoritama u stvarnom svijetu.


Grafičko sučelje

Aplikacija je zamišljena kao simulacija razgovora između Alicea i Boba tijekom kojeg oni razmjenjuju svoje post-kvantne kriptografske ključeve te ih koriste za enkapsulaciju dijeljene tajne koju onda koriste za komunikaciju simetričnom enkripcijom - konkretno u našem slučaju koristimo Rijndaelov blok kod za simetrično kriptiranje komunikacije nakon razmjene ključeva. Početna stranica aplikacije je izbornik koji nudi odabir željenog algoritma. Odabirom jedne opcije, stvara se simulacija razmjene ključeva za taj algoritam.

Također postoji mogućnost samostalnog generiranja, enkapsulacije i dekapsulacije ključeva koristeći po želji odabran algoritam. Također je moguće šifrirati željenu datoteku dijeljenom tajnom pomoću AES algoritma.


Backend

Prvi korak pri realizaciji projekta bio je osposobljavanje različitih knjižnica algoritama. Izvorne kodove algoritama skinuli smo sa njihovih stranica te su neki od njih već nudili opciju stvaranja dijeljene knjižnice. Za one koji to nisu nudili, morali smo to sami napraviti. Proces stvaranja dijeljene knjižnice (za GNU/Linux) opisan je u nastavku:

  1. skupiti sve relevantne .c datoteke, u pravilu su to sve koje ne sadržavaju funkciju main
  2. prevesti .c datoteke u .o objekte: gcc -fpic -c [sve .c datoteke]
  3. prevesti objekte u dijeljenu knjižnicu: gcc -shared –o libimelibraryja.so [sve .o datoteke]

Kako bi opracijski sustav (GNU/Linux) mogao koristiti knjižnice potrebno je ažurirati LD_LIBRARY_PATH dodavajući novu .conf datoteku u /etc/ld.so.conf.d/ direktorij u kojoj se nalazi putanja direktorija u kojemu se nalaze novostvorene knjižnice. Nakon toga potrebno je izvršiti naredbu sudo ldconfig i knjižnica je spremna za uporabu.

Nakon što imamo .so datoteku potrebno je za nju napisati sučelje koje će frontend dio aplikacije moći koristiti. Pošto frontend radimo u Electronu, koji se temelji na node.js-u, za sučeljavanje algoritama koristimo N-API knjižnicu. Drugim riječima, napisali smo C program koji poziva funkcije dijeljenih knjižnica koji smo onda povezali sa ostatkom aplikacije koristeći N-API knjižnicu.

Kako bi N-API znao koristiti naš C program, bilo je potrebno stvoriti binding.gyp datoteku u kojoj navodimo sve parametre prevođenja programa kao i knjižnice koje on koristi. Priličan izazov je bio pronaći funkcionirajuću konfiguraciju binding.gyp datoteke koju možete vidjeti na sljedećoj slici.

binding.gyp

Bitno je spomenuti kako je izuzetno važan redoslijed navođenja atributa “libraries” za svaki pojedini algoritam. Potrebno je to učiniti kao na slici te ukoliko se ne navede tim redoslijedom, sučelje neće funkcionirati.


Frontend

Za ostvarenje grafičkog sučelja koristili smo JavaScript radni okvir Electron u kombinaciji sa Vue radnim okvirom. Electron radni okvir je projekt baziran na Chromium web pregledniku koji se razvija kao zaseban projekt namijenjen za desktop aplikacije. Programiranje u tom radnom okviru svodi se na programiranje u web browseru specifično za jednu interaktivnu web stranicu. Electron nam omogućava da serviramo JS, HTML i CSS resurse direktno s lokalnog diska na računalu domaćinu samome sebi što pruža korisniku osjećaj nativne aplikacije iako se zapravo koristi preglednikom. Razlika je u tome što Electron omogućava programeru bolju integraciju sa operacijskim sustavom korisnika te lakši pristup lokalnom datotečnom sustavu (što bi u klasičnom pregledniku bio sigurnosni rizik). Zato naša aplikacija omogućava da demonstrativno kriptiramo datoteke na lokalnom korisnikovom računalu.

U pozadini Electron poziva nativni NodeJS API (NAPI) za sučeljavanje nativne dijeljene knjižnice (.so za GNU/linux) koje smo prethodno sagradili.

Za jednostavniju modularnu gradnju komponenata naše interaktivne aplikacije koristili smo moderan frontend framework VueJS.

Projekt prevodimo pomoću modernog alata Webpack koji služi za rezoluciju ovisnosti u JavaScript datotekama te okuplja resurse potrebne za ispravno izvođenje koda. Također minificira kod prilikom prevođenja. Nakon prevođenja koda, koristimo electron-builder alat koji iz našeg projekta gradi AppImage (moderan format za distribuciju aplikacija) kako bi svi resursi i aplikacija bili dostupni u samo jednoj izvršnoj datoteci.