Salsa20 este un sistem de criptare a fluxurilor dezvoltat de Daniel Bernstein. Algoritmul a fost prezentat la competiția eSTREAM , al cărei scop a fost crearea unor standarde europene pentru criptarea datelor transmise prin sistemele de poștă. Algoritmul a devenit câștigătorul competiției în primul profil (cifruri de flux pentru aplicații software cu debit mare).
Cifrul Salsa20 utilizează următoarele operații:
Algoritmul folosește o funcție hash cu 20 de cicluri . Transformările sale principale seamănă cu algoritmul AES .
În cele ce urmează, vom numi un element al mulțimii {0,1,…,2 32 −1} cuvânt și îl vom scrie în formă hexazecimală cu prefixul 0x.
Operația de adăugare a două cuvinte modulo 2 32 va fi notată prin semnul " ".
Exclusiv sau (sumare pe biți) va fi notat cu simbolul " "
- biți deplasarea ciclică la stânga a unui cuvânt va fi notat cu . Dacă vă imaginați cum , atunci
Unitatea principală a sistemului este transformarea în patru cuvinte. Transformările mai generale descrise mai jos sunt construite din aceasta.
Esența lui constă în faptul că pentru fiecare cuvânt îi adăugăm pe cele două anterioare, deplasăm (ciclic) suma cu un anumit număr de biți și însumăm bit cu bit rezultatul cu cuvântul selectat. Operațiile ulterioare sunt efectuate cu semnificații noi ale cuvintelor.
Să presupunem că este o secvență de 4 cuvinte, atunci funcția este unde
De exemplu:
sfert(0x00000001; 0x00000000; 0x00000000; 0x00000000)Vă puteți gândi la această funcție ca la o transformare a cuvintelor y 0 , y 1 , y 2 și y 3 . Fiecare dintre aceste transformări este reversibilă, la fel ca și funcția în ansamblu.
rowround(y)
În această transformare luăm 16 cuvinte. Le reprezentăm sub forma unei matrice 4x4. Luăm fiecare rând din această matrice și transformăm cuvintele acestei matrice cu funcția . Cuvintele din rând sunt luate în ordine, pornind de la i -a pentru a i -a linie, unde i = {0,1,2,3}.
Fie o secvență de 16 cuvinte, apoi să fie și o secvență de 16 cuvinte unde
columnround(y)Aici luăm coloanele aceleiași matrice. Să le transformăm cu funcția , prin analogie substituind valorile în ea, pornind de la j -a coloană pentru j -a coloană, unde j = {0,1,2,3}.
Funcția columnround(y)=(z) operează și pe o secvență de 16 cuvinte, astfel încât
doubleround(y)Funcția doubleround(y) este o aplicare secvențială a funcțiilor columnround și apoi rowround : doubleround (y) = rowround(columnround(y))
Salsa20()Acest algoritm folosește o intrare de cuvânt care începe cu octetul mic . Pentru a face acest lucru, iată o transformare
Să fie o secvență de 4 octeți, apoi să fie un cuvânt astfel încât
Transformarea finală este sumarea pe biți a secvenței inițiale și rezultatul a 20 de runde de transformări alternative de coloane și rânduri.
Unde
…x[i] sunt octeții x și x j sunt cuvinte folosite în funcțiile de mai sus.
În cazul în care un
,
atunci Salsa20(x) este succesiunea rezultatelor
Extensia convertește o tastă de 32 sau 16 octeți k și un număr de 16 octeți n într-o secvență de 64 de octeți .
Extensia k folosește constantele
pentru 32 de octeți k și
pentru k de 16 octeți .
Acestea sunt „expand 32-byte k” și „expand 16-byte k” în codul ASCII .
Fie k 0 ,k 1 ,n să aibă secvențe de 16 octeți, atunci .
Dacă avem o singură secvență de 16 octeți k atunci
Cifrarea secvenței de octeți , pentru va fi
— număr unic de 8 octeți (nonce).
Textul cifrat va avea dimensiunea unui octet , la fel ca textul simplu.
Salsa20 k ( v ) este o secvență de 270 de octeți.
Unde este o secvență unică de 8 octeți astfel încât respectiv
Unde
Datorită faptului că transformările fiecărei coloane și ale fiecărui rând sunt independente unele de altele, calculele necesare pentru criptare pot fi ușor paralelizate . Acest lucru oferă un câștig semnificativ de viteză pentru majoritatea platformelor moderne.
Algoritmul nu are, practic, niciun calcul general necesar pentru a rula ciclul de criptare. Acest lucru este valabil și pentru schimbările cheie. Multe sisteme de cifrare se bazează pe precalculări, ale căror rezultate trebuie stocate în memoria cache de prim nivel (L1) a procesorului . Deoarece depind de cheie, calculele vor trebui efectuate din nou. În Salsa20, este suficient să încărcați pur și simplu cheia în memorie.
Salsa20/8 și Salsa20/12 sunt sisteme de criptare care folosesc același mecanism ca Salsa20, dar cu 8 și, respectiv, 12 runde de criptare, în loc de cele 20 inițiale. Salsa20 a fost făcută cu multă putere de rezistență. În timp ce Salsa20/8 arată rezultate bune în viteză, depășind în majoritatea cazurilor multe alte sisteme de criptare, inclusiv AES și RC4 [1] .
Există o variantă a algoritmului Salsa20, propusă și de Daniel Bernstein, care crește lungimea nonce de la 64 de biți la 192 de biți. Această variantă se numește XSalsa20. Dimensiunea crescută a nonce permite utilizarea unui generator de numere pseudo-aleatoare puternic criptografic pentru a- l genera, în timp ce criptarea securizată cu un nonce pe 64 de biți necesită utilizarea unui contor din cauza probabilității mari de coliziuni [2] .
În 2005, Paul Crowley a anunțat un atac asupra Salsa20/5 cu o complexitate de timp estimată la 2165 . Acest atac și atacurile ulterioare se bazează pe criptoanaliza diferențială trunchiată . Pentru această criptoanaliză, el a primit o recompensă de 1.000 de dolari de la autorul cărții Salsa20.
În 2006, Fischer, Meier, Berbain , Biasse și Robshaw au raportat un atac de complexitate 2117 împotriva Salsa/6 și o complexitate 2217 împotriva Salsa20 /7 cu chei conectate .
În 2008, Aumasson, Fischer, Khazaei, Meier și Rechberger au raportat un atac asupra Salsa20/7 cu o dificultate de 2153 și primul atac asupra Salsa20/8 cu o dificultate de 2251 .
Până acum, nu au existat rapoarte publice de atacuri asupra Salsa20/12 și a întregului Salsa20/20.
În 2008, Daniel Bernstein a publicat o familie similară de cifruri de flux numită ChaCha, care urmărea să îmbunătățească amestecarea datelor într-o singură rundă și se presupune că îmbunătățește puterea criptografică la aceeași viteză sau chiar puțin mai mare [3] .
ChaCha20 este descris în RFC 7539 (mai 2015).
Unitatea principală a sistemului funcționează diferit aici. Acum fiecare operație schimbă unul dintre cuvinte. Modificările apar ciclic „în sens opus”, începând de la al 0-lea cuvânt. Operațiile de adunare și suma pe biți alternează odată cu deplasarea, cuvântul se adaugă celui anterior.
Funcția quarterround(a, b, c, d), unde a, b, c, d-cuvinte, în ChaCha arată astfel:
Aici se folosesc aceleași operații aritmetice, dar fiecare cuvânt este schimbat de două ori pe conversie, în loc de o singură dată.
În plus, starea inițială a cifrului (extensia cheii) este schimbată în comparație cu Salsa: primii 128 de biți sunt constante, urmați de 256 de biți ai cheii, 32 de biți ai contorului și apoi 96 de biți dintr-o secvență unică nonce.
Criptosisteme simetrice | |
---|---|
Cifruri în flux | |
Rețeaua Feistel | |
Rețeaua SP | |
Alte |