====== Noise Framework ======
===== Sažetak =====
Noise je radni okvir za izgradnju sigurnih kriptografskih protokola baziranih na Diffie-Hellman razmjeni ključeva. \\
Glavna ideja je da on pruža bazu koju korisnici nadopunjavaju kombiniranjem elemenata skupa osnovnih kriptografskih operacija da bi dobili različita sigurnosna svojstva. To omogućuje stvaranje protokola sa točno onim mogućnostima koje korisnicima trebaju što je idealno za IoT uređaje kojima su potrebni mali i jednostavni protokoli.
Ključne riječi: Noise, Diffie-Hellman, razmjena ključeva, kriptografija
===== Uvod u protokole za razmjenu ključeva =====
Kriptografija je znanstvena disciplina koja se bavi proučavanjem metoda za slanje poruka u obliku da ih samo onaj kome su namijenjene može pročitati. Njezin osnovni zadatak je da omogući dvjema osobama (pošiljatelj i primatelj) da međusobno komuniciraju preko nesigurnog komunikacijskog kanala na način da treća osoba kojoj poruka nije namijenjena, istu ne razumije. Za takav način komuniciranja nerazumljiv trećoj osobi potreban je unaprijed dogovoreni ključ. Kako ključ posjeduje samo osoba (pošiljatelj) koja je poruku šifrirala; potrebno je izvršiti razmjenu ključeva.
Razmjena ključeva je metoda u kriptografiji u kojoj se kriptografski ključevi razmjenjuju između dvije stranke omogućavajući korištenje kriptografskih algoritama kako bi se datoteke mogle poslati sigurno kroz protokole kao što su FTPS, HTTPS i SFTP.
Ako dvije stranke ne mogu uspostaviti sigurnu inicijalnu razmjenu ključeva, tada neće biti u mogućnosti komunicirati privatno bez rizika od presretanja i dešifriranja poruka od treće strane koja je stekla ključ tijekom početne razmjene ključeva.
Prije izuma kriptografije javnim ključem, simetrična kriptografija koristila je jedan ključ i za šifriranje i za dešifriranje.
Kriptografija javnim ključem koristi sistem dva ključa koji se sastoje od javnog i privatnog ključa, gdje se poruke šifriraju jednim, a dešifriraju drugim ključem. Na primjer u RSA javni ključ se koristi za šifriranje, a privatni za dešifriranje.
Dva najpoznatija protokola za razmjenu ključeva su RSA i Diffie-Hellman. Oni su omogućili klijentu i poslužitelju ili poslužitelju i poslužitelju da razmijene kriptografske ključeve kroz nesiguran medij kao što je Internet. U ovom radu će biti naglasak na Diffie-Hellman protokol (ili kraće DH).
==== Diffie-Hellman ====
Diffie-Hellman metoda razmjena ključeva omogućuje dvjema strankama koje nemaju prethodno znanje jedna o drugoj da uspostave zajednički tajni ključ preko nesigurnog kanala. Taj se ključ tada može koristiti za šifriranje budućih komunikacija koristeći algoritam simetričnog ključa.
Ni u kojem trenutku u DH razmjeni ključeva je bilo koja osjetljiva informacija pod rizikom od kompromitacije, kao što je to u slučaju simetrične razmjene ključeva.
Da bi objasnili kako protokol radi, koristit ćemo uobičajena imena u kriptografskoj literaturi: pošiljatelja Anu i primatelja Branka.
Generalni opis protokola:
- Ana i Branko se dogovore oko konačne ciklične grupe **G** stupnja **n** i elementa generatora **g** iz **G**.
- Ana bira nasumičan prirodan broj **a**, gdje je **1 < a < n**, te pošalje broj **ga** Branku.
- Branko bira nasumičan prirodan broj **b**, gdje je **1 < b < n**, te pošalje broj **gb** Ani.
- Ana izračuna **(gb)a**.
- Branko izračuna **(ga)b**.
Sada Ana i Branko oboje imaju element **gab** koji služi kao dijeljeni tajni ključ.
Grupa **G** zadovoljava potreban uvjet sigurne komunikacije jer ne postoji efikasan algoritam za određivanje **gab** uz dane **g**, **ga**, **gb**.
Iako je zadovoljen potreban uvjet, on nije dovoljan za sigurnu komunikaciju.
Kako biti siguran da javni ključ zapravo pripada njegovom navodnom vlasniku budući da je vrlo lako imitirati tuđi identitet? To može biti veliki problem ako se uključeni korisnici nikad nisu susreli i ne znaju ništa jedan o drugome. Nažalost Diffie-Hellman razmjena ključeva ne adresira taj problem.
===== Radni okvir Noise =====
Noise je radni okvir za izgradnju sigurnih kriptografskih protokola baziranih na Diffie-Hellman razmjeni ključeva. Fokusira se specifično na sigurnosne kanale.
Glavna ideja Noise radnog okvira je da on pruža bazu koju korisnici nadopunjavaju kombiniranjem skupa osnovnih kriptografskih operacija da bi dobili različita sigurnosna svojstva. Na taj način se olakšava stvaranje novog protokola korisnicima jer ne moraju raditi protokol od nule. Jedna od primarnih prednosti Noise radnog okvira je da omogućuje stvaranje protokola sa točno onim mogućnostima koje korisniku trebaju kao i analizu prisutnosti tih mogućnosti. U tome pomaže i alat [[https://noiseexplorer.com/|Noise Explorer]] koji automatski analizira uzorke rukovanja te grafički demonstrira razinu sigurnosti u svakom koraku rukovanja.
Noise zahtjeva minimalan skup osnovnih operacija:
* **Algoritam šifriranja** kao što je ChaChaPoly1205 ili AES-GCM
* **Algoritam sažimanja** poput BLAKE2 ili SHA-256
* **Diffie-Hellman funkcije** poput ECDH s Curve25519
Svaki Noise protokol počinje rukovanjem jedinstvenim uzorkom. Tijekom te faze stranke razmjenjuju DH javne ključeve i obavljaju niz DH operacija. Krajnji rezultat rukovanja je šifrirani kanal koji jamči povjerljivost, integritet i autentičnost.
==== Jezgra Noise sustava ====
Jezgra Noise sustava je skup varijabla koje održavaju stranke tijekom faze rukovanja, te pravila slanja i primanja poruka rukovanja dobivenih procesiranjem tokena.
Svaka stranka održava sljedeće varijable:
* s, e -> parovi statičkih i kratkotrajnih ključeva lokalne stranke (mogu biti i prazni)
* r, e -> parovi statičkih i kratkotrajnih ključeva udaljene stranke (mogu biti i prazni)
* h -> vrijednost sažimanja podataka svih rukovanja koja su bila poslana ili primljena
* ck -> lančani ključ koji sažima sve prethodne DH izlaze
* k -> ključ šifriranja dobiven iz ck
Kako se svaki token procesira, tako se i odgovarajuće varijable ažuriraju.
Mogući tokeni su:
* 'e' -> generira se kratkotrajni par ključeva i šalje javni ključ
* 's' -> šalje se dugotrajan statički javni ključ;
* 'ee', 'se', 'es', 'ss' -> obje stranke izvode DH između parova ključeva inicijatora i odgovaratelja
Strelice -> i <- pokazuju smjer slanja.
Uzorak poruke dobiva se iz nekog niza tokena iz skupa {‘e’, ‘s’, ‘ee’, ‘es’, ‘se’, ‘ss’, ‘psk’}.
==== Imenovanje uzoraka ====
Imena uzoraka sastoje se od dva znaka, a označavaju stanje statičkog ključeva inicijatora i odgovaratelja.
Prvi znak odnosi se na statički ključ inicijatora:
* N -> inicijator nema statički ključ
* K -> statički ključ inicijatora poznat je odgovaratelju
* X -> statički ključ inicijatora poslan je odgovaratelju
* I -> statički ključ je inicijatora je odmah poslani odgovaratelju usprkos smanjenom ili odsutnom skrivanju identiteta
Drugi znak odnosi se na statički ključ odgovaratelja:
* N -> odgovaratelj nema statički ključ
* K -> statički ključ odgovaratelja poznat je inicijatoru
* Y -> statički ključ odgovaratelja poslan je inicijatoru
Primjeni nekih imenovanih uzoraka:
^ NN(): ^ XX(ss, rs): ^ KN(s): ^IK(s, rs): ^
| -> e \\ <- e, eez | -> e \\ <- e, ee, s, es \\ -> s, se| -> s \\ ... \\ -> e \\ <- e, ee, se | <- s \\ ... \\ -> e, es, s, ss \\ <- e, ee, se|
U prvom primjeru, uzorak NN opisuje neautentificirano DH rukovanje.
==== Imenovanje protokola ====
Ime protokola započinje prefiksom **Noise_** kojeg slijede četiri sekcije odvoje znakom **_**. Sekcije su redom imena uzorka rukovanja, DH funkcije, funkcije šifriranja i funkcije sažimanja.
Primjeri:
* Noise_XX_25519_AESGCM_SHA256
* Noise_N_25519_ChaChaPoly_BLAKE2s
* Noise_IK_448_ChaChaPoly_BLAKE2b
===== Noise Pipes složeni protokol =====
Do sada se pretpostavljalo da Ana i Branko žele izvršiti jedan Noise protokol izabran od strane inicijatora. Neka to bude Ana. No postoje brojni razlozi zašto bi možda Branko želio zamijeniti protokol s nekim drugim Noise protokolom nakon primitka poruke od Ane.
Na primjer:
* Ana je možda odabrala protokol baziran na šifriranju, DH funkciji, ili rukovanju kojeg Branko ne podržava.
* Ana je možda poslala zero-RTT šifriranu inicijalnu poruku baziranu na zastarjeloj verziji Brankovog statičkog javnog ključa.
Rješavanje takvog scenarija zahtjeva složeni protokol gdje se Branko prebacuje s inicijalnog Noise protokola odabranog od Ane u novi Noise protokol. U takvom složenom protokolu role inicijatora i odgovaratelja bi bile obrnute. Branko bi postao inicijator novog Noise protokola, a Ana odgovaratelj.
Složeni protokoli uvode kompleksnost budući da Ana treba objaviti Noise protokol s kojim počinje i Noise protokole u koje se može prebaciti, a obje stranke moraju ugovoriti sigurnu tranziciju.
Tipični složeni protokol za zero-RTT šifriranje uključuje tri različita Noise protokola:
* Potpuni protokol je korišten ako Ana ne posjeduje pohranjene informacije o Branku koje bi omogućile zero-RTT šifriranje, ili se jednostavno ne želi koristiti zero-RTT rukovanje.
* Zero-RTT protokol koji omogućuje šifriranje podataka u inicijalnoj poruci.
* Zamjenski protokol koji je aktiviran ako Branko ne može dešifrirati Aninu prvu zero-RTT rukovanje poruku.
Noise Pipes podržava sve iznad navedene slučaje, a sljedeća rukovanja ga definiraju:
XX uzorak je korišten za potpuno rukovanje ako obje stranke nisu komunicirale nikad prije, nakon čega će Ana zapamtiti Brankov statički javni ključ.
XX:
-> e
<- e, ee, s, es
-> s, se
IK uzorak korišten je za zero-RTT rukovanje.
IK:
<- s
...
-> e, es, s, ss
<- e, ee, se
XXfallback je rezervni uzorak korišten za obrnuto rukovanje ako Branko ne uspije dešifrirati početnu IK poruku (recimo ako je promijenio svoj statički ključ).
XXfallback:
-> e
...
<- e, ee, s, es
-> s, se
==== Svojstva Noise Pipes složenog protokola ====
Dane su sljedeće definicije: \\
**Noise Boxes** – zaštićene zasebne poruke (slično kao PGP, NaCl, itd.) \\
**Noise Pipes** – zaštićene interaktivne sjednice (slično kao SSL, SSH, CurveCP, itd.)
Noise Pipes nadograđuje Noise Boxes protokol, pa nasljeđuje sva njegova svojstva:
* Nakon šifriranja Noise boxa, samo ga primatelj može dešifrirati (pošiljatelj ne može).
* Primatelj Noise boxa može autentificirati pošiljatelja, ali ne može producirati digitalno potpisan dokaz koji veže pošiljatelja uz bilo što.
* Noise Boxes ne otkrivaju informacije o pošiljatelju ili primatelju nekom trećem posmatraču.
* Noise šifrirani tekstovi mogu biti nadopunjeni kako bi se izbjeglo curenje dužine nešifriranog teksta.
* Bilo kakvo mijenjanje šifriranog teksta uzrokovat će da primatelj odbaci šifrirani tekst prije dešifriranja (Encrypt-then-MAC šifriranje).
Te dodaje nekoliko novih:
* Efikasno rukovanje: troškovi operacije rukovanja slični su protokolima sa sličnim svojstvima (npr. SIGMA-I).
* Kompromitacija dugoročnih privatnih ključeva ne kompromitira stare Noise Pipes sjednice.
* Čak i ako je privatni ključ jedne stranke kompromitiran, ta stranka i dalje može verificirati identitete ostalih stranaka.
===== Zaključak =====
Sigurna razmjena ključeva prvi je važan korak za sigurnu i privatnu komunikaciju više različitih stranaka.
Protokoli poput TLS, IPsec i SSH razvijani su veliki broj godina i zbog njihove kompleksnosti teško ih je nadograđivati s novim kriptografskim funkcionalnostima koje se svakodnevno pojavljuju.
Uz veliku popularnost Internet svari, raste potreba za malim i jednostavnim protokolima koji se mogu prilagoditi individualnim potrebama.
Implementacija novog protokola uvijek je morala ići od nule što bi zahtijevalo puno posla. Taj posao bi bio ponavljajući budući da su mnogi elementi poput izvedbe ključa, potvrde ključa, analize sigurnosti, modela sigurnosti, dokaza sigurnosti, i dr., jednaki svima.
Noise se pojavio 2015. godine, i rješava upravo te probleme.
Sastoji se od dobre stabilne jezgre kojoj se dodaju nove forme kriptografije, male zajednice, web stranice, specifikacije, kolekcije testova, biblioteka otvorenog koda te podrške za mnoštvo popularnih jezika.
Zbog gore navedenih stvari, Noise ispada kao odličan izbor za ljude koji žele nešto jednostavno i efikasno, a opet sigurno.
Njegov potencijal prepoznaje sve više kompanija koje ga koriste za vlastite projekte:
* [[https://www.wireguard.com/|WireGuard]] - za uspostavu šifriranih kanala između klijenata
* [[https://signal.org/|WhatsApp]] - za šifriranje komunikacije između klijenta i poslužitelja
* [[https://github.com/slackhq/nebula|Slack Nebula projekt]], [[https://lightning.network/|The Lightning Network]], [[https://geti2p.net/en/|I2P]], i drugi.
===== Literatura =====
[1] [[https://en.wikipedia.org/wiki/Key_exchange|Key exchange]]
[2] [[https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange|Diffie-Hellman key exhange]]
[3] [[https://github.com/noiseprotocol/noise_spec/wiki|Noise protocol]]
[4] [[https://noiseprotocol.org/noise.html|Trevor Perrin, The Noise Protocol Framework]]
[5] [[https://duo.com/labs/tech-notes/noise-protocol-framework-intro|Nick Mooney, An Introduction To the Noise Protocol Framework]]