Știu că trebuie să fie aleatorii
Ceva de genul. Mai precis, trebuie să fie imposibil de distins de aleatoriu.
Scopul atunci când alegeți o cheie este ca adversarul („băiatul rău”) să nu poată găsi cheia. Deoarece adversarul poate ști cum funcționează sistemul nostru (Principiul lui Kerckhoffs), trebuie să găsim o modalitate de a genera chei care nu depind doar de un calcul determinist (pe care adversarul l-ar putea reproduce). Prin urmare, toate cheile trebuie să depindă de ceva ce adversarul nu știe. Așa ceva se numește o „adevărată” valoare aleatorie.
Valorile aleatorii pot fi generate folosind diferite procese fizice imprevizibile. Un dispozitiv care implementează un astfel de proces se numește a hardware sau generator de numere aleatorii „adevărat” (HRNG sau TRNG). Aproape toate smartphone-urile și PC-urile moderne, precum și un număr tot mai mare de dispozitive încorporate, includ un HRNG.
Odată ce un sistem a fost „însămânțat” cu o valoare aleatorie adevărată, poate folosi un calcul determinist numit generator pseudoaleatoriu securizat criptografic (CSPRNG) (generator pseudo-aleatoriu pe scurt) pentru a genera un flux practic infinit de valori aleatorii. Aceste valori sunt aleatorii în sensul că un adversar cu putere de calcul finită nu le poate distinge de valorile aleatoare „adevărate”. Într-un context criptografic, un generator aleatoriu (RNG) este un CSPRNG însămânțat de un HRNG.
acestea sunt toate proprietățile necesare?
Fiecare cheie trebuie să fie imposibil de distins de aleatoriu, din punctul de vedere al potențialilor adversari. Acest lucru poate însemna că cheia este generată aleatoriu (după cum s-a explicat mai sus). Dar nu toate cheile sunt generate aleatoriu: unele chei sunt calculate determinist dintr-un amestec de chei și alte intrări. Astfel de procese sunt numite derivarea cheii. HKDF este un exemplu de funcție de derivare a cheilor. O funcție pseudoaleatorie (PRF) poate fi un bloc de construcție pentru un KDF. De exemplu, atunci când două computere comunică printr-un canal criptat, de obicei obțin aceleași chei dintr-un secret partajat.
âRandomâ, pentru o cheie, înseamnă cât mai aproape posibil de uniform aleatoriu printre setul de chei posibile. Ce înseamnă asta depinde de tipul de cheie.
În general, criptarea simetrică utilizează chei care sunt doar o matrice de octeți, generând astfel un $n$cheia -bit înseamnă doar generare $n$ biți aleatori și numind asta o cheie. Acest lucru este valabil, de exemplu, în cazul cifrurilor bloc precum AES și Camellia, al cifrurilor flux precum Chacha20, al algoritmilor MAC precum HMAC și Poly1305 etc.
Criptarea asimetrică clasică utilizează chei care sunt numere cu anumite proprietăți, astfel încât generarea unor astfel de chei poate implica calcule suplimentare. O modalitate generică de a genera o cheie care poate fi reprezentată printr-un $n$-bit șirul este de generat $n$ biți aleatori, verificați dacă aceasta reprezintă o cheie validă și, dacă nu, încercați din nou. (Acest lucru presupune că reprezentarea este unică, adică nu există două chei identice cu aceeași reprezentare.) Această abordare funcționează bine pentru ECC chei, unde o cheie privată este un număr între $1$ și $2^n - a$ cu $a \ll 2^n$, așa că funcționează bine pentru a genera o aleatorie $n$-bit șir și interpretează-l ca un număr între $0$ și $2^n-1$ și încercați din nou dacă atingeți una dintre puținele valori nevalide. Unele alte criptosisteme, cum ar fi RSA, implică procese mult mai complexe de generare a cheilor, dar chiar și așa folosește „generați un șir de biți aleatoriu” și „încercați din nou dacă valoarea este nepotrivită” ca blocuri de construcție.