Puncte:1

Cum să repetați în siguranță și aleatoriu o cheie derivată din Scrypt?

drapel de

Dezvolt o modalitate de a genera în mod determinist chei private pentru curbe eliptice arbitrare pe baza unor intrări de utilizator (un portofel pentru creier). În prezent, folosesc algoritmul de hashing al parolei Scrypt cu parametri robusti de dificultate pentru a hashing un număr de parametri de intrare într-o cheie.

Ieșirea Scrypt ar trebui să fie distribuită uniform între $[0, 2^{b})$ Unde ${b}$ este numărul de biți de ieșire utilizați de la ieșirea algoritmului Scrypt. Dar cheile private valide ale curbei eliptice trebuie să fie mai mici decât ordinea câmpurilor finite a curbei $N$, distribuite uniform între $[0, N)$. Astfel, folosind ieșirea Scrypt direct ca mod de cheie privată $N$ ar crea o mică părtinire în cheile rezultate care sunt generate - vești proaste, așa că trebuie să evit asta.

În mod normal, dacă generați chei private folosind un RNG securizat, ați încerca pur și simplu să reîncercați RNG până când obțineți un număr mai mic decât $N$, și ai putea să o folosești în siguranță ca o cheie privată.

Există o modalitate sigură de a repeta determinist ieșirea lui Scrypt, astfel încât să păstrăm distribuția pseudo-aleatoare a ieșirii Scrypt, fără a fi nevoie să rulăm din nou Scrypt cu parametri noi?

O modalitate pe care am luat-o în considerare a fost hashingul ieșirii scrypt cu SHA256 sau SHA512 până când acesta a fost mai mic de $N$, dar acest lucru nu ar funcționa atât de bine pentru curbele mai mari de 512 biți, cum ar fi P521.

O altă soluție mai puțin elegantă este să respingi pur și simplu orice parametri de intrare care produc o cheie mai mare decât $N$. Ar trebui să fie foarte rar să apară vreodată, așa că poate pot scăpa de asta? Există curbe comune acolo a căror ordine $N$ nu este o fracțiune semnificativă din următoarea puterea sa cea mai mare de doi?

Puncte:1
drapel my

Astfel, folosind rezultatul Scrypt direct ca o cheie privată $\bmod N$ ar crea o mică părtinire în cheile rezultate care sunt generate - vești proaste, așa că trebuie să evit asta.

De fapt, părtinirea nu ar fi suficient de mare pentru a fi exploatabilă; totuși presupunând că doriți să evitați acest lucru în întregime...

Există o modalitate sigură de a repeta determinist ieșirea lui Scrypt, astfel încât să păstrăm distribuția pseudo-aleatoare a ieșirii Scrypt, fără a fi nevoie să rulăm din nou Scrypt cu parametri noi?

Două abordări evidente:

  • Pune Scrypt să genereze (să zicem) $log_2 N + 128$ biți și evaluează asta $\bmod N$; părtinirea rezultată va fi atât de mică încât va fi nemăsurabilă, mult mai puțin exploatabilă

  • Transmiteți ieșirea lui Scrypt către SCUTURA; apoi stoarce afară $\lceil log_2 N \rceil$ biți (posibil un număr par de octeți, dacă face implementarea mai simplă) și dacă valoarea pe care o returnează se întâmplă să fie mai mare decât $N$, stoarceți mai multe bucăți.

Al doilea este similar cu ideea ta cu SHA256 sau SHA512; totuși, deoarece SHAKE ne permite să stoarcem câte biți ne dorim, îl putem extinde cu ușurință pentru a gestiona P521.

Ah, și din moment ce ai întrebat:

Există curbe comune acolo a căror ordine $N$ nu este o fracțiune semnificativă din următoarea puterea sa cea mai mare de doi?

Ei bine, Brainpool vin curbele în minte - nu știu că utilizarea lor este incredibil de comună; cu toate acestea, cred că sunt folosite ocazional.

Gilles 'SO- stop being evil' avatar
drapel cn
FIPS 186-4 §B.4 permite ambele abordări, cu un proces specific în fiecare caz. Cere doar 64 de biți suplimentari pentru abordarea de părtinire neglijabilă cu dimensiune de intrare fixă.
JoeJafarTheJenie avatar
drapel de
Uau, tare! Nu am știut despre shake-urile SHAKE până când am citit răspunsul tău. Aceasta este de fapt o soluție foarte curată (deși nelimitată). Mulțumesc pentru sfatul despre brainpool, ordinele lor de curbe chiar arată destul de urâte. Mi-ar plăcea să aflu mai multe despre motivul pentru care adăugarea de biți suplimentari de ieșire scrypt ar reduce părtinirea
Puncte:0
drapel cn

În primul rând, utilizarea unei chei private care este derivată determinist dintr-o parolă este aproape întotdeauna greșită.Parolele sunt adesea compromise sau uitate și, prin urmare, trebuie schimbate. Dacă schimbarea parolei necesită mai mult decât actualizarea unei cantități mici de date într-un singur loc, aveți dificultăți operaționale majore. Deci, în mod normal, singurul lucru pe care ar trebui să-l faceți cu o cheie derivată dintr-o parolă este ambalarea cheii, adică cheia derivată din parolă este folosită doar pentru a cripta simetric un fișier care conține cheile „reale”. Acele chei reale sunt stocate și nu sunt generate în mod determinist din nimic, sunt doar generate aleatoriu. Când utilizatorul actualizează parola, criptați din nou acel fișier cu noua cheie derivată din parolă și ștergeți versiunea anterioară.

Acestea fiind spuse, pentru a deriva o cheie de curbă eliptică în mod determinist, primul pas este să luăm în considerare tipul curbei.

  • Pentru Curve25519 și Curve448, cheile sunt calculate dintr-un șir fix de biți distribuit uniform, așa cum este specificat în RFC 7748 §5. Există un proces precis care ia o intrare uniform distribuită de 256 de biți sau 448 de biți, forțând anumiți biți, interpretând biții ca număr (little-endian) și reducând la modul reprezentativ canonic $p$. pentru că $p$ este extrem de aproape de următoarea putere a $2$, reducerea modulo lasă numărul neschimbat cu o probabilitate copleșitoare. Implementările Curve25519/Curve448 de obicei (âTREBUIEâ) acceptă chei în formă necanonică, deci nu trebuie să faceți altceva decât să furnizați șirul de 32 de octeți sau 56 de octeți distribuit uniform.

  • Pentru Ed25519 și Ed448, cheile private sunt specificate în RFC 8032 §5.1.5 și §5.2.5 ca șir uniform de 32 de octeți sau, respectiv, de 57 de octeți. Procesul de semnătură începe prin hashing această intrare (concatenată cu alte șiruri de caractere) și folosește rezultatul ca număr întreg.

  • Pentru curbele NIST și, în general, curbele în formă Weierstrass, nu există un singur proces universal acceptat pentru a trece de la șiruri de biți la chei private. FIPS 186-4 §B.4 descrie două metode posibile de a genera o cheie privată de la ieșirea unui generator aleatoriu, iar aceste metode sunt aplicabile în mod egal la derivarea unei chei private dintr-un flux de biți distribuit uniform, obținut dintr-un algoritm de derivare a cheii simetrice. Pentru a deriva o cheie privată pe o curbă a cărei ordine $p$ este o $n$-bit prim:

    1. (âBiți extra aleatoriiâ) Obțineți $n + 64$ biți de intrare secretă ((pseudo-)aleatorie) distribuite uniform. Interpretați acea intrare ca un întreg big-endian, reduceți-l modulo $p-1$ si adauga $1$ pentru a obține un număr în interval $[1, p-1]$. Unele chei sunt puțin mai probabile decât altele, dar deoarece părtinirea este de aproximativ $2^{-64}$, nu oferă niciun avantaj practic unui adversar.
    2. (âTestarea candidațilorâ) Obțineți $n$ biți de intrare secretă ((pseudo-)aleatorie) distribuite uniform. Interpretați acea intrare ca un întreg big-endian. Dacă rezultatul este $\ge p-1$, începeți din nou procesul de la început. In rest adauga $1$. Acest lucru nu are deloc părtinire și nu necesită manipularea unor numere mai mari decât $n$ biți, dar are dezavantajul că nu știi dinainte de câtă intrare distribuită uniform vei avea nevoie: este potențial nelimitată.

    Prima metodă este în general mai convenabilă, deoarece știți exact câtă intrare (pseudo-)aleatorie este necesară.

Dacă într-adevăr trebuie să înlănțuiți acest lucru cu un algoritm de derivare a cheilor bazat pe parolă, cum ar fi scrypt, există două metode.

  • Metoda directă este să solicitați de la scrypt cât de multă intrare aveți nevoie. Pentru curbele Weierstrass, acest lucru face ca metoda candidaților de testare să fie nepractică. Deci obțineți 32 de octeți de la scrypt pentru Curve25519 sau Ed25519; 40 de octeți pentru P256R1 sau P256K1; 56 de octeți pentru P384R1 sau P384K1; 57 de octeți pentru Ed448 etc.
  • Metoda indirectă este de a solicita un număr fix de biți de la scrypt. Acest lucru trebuie să fie suficient pentru a nu fi ghicit prin forța brută. 128 de biți (16 octeți) se vor descurca bine. Folosiți acest lucru ca semințe pentru o funcție obișnuită (nu bazată pe parolă) de derivare a cheilor, cum ar fi unul de la NIST SPÂ 800-108 sau HKDF, sau ca o sămânță pentru un algoritm generator pseudoaleator, cum ar fi unul de la NIST SPÂ 800-90A. Utilizați acea ieșire PRNG pentru a obține cheia privată.
JoeJafarTheJenie avatar
drapel de
Multumesc pentru asta! Sunt conștient de problemele inerente cheilor generate în mod determinist, dar pentru cazul meu de utilizare specific, acestea nu sunt relevante.
JoeJafarTheJenie avatar
drapel de
Soluția de „testare a candidaților” cred că nu va funcționa, deoarece asta ar însemna să ceri utilizatorului o nouă parolă (soluția „mai puțin elegantă” pe care am descris-o în OP) âBiți extra aleatoriiâ pare o opțiune bună. M-ați putea ajuta să înțeleg de ce adăugarea a încă 64 de biți aleatori reduce părtinirea la $2^{-64}$?
Gilles 'SO- stop being evil' avatar
drapel cn
@JoeJafarTheJenie Ni se da $2^{n-1} \le p \le 2^n-1$. Fie $(q,r)$ câtul și restul împărțirii lui $2^{n+64}-1$ cu $p-1$. Desenăm $X$ uniform în $[0, 2^{n+64}-1]$ și luăm $X \bmod (p-1)$. Numerele din intervalul $[0,r]$ au antecedente $q+1$ iar numerele din intervalul $[r+1, p-2]$ au antecedente $q$. Deci, valorile mai mici de $r$ sunt $1 + 1/q$ ori mai probabil decât valorile mai mari de $r$. $q = \lfloor (2^{n+64}-1) / (p-1) \rfloor \ge \lfloor (2^{n+64}-1) / (2^n-1) \rfloor \ aproximativ 2^{64}$, deci tendința $1/q$ este mai mică de $2^{-64}$.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.