Salsa20

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 2 aprilie 2015; verificarea necesită 31 de modificări .

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 .

Descrierea algoritmului

Concepte

Î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

Funcții utilizate în algoritm

quarterround(y)

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)
= (0x08008145; 0x00000080; 0x00010200; 0x20500000)

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

Extensie cheie pentru Salsa20

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

Funcția de criptare Salsa20

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

Performanță

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.

Variante Salsa20/8 și Salsa20/12

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

Varianta XSalsa20

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

Criptanaliză

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

ChaCha

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

Note

  1. Copie arhivată . Consultat la 11 noiembrie 2010. Arhivat din original pe 15 decembrie 2017.
  2. Copie arhivată . Consultat la 13 septembrie 2016. Arhivat din original la 18 septembrie 2018.
  3. Copie arhivată . Consultat la 11 noiembrie 2010. Arhivat din original pe 2 mai 2018.

Link -uri