ChaCha20 algoritam i Poly1305 autentifikator

Izvor: SIS Wiki
Skoči na: orijentacija, traži
Encryption.png

Kreirao: Martin Oslić



Sadržaj

Uvod

ChaCha20 i Poly1305 autentifikator zajedno predstavljaju AEAD - Authenticated Encryption with Additional Data cipher. Važna stvar kod AEAD-a je to da on podržava dvije različite operacije: seal i open. Drugi slični AEAD koji se upotrebljava za TLS veze je AES-GCM. AES (Advanced Encryption Standard) je postao temeljni standard vezan za enkripciju, a sve zahvaljujući njegovom učinkovitom dizajnu, implementaciji i hardverskoj podršci. Sve navedeno omogućilo je da ovaj kriptografski algoritam za zaštitu digitalnih podataka pruži visoke performanse u mnogim područjima. Osnovna zadaća AES algoritma je nasljeđivanje DES algoritma čije osnovne karakteristike danas više ne zadovoljavaju razvijene kriptografske sustave. Važno je napomenuti kako je AES od četiri do deset puta brži od DES algoritma (prethodnik AES-a) što ga ne čini jedinim najboljim rješenjem, ali ga svrstava u skupinu jedinog praktičnog rješenja. Može se reći kako je AES postao globalni standard za komercijalni i open source softver te za hardver. Koriste ga mnogobrojne institucije i pojedinci u cijelom svijetu.

ChaCha20 je algoritam velike brzine koji je oko tri puta brži od AES algoritma u softverskim implementacijama kojima nedostaje specijalizirani AES hardver. Također, prednost ovog algoritma je da nije osjetljiv na napade kod kojih napadači pokušavaju kompromitirati kripostustav na način da analiziraju vrijeme koje je potrebno za izvršavanje kriptografskog algoritma (Timing attack). Drugi algoritam koji se ovdje spominje je Poly1305 koji predstavlja algoritam velike brzine za autentifikaciju poruke. Ova dva algoritma zajedno tvore autentificiranu enkripciju s pridruženim podacima (ChaCha20 - Poly1305).

AEAD (Authenticated Encryption with Additional Data cipher)

U uvodnom dijelu je pojašnjeno kako AEAD podržava dvije bitne operacije - „seal“ i „open“. „Seal“ operacija prima četiri različita ulazna parametra:



U nastavku su pojašnjeni navedeni ulazni parametri AEAD algoritma koji kombinira ChaCha20 i Poly1305 autentifikator. Prvi parametar je poruka koja mora biti kriptirana i predstavlja čisti tekst. Zatim tajni ključ, jedinstvena inicijalizirana vrijednost te ostali pridruženi podaci. Jedinstvena inicijalizirana vrijednost je još poznata kao „IV“, a pridruženi podaci podrazumijevaju podatke koji neće biti kriptirani ali će biti autentificirani (to se odnosi na 'AD' u nazivu AEAD-a). Obzirom na ulazne parametre „seal“ operacija koristi tajni ključ i IV kako bi kriptirala poruku u šifrirani tekst jednake duljine, koristeći pri tome temeljni algoritam. Za AEAD tipa ChaCha20-Poly1305 taj algoritam je ChaCha20, a za AEAD tipa AES-GCM kriptografski algoritam je AES. Nakon što su podaci kriptirani ista operacija opcionalno koristi IV kako bi generirala sekundarni ključ. Sekundarni ključ se koristi kako bi generirao hash od AD-a, šifrirani tekst te individualna duljinu svakog od njih. Hash koji se koristi kod AEAD-a tipa ChaCha20-Poly1305 je Poly1305, a kod AEAD-a tipa AES-GCM je GHASH autentifikator poruka. Posljednji korak je kriptirati hash vrijednost, generirati finalni MAC (Message Authentication Code) i dodati ga već šifriranom tekstu. Druga operacija je „open“ koja predstavlja obrnutu „seal“ operaciju. Dakle, ona uzima isti tajni ključ i IV te generira MAC od kriptiranog texta i AD-a. Zatim čita MAC uključen nakon kriptiranog teksta i uspoređuje ih. Ukoliko se ispostavi bilo kakva razlika u MAC vrijednostima to bi značilo da su kriptirani tekst ili autentificirani podaci (AD) neovlašteno promijenjeni i označavaju se nesigurnim. S druge strane, ako se MAC vrijednosti podudaraju „open“ operacija dekriptira šifrirani tekst i vraća originalnu poruku. Slijedeća fotografija prikazuje blok dijagram "seal" operacije.


AEAD seal.jpg

ChaCha20

ChaCha20 je varijanta 'Salsa20' algoritma objavljena 2008. godine od strane Daniel Julius Bernstein-a, njemačko - američkog matematičara, kriptografa, programera i profesora. Nadalje, Google je odabrao ChaCha20 zajedno s Bernsteinovim kodom za autentifikaciju poruke - Poly1305 kao zamjenu za RC4 u TLS protokolu, koji se koristi za internetsku sigurnost. Google je takav način sigurnosti implementirao za kontrolu prometa između Chrome preglednika na Android mobilnim uređajima i Google web stranica. Također, nedugo nakon toga primjena ovih algoritama iskorištena je za novi kod u OpenSSH paketu sigurnosnih servisa na mreži.


The ChaCha Quarter Round

Osnovna operacija ChaCha algoritma je "Quarter Round". Navedena operacija se izvršava na 32 - bitnim integerima (a, b, c, d).


a += b; d ^= a; d <<<= 16;
c += d; b ^= c; b <<<= 12;
a += b; d ^= a; d <<<= 8;
c += d; b ^= c; b <<<= 7;


U prethodnom primjeru "^" označava ekskluzivni "ILI" (XOR), a "<<<=n" označava n - bitnu lijevu rotaciju.

Funkcija Quarter round implementirana je u konzolnoj aplikaciji - C#. U nastavku je prikazana glavna funkcija koja služi za izračun quarter round-a. Testni podaci su korišteni iz dokumenta - sekcija 2.1.1. Funkcija prima testni vektor, odnosno ulazni parametri funkcije su četiri integera tipa 'UInt32'. Nakon toga su provedene operacije zbrajanja, operacija ekskluzivni ILI te operacije pomicanja bitova u lijevo. Vidljivo je kako se podaci iz primjera i rezultat implementacije poklapaju što znači da je implementacija uspješno provedena.

QuarterRoundChaCHa.jpg
Quarter round.jpg

ChaCha's Matrix

ChaCha kao i Salsa20 koristi 4 x 4 matricu. Dakle, ChaCha algoritam nema četiri broja (integer) već ima 16 brojeva (integera). No, "quarter round" funkcija radi na samo četiri od njih. U nastavku se nalazi primjer ChaCha matrice u kojoj se "quarter round funkcija poziva na elemente označene s "*", a ostale ne dira - QUARTERROUND(a, b, c, d).

   0 1 *a 3
   4 5 *b 7
   8 9 *c 11
 12 13 *d 15

ChaCha quarter round bolje kodira podatke od prethodnika - Salsa20 quarter round. Razlog je taj što se svaka riječ ažurira dva puta i svaka riječ ima priliku utjecati na još tri. Stoga, to čini ChaCha20 algoritam u praksi malo sigurnijim od Salsa20 algoritma. U nastavku je prikaz primjene Quarter round funkcije na ChaCha matricu. Implementacija je provedena na način da program generira matricu tipa 4x4. Odnosno generira se niz slučajnih brojeva koji se u konačnici pretvaraju u hex zapis i prikazuju na zaslonu. Nakon toga omogućeno je da korisnik unese četiri različite pozicije nad kojima želi izvršiti Quarter round funkciju. Slika u nastavku prikazuje izvršavanje Quarter round funkcije na odabranim pozicijama: '0', '2', '8', '10'.

ChaChaMatrix.jpg

ChaCha's Block Function

Blok funkcija ChaCha algoritma temelji se na izvršavanju "Quarter round" funkcije više puta. Ulazni parametri blok funkcije su 256-bitni ključ i IV vektor koji se tretiraju kao povezani 32-bitni integeri (misli se na pojedinačnu povezanost parametara). Treći ulazni parametar je 32-bitni brojač blokova. Obzirom na ulazne parametre početna ChaCha matrica (4x4) postavljena je tako da su prva četiri sloga konstante:

 0x61707865
 0x3320646e
 0x79622d32
 0x6b206574

Slijedećih osam slogova uzima se iz 256-bitnog ključa tako da se bajtovi čitaju u "little-endian" poretku. Dvanaesti slog je brojač blokova, a posljednja tri sloga predstavlja IV vektor. IV vektor se ne smije ponavljati za isti ključ. Trinaesti slog je prvih 32-bita ulaznog IV vektora uzete u "little-endian" poretku, a posljednji slog su zadnjih 32 bita IV vektora. U nastavku je prikaz početne ChaCha matrice obzirom na ulazne parametre.

 c - konstanta 
 k - ključ 
 b - brojač blokova 
 n - nonce (IV)
 cccccccc   cccccccc   cccccccc   cccccccc
 kkkkkkkk   kkkkkkkk   kkkkkkkk   kkkkkkkk
 kkkkkkkk   kkkkkkkk   kkkkkkkk   kkkkkkkk
 bbbbbbbb   nnnnnnnn   nnnnnnnn   nnnnnnnn

ChaCha blok funkcija izvršava Quarter - round dvadesetak puta. Deset ponavljanja izvršava na stupcima matrice, a preostalih deset odnosi se na dijagonale vrijednosti. Na kraju zadnje operacije dobivena matrica se zbraja s početnom matricom nad kojom je izvršen blok Quarter round operacija te se njihov rezultat sekvencijalno serijalizira u "little-endian" redoslijedu. U nastavku se nalazi pseudokod ChaCha20 block funkcije.

  quarter_funkcija(matrica):
     QUARTERROUND(matrica, 0, 4, 8, 12)
     QUARTERROUND(matrica, 1, 5, 9, 13)
     QUARTERROUND(matrica, 2, 6, 10, 14)
     QUARTERROUND(matrica, 3, 7, 11, 15)
     QUARTERROUND(matrica, 0, 5, 10, 15)
     QUARTERROUND(matrica, 1, 6, 11, 12)
     QUARTERROUND(matrica, 2, 7, 8, 13)
     QUARTERROUND(matrica, 3, 4, 9, 14)
  end
  ChaCha20_blok_funkcija(k, c, n):
     početna_matrica = konstante | ključ | blok_brojač | nonce(iv)
     radna_matrica = početna_matrica
     for i=1 do 10
        quarter_funkcija(radna_matrica)
        end
     početna_matrica += radna_matrica
     return serlialize(početna_matrica)
     end

ChaCha20 Encryption Algorithm

ChaCha20 poziva prethodno objašnjenu ChaCha20 blok funkciju koja ima isti ključ i nounce parametar, a uz navedeno uzastopno povećava parametar - brojač blokova. Nakon toga ChaCha20 provodi serijalizaciju početnih parametara tako da brojeve zapiše u "little-endian" redoslijedu što rezultira kreiranjem keystream bloka. Spajanjem uzastopnih blokova formira se keystream kojeg ChaCHa20 funkcija XOR-a zajedno s čistim tekstom. Ulazni parametri ChaCha20 su: 256 - bitni ključ, 32 - bitni brojač (obično je 0 ili 1), 96 - bitni nounce (inicijalizacijski vektor) i tekst proizvoljne duljine.

S druge strane, izlaz predstavlja kriptirana poruka ili "ciphertext" iste duljine. 'Dekriptiranje je slično kao i kriptiranje. ChaCha20 blok funkcija se koristi kako bi iz ključa dobila keystream blok koji je XOR-an sa kriptiranom porukom te se na kraju vraća prvobitna nešifrirana poruka.

U nastavku je prikazan jedan primjer rezultata ChaCha20 kriptiranja.

Prva matrica prikazuje početno stanje nakon što su dodane konstante, ključ, brojač i IV.

      61707865  3320646e  79622d32  6b206574
      03020100  07060504  0b0a0908  0f0e0d0c
      13121110  17161514  1b1a1918  1f1e1d1c
      00000001  00000000  4a000000  00000000

Nakon toga generiraju se nove matrice obzirom da se ChaCha20 funkcija u pseudokodu algoritma poziva dva puta. Nakon što se funkcija pozove drugi put matrica izgleda ovako:

      9f74a669  410f633f  28feca22  7ec44dec
      6d34d426  738cb970  3ac5e9f3  45590cc4
      da6e8b39  892c831a  cdea67c1  2b7e1d90
      037463f3  a11a2073  e8bcfb88  edc49139

Upravo ta matrica predstavlja finalni blok nakon kojeg se generira keystream. Krajnji rezultat je obavljanje XOR operacije keystream-a sa željenim tekstom. Šifrirana poruka prikazana je u nastavku.

 000  6e 2e 35 9a 25 68 f9 80 41 ba 07 28 dd 0d 69 81  n.5.%h..A..(..i.
 016  e9 7e 7a ec 1d 43 60 c2 0a 27 af cc fd 9f ae 0b  .~z..C`..'......
 032  f9 1b 65 c5 52 47 33 ab 8f 59 3d ab cd 62 b3 57  ..e.RG3..Y=..b.W
 048  16 39 d6 24 e6 51 52 ab 8f 53 0c 35 9f 08 61 d8  .9.$.QR..S.5..a.
 064  07 ca 0d bf 50 0d 6a 61 56 a3 8e 08 8a 22 b6 5e  ....P.jaV....".^
 080  52 bc 51 4d 16 cc f8 06 81 8c e9 1a b7 79 37 36  R.QM.........y76
 096  5a f9 0b bf 74 a3 5b e6 b4 0b 8e ed f2 78 5e 42  Z...t.[......x^B
 112  87 4d                                            .M

Poly1305

Poly1305 slovi brzim, sigurnim i jednostavnim autentifikatorom. Autor ovog algoritma je Daniel J. Bernstein koji je identificirao nekoliko bitnih značajka ovog algoritma:

  Garantira sigurnost ako je AES siguran
  Zamijenjivost šifre
  Izuzetno velika brzina
  Paralelizabilnost i inkrementalnost
  Nema zahtjeva za intelektualno vlasništvo

Ovaj autentifikator generira MAC (Message Authentication Code) koristeći pri tome poruku i jednokratni ključ. Ključ je podijeljen u dva dijela: "r" i "s". Par (r,s) mora biti jedinstveno i mora biti nepredvidiv za svaki poziv, dok "r" može biti konstanta, ali se prije uporabe mora mijenjati kako je prikazano u nastavku. Zahtijeva se da r[3], r[7], r[11], i r[15] imaju svoja gornja četiri bita manja od 16, dok r[4], r[8], i r[12] trebaju imati donja dva bita djeljiva s 4.

Dio ključa "s" treba biti nepredvidiv, ali je poželjno i prihvatljivo da se svaki put oba dijela "r" i "s" generiraju kao jedinstveni. Spomenuto je kako su ulazni parametri Poly1305 algoritma 256 - bitni ključ i poruka proizvoljne duljine. Obzirom na ulazne parametre izlaz je 128 - bitna oznaka.

Prvi korak kod Poly1305 algoritma je postavljanje dio vrijednosti ključa - "r". Nakon toga je potrebno postaviti konstantu "P" koja treba biti oblika 2^n-q pri čemu je q jako mali broj (manji od 10). Jedan od najboljih kandidata je 2¹³⁰ - 5: 3fffffffffffffffffffffffffffffffb. Ovaj broj odabran je jer je 5 mali broj koji omogućuje varanje modularne redukcije, a drugi razlog je što je 2¹³⁰ - 5 malo veći od 2^128, što dopušta jako lijepo kodiranje poruke. Također, varijablu "accumulator" je potrebno postaviti na 0. Slijedeći korak je podijeliti poruku u 16-bitne blokove, postoji mogućnost da je posljednji blok kraći od prethodnih. Posljednji korak je dodavanje tajnog dijela ključa "s" u varijablu "accumulator" i najmanjih 128 bitova je serijalizirano u "little-endian" redoslijedu kako bi se formirala oznaka.

ChaCha20 - Poly1305

Kod Poly1305 autentifikatora je prihvatljivo da se jednokratni ključ generira slučajno. Kombiniranje ChaCha20 i Poly1305 omogućava da se putem ChaCha20 funkcije generira par ključeva (r,s). Potrebno je pozvati blok funkciju sa slijedećim parametrima:

  Kao 256 - bitni ključ za integraciju sesije se koristi ChaCha20 ključ
  Brojač blokova je postavljen na 0
  Protokol specificira 96 - bitni ili 64 - bitni inicijalizacijski vektor (IV) koji mora biti jedinstven kod pozivanja vezanog za isti ključ. 
  Dobre metode koje se preporučaju za generiranje ovog vektora su brojač ili LFSR (Linear Feedback Shift Register) metoda.

Nakon izvršavanja blok funkcije rezultat je 512 - bitno stanje. Prvih 256 bitova ili serializacija stanja se koristi kao jednokratni Poly1305 ključ (prvih 128 bitova koristi se za "r", a ostalih 128 se koristi za "s"). Preostalih 256 bitova se odbacuje. Primjer se nalazi u nastavku.

Ključ:

 000  80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f  
 016  90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f 

IV vektor (nonce):

 000  00 00 00 00 00 01 02 03 04 05 06 07              

Početna ChaCha matrica nakon postavljanja ključa, IV i brojača:

        61707865  3320646e  79622d32  6b206574
        83828180  87868584  8b8a8988  8f8e8d8c
        93929190  97969594  9b9a9998  9f9e9d9c
        00000000  00000000  03020100  07060504

ChaCha matrica nakon izvršavanja ChaCha blok funkcije:

        8ba0d58a  cc815f90  27405081  7194b24a
        37b633a8  a50dfde3  e2b8db08  46a6d1fd
        7da03782  9183a233  148ad271  b46773d1
        3cc1875a  8607def1  ca5c3086  7085eb87

Izlaz:

 8a d5 a0 8b 90 5f 81 cc 81 50 40 27 4a b2 94 71
 a8 33 b6 37 e3 fd 0d a5 08 db b8 e2 fd d1 a6 46  

Ovaj izlaz je ujedno i 32-bitni jednokratni ključ korišten za Poly1305.

Konstrukcija AEAD-a

AEAD je autentificirana enkripcija s pridruženim podacima. Ulazni parametri ovog algoritma su:

  256 - bitni ključ
  96 - bitni inicijalizacijski vektor (IV)
  Poruka / tekst proizvoljne duljine
  Pridruženi podaci proizvoljne duljine (AAD)

Zanimljivo je kako neki protokoli nemaju IV duljine 96 - bitova. Jedan od takvih primjera je protokol IPsec (protokol za uspostavu sigurne komunikacije između računalnih sustava). Spomenuti protokol ima 64 - bitni IV. U takvim slučajevima se zahtijeva da taj protokol u svojoj dokumentaciji ima definirano kako će pretvoriti IV u 96 - bitni vektor. Jedna od mogućnosti je dodavanje konstantne vrijednosti.

Gledajući ChaCha20 i Poly1305 oni su ukomponirani u AEAD koji koristi 256 - bitni ključ i 96 - bitni IV vektor. Na samom početku, generiran je jednokratni 256 - bitni Poly1305 ključ i IV vektor korištenjem ChaCha20 algoritma. Nakon toga poziva se ChaCha20 funkcija koja kriptira poruku koristeći isti ključ i IV vektor koji je prethodno generiran. Uz to, vrijednost brojača postavlja se na 1.

Konačno, Poly1305 funkcija se poziva sa Poly1305 ključem i konstruiranom porukom koja sadrži:

  Pridružene podatke
  Padding1 - do 15 (zero) bajtova i donosi ukupnu dužinu sve do integralnog višekratnika 16
  Šifrirani tekst
  Padding2 - do 15 (zero) bajtova i donosi ukupnu dužinu sve do integralnog višekratnika 16
  Dužinu pridruženih podataka u oktetima (kao 64-bitni integeri u "little-endian" poretku)
  Dužinu šifriranog teksta u oktetima (kao 64-bitni integeri u "little-endian" poretku)

Izlaz AEAD-a:

  Šifrirani tekst iste duljine kao i početna poruka
  128 - bitna oznaka koja predstavlja izlaz Poly1305 funkcije

Dekpriptiranje je slično kao i kriptiranje samo što sadrži neke razlike.

  Prva je što je uloga šifriranog teksta i početne poruke obrnuta. Primjenjuje se ChaCha20 funkcija šifriranja na šifrirani tekst kako 
  bi se došlo do početne poruke. 
  
  Poly1305 funkcija se još primjenjuje na pridruženim podacima i šifriranom tekstu, ali se ne primjenjuje na početnoj poruci.
  
  Izračunata oznaka se uspoređuje s primljenom oznakom. Poruka je prikazana jedino ukoliko se te dvije oznake podudaraju. 
  U suprotnom se rezultat smatra nepouzdanim i nesigurnim.

Literatura

1. CloudFlare. (2016). It takes two to ChaCha (Poly) Dostupno 3.2.2018. godine na linku https://blog.cloudflare.com/it-takes-two-to-chacha-poly/
2. Cr.yp.to. (2008). The ChaCha family of stream ciphers. Dostupno 2.2.2018. godine na linku https://cr.yp.to/chacha.html
3. Cr.yp.to. (2008). The Poly1305-AES message-authentication code. Dostupno 5.2.2018. godine na linku http://cr.yp.to/mac/poly1305-20050329.pdf
4. Daniel J. Bernstein. (2008). ChaCha, a variant of Salsa20 Dostupno 2.2.2018. godine na linku https://cr.yp.to/chacha/chacha-20080128.pdf
5. Internet Research Task Force. (2015). ChaCha20 and Poly1305 for IETF Protocols. Dostupno 30.1.2018. godine na linku https://tools.ietf.org/html/rfc7539
6. Internet Engineering Task Force. (2015). ChaCha20, Poly1305, and Their Use in the Internet Key Exchange Protocol (IKE) and IPsec. Dostupno 30.1.2018. godine na linku https://tools.ietf.org/html/rfc7634
7. Loup. (2017). The Design of ChaCha20. Dostupno 1.2.2018. godine na linku http://loup-vaillant.fr/tutorials/chacha20-design

Osobni alati
Imenski prostori
Inačice
Radnje
Orijentacija
Traka s alatima