Algoritmul Yarrow este un generator de numere pseudoaleatoare, sigur din punct de vedere criptografic . Ca nume a fost aleasă șoricelul , ale cărui tulpini uscate servesc ca sursă de entropie în divinație [1] .
Algoritmul a fost dezvoltat în august 1999 de Bruce Schneier , John Kelsey și Niels Ferguson de la Counterpane Internet Security.[2] . Algoritmul nu este brevetat și nu este gratuitși nu este necesară nicio licență pentru a-l folosi . Yarrow este inclusă în februarie2002 cuFreeBSD , OpenBSD și Mac OS X ca implementare a dispozitivului /dev/random [3] .
Dezvoltarea ulterioară a lui Yarrow a fost crearea de către Fergus și Schneier a algoritmului Fortuna , descris în cartea lor „Practical Cryptography” [4] .
Majoritatea aplicațiilor criptografice moderne folosesc numere aleatorii. Ele sunt necesare pentru a genera chei , pentru a obține numere aleatoare unice , pentru a crea o sare etc. Dacă numerele aleatoare sunt nesigure, atunci aceasta implică apariția unor vulnerabilități în aplicații care nu pot fi închise folosind diverși algoritmi și protocoale [5] .
În 1998, creatorii Yarrow au efectuat cercetări asupra altor PRNG -uri și au identificat o serie de vulnerabilități în ele. Secvențele de numere aleatorii pe care le-au produs nu erau sigure pentru aplicațiile criptografice [5] .
În prezent, algoritmul Yarrow este un generator de numere pseudo-aleatoare foarte sigur. Acest lucru vă permite să îl utilizați pentru o gamă largă de sarcini: criptare , semnătură electronică , integritatea informațiilor etc. [5] .
În timpul dezvoltării algoritmului, creatorii s-au concentrat pe următoarele aspecte [6] :
Algoritmul Yarrow este format din 4 părți independente [7] :
Acumularea de entropie este un proces în care un PRNG dobândește o nouă stare internă de neghicit [8] . În acest algoritm, entropia este acumulată în două grupuri: rapid și lent [9] . În acest context, un pool este un depozit de biți inițializați și gata de utilizare. Piscina rapidă oferă complicații cheie frecvente . Acest lucru asigură că compromisul cheie are o durată scurtă. Piscina lentă oferă complicații cheie rare, dar semnificative. Acest lucru este necesar pentru a se asigura că se obține o complicație sigură chiar și în cazurile în care estimările entropiei sunt mult supraestimate. Eșantioanele de intrare sunt trimise alternativ la pool-urile rapide și lente [10] .
Mecanismul de complicareMecanismul de complicație conectează stocarea entropiei cu mecanismul de generare. Atunci când mecanismul de control al complexității determină că este nevoie de complexitate, atunci motorul de complexitate, folosind informații din unul sau ambele grupuri, actualizează cheia care este utilizată de mecanismul de generare. Astfel, dacă atacatorul nu cunoaște cheia sau pool-urile curente, atunci cheia îi va fi necunoscută după complicație. De asemenea, este posibil ca complexitatea să necesite o cantitate mare de resurse pentru a minimiza succesul unui atac pe baza ghicirii valorilor de intrare [11] .
Pentru a genera o nouă cheie , complexitatea pool-ului rapid utilizează cheia curentă și hash -urile tuturor intrărilor de pool rapid de la ultima complexitate a cheii. Odată făcut acest lucru, entropia este estimatăpentru pool-ul rapid va fi setat la zero [11] [12] .
Complicația pool-ului lentă utilizează cheia curentă și hash-urile intrărilor rapide și lente ale pool-ului. După generarea unei noi chei, estimările de entropie pentru ambele grupuri sunt resetate la zero [13] .
Mecanism de generareMecanismul de generare oferă rezultatului o secvență de numere pseudoaleatoare. Trebuie să fie astfel încât un atacator care nu cunoaște cheia generatorului să nu o poată distinge de o secvență de biți aleatorie .[14] .
Mecanismul de generare ar trebui să aibă următoarele proprietăți [15] :
Pentru a alege timpul de sofisticare, mecanismul de control trebuie să țină cont de diverși factori. De exemplu, schimbarea cheii prea des face ca un atac iterativ ghicitor să fie mai probabil [16] . Prea lent, dimpotrivă, oferă mai multe informații atacatorului care a compromis cheia. Prin urmare, mecanismul de control trebuie să poată găsi o cale de mijloc între aceste două condiții [17] .
Pe măsură ce probele ajung în fiecare bazinestimările entropiei pentru fiecare sursă sunt stocate. De îndată ce această estimare pentru orice sursă atinge valoarea limită, apare o complicație de la pool-ul rapid. În marea majoritate a sistemelor, acest lucru se întâmplă de mai multe ori pe oră. O complicație de la pool-ul lent apare atunci când scorurile pentru oricare dintre sursele din pool-ul lent depășesc un prag [17] .
În Yarrow-160, această limită este de 100 de biți pentru pool-ul rapid și de 160 de biți pentru cel lent. În mod implicit, cel puțin două surse diferite din pool-ul lent trebuie să fie mai mari de 160 de biți pentru ca complicații să apară din pool-ul lent [18] .
O posibilă implementare a algoritmului Yarrow este Yarrow-160. Ideea principală a acestui algoritm este utilizarea unei funcții hash unidirecționale și a unui cifru bloc [19] . Dacă ambii algoritmi sunt siguri și PRNG primește suficientă entropie inițială , atunci rezultatul va fi o secvență puternică de numere pseudo-aleatoare [20] .
Funcția hash trebuie să aibă următoarele proprietăți [21] :
Yarrow-160 folosește algoritmul SHA-1 ca [19] .
Cifrul bloc trebuie să aibă următoarele proprietăți [22] :
Yarrow-160 folosește algoritmul Triple DES cu 3 CHEI ca [19] .
Generatorul se bazează pe utilizarea unui cifru bloc în modul contor (vezi Fig. 2) [23] .
Există o valoare de contor de n biți . Pentru a genera următorii -biți ai secvenței pseudo-aleatoare, contorul este incrementat cu 1 și criptat cu un cifru bloc folosind cheia [24] :
unde este ieșirea PRNG și este valoarea curentă a cheii .
Dacă la un moment dat cheia este compromisă , atunci este necesar să se prevină scurgerea valorilor anterioare de ieșire pe care le poate obține un atacator. Acest mecanism de generare nu are protecție împotriva atacurilor de acest fel, astfel încât numărul de blocuri de ieșire PRNG este calculat suplimentar. De îndată ce se atinge o anumită limită ( setarea de securitate a sistemului, ), apoi este generată o ieșire PRNG -bit, care este apoi folosită ca o nouă cheie [15] .
În Yarrow-160 este 10. Acest parametru este setat în mod deliberat la un nivel scăzut pentru a minimiza numărul de ieșiri care pot fi învățate folosind un atac de backtracking [ 25 ] .
Timpul de execuție al mecanismului de complicație depinde de parametru . Acest parametru poate fi fixat sau modificat dinamic [26] .
Acest mecanism constă din următorii pași [26] :
O funcție este definită în termeni de funcție după cum urmează [27] :
De fapt, este o funcție de adaptare la dimensiune, adică convertește o intrare de orice lungime într-o ieșire de o lungime specificată. Dacă intrarea a primit mai multe date decât se aștepta, atunci funcția ia biții de început. Dacă dimensiunile intrării și ieșirii sunt aceleași, atunci funcția este o funcție de identitate . Dacă dimensiunea datelor de intrare este mai mică decât cea așteptată, atunci biți suplimentari sunt generați folosind această funcție hash . Acesta este un algoritm PRNG destul de costisitor din punct de vedere al calculului, dar pentru dimensiuni mici poate fi folosit fără probleme [28] .
Setarea unei noi valori la contor nu se face din motive de securitate, ci pentru a oferi o mai mare flexibilitate de implementare și pentru a menține compatibilitatea între diferitele implementări [26] .
În implementarea de astăzi a algoritmului Yarrow-160, dimensiunea piscineloracumularea de entropie este limitată la 160 de biți. Se știe că atacurile asupra algoritmului Triple DES cu 3 CHEI sunt mai eficiente decât căutarea exhaustivă . Cu toate acestea, chiar și pentru atacurile de backtracking cu forță brută, cheile se schimbă destul de des, iar 160 de biți este suficient pentru a asigura securitatea în practică [29] .
Subiectul cercetărilor în curs este îmbunătățirea mecanismelor de estimare a entropiei. Potrivit creatorilor Yarrow-160, algoritmul poate fi vulnerabil tocmai din cauza estimărilor slabe ale entropiei, și nu din punctul de vedere al criptoanalizei [30] .
Creatorii au planuri pentru a utiliza pe viitor noul standard de cifrare în bloc AES . Noul cifru bloc se poate încadra cu ușurință în designul de bază al algoritmului Yarrow. Cu toate acestea, după cum subliniază dezvoltatorii, va fi necesar fie să se schimbe funcția hash de complexitate, fie să se creeze o nouă funcție hash pentru a se asigura că pool-ul de entropie este umplut cu mai mult de 160 de biți. Pentru AES cu 128 de biți, aceasta nu va fi o problemă, dar pentru AES cu 192 sau 256 de biți, această problemă va trebui rezolvată. Trebuie remarcat faptul că structura de bază a algoritmului Yarrow este combinația dintre un cifru bloc AES și o funcție hash de 256 de biți [31] .
Setul de reguli pentru mecanismul de management al complicațiilor este încă provizoriu, cu toate acestea, studii suplimentare îl pot îmbunătăți. Din acest motiv, face obiectul cercetărilor în curs [30] .