cripta | |
---|---|
Prima publicat | mai 2009 |
scrypt (citește es-crypt [1] ) este o funcție adaptivă de derivare a cheilor criptografice bazată pe parolă creată de ofițerul de securitate FreeBSD Colin Percival pentru sistemul de stocare de rezervă Tarsnap . Funcția este concepută astfel încât să complice atacul cu forță brută folosind FPGA . Calculul său necesită o cantitate semnificativă de memorie cu acces aleatoriu . La 17 septembrie 2012, algoritmul scrypt a fost publicat de IETF sub forma unui Internet Draft , acesta este planificat să fie inclus în RFC [2] . Este folosit, de exemplu, ca dovadă a muncii depuse în criptomoneda Litecoin [3] .
Funcțiile de derivare a cheilor bazate pe parole ( PBKDF ) sunt de obicei concepute pentru a necesita timpi de calcul relativ lungi (de ordinul mărimii, sute de milisecunde). Atunci când este utilizat de un utilizator legal, este necesar să se calculeze o astfel de funcție o dată (de exemplu, în timpul autentificării) și un astfel de timp este acceptabil. Dar într-un atac cu forță brută , atacatorul trebuie să efectueze miliarde de calcule de funcții, iar complexitatea sa de calcul face ca atacul să fie mai lent și mai costisitor.
Cu toate acestea, PBKDF-urile timpurii (de exemplu , PBKDF2 dezvoltat de RSA Laboratories ) sunt relativ rapid de calculat și pot fi implementate eficient pe hardware specializat ( FPGA sau ASIC ). Această implementare vă permite să lansați atacuri paralele de forță brută la scară largă, de exemplu, folosind sute de instanțe de funcție în fiecare cip FPGA.
Funcția scrypt a fost concepută pentru a face implementările hardware mai complexe prin creșterea cantității de resurse necesare pentru calcul. Acest algoritm folosește o cantitate semnificativă de RAM (memorie cu acces aleatoriu) în comparație cu alte PBKDF. Memoria din scrypt este folosită pentru a stoca un vector mare de secvențe de biți pseudo-aleatorie generate la începutul algoritmului [4] . Odată ce un vector a fost creat, elementele sale sunt interogate într-o ordine pseudo-aleatoare și combinate între ele pentru a obține o cheie. Deoarece algoritmul de generare a vectorului este cunoscut, este posibil să se implementeze scrypt, care nu necesită memorie, dar calculează fiecare element în momentul accesării. Cu toate acestea, calcularea unui element este relativ complexă și fiecare element este citit de multe ori în timpul funcției scrypt. scrypt are un astfel de echilibru între memorie și timp, încât implementările non-memory sunt prea lente.
scrypt (P, S, N, r, p, dkLen) = MFcrypt HMAC SHA256,SMix r (P, S, N, p, dkLen)
unde N, r, p sunt parametri care specifică complexitatea calculului funcției.
MFcrypt este definit astfel: DK = MFcrypt PRF,MF (P, S, N, p, dkLen)
Unde
Parametrii de intrare scrypt și MFcrypt:
Funcția MFcrypt funcționează conform algoritmului:
Consumul de memorie este estimat la 128*r*N octeți [5] . Raportul dintre numărul de citiri și scrieri în această memorie este estimat la 100% și 63% [6] .
Parametrii scrypt recomandați: N = 16384, r = 8, p = 1 (consum de memorie - aproximativ 16 MB) [5] [6] .
Viteza de calcul pentru o singură operațiune de criptare pe un procesor de uz general este de aproximativ 100 de milisecunde atunci când este configurată pentru a utiliza 32 MB de memorie. Când se setează la o durată de 1 milisecundă, se folosește prea puțină memorie și algoritmul devine mai slab decât algoritmul bcrypt , care este setat la o viteză comparabilă [7] .
Criptomoneda Litecoin folosește următorii parametri scrypt: N = 1024, r = 1, p = 1, dimensiunea parametrului de intrare și sare este de 80 de octeți, dimensiunea DK este de 256 de biți (32 de octeți) [8] . Consumul de RAM este de aproximativ 128 KB. Calculul unui astfel de scrypt pe plăcile video este de aproximativ 10 ori mai rapid decât pe procesoarele de uz general [6] , ceea ce este un indiciu al alegerii unor parametri insuficient de puternici [7] .
Implementări:
Funcții hash | |
---|---|
scop general | |
Criptografic | |
Funcții de generare a cheilor | |
Numărul de verificare ( comparație ) | |
Hashes |
|