Puncte:13

Ce este în neregulă cu criptarea XOR cu PRNG securizat?

drapel in

Să presupunem că vreau să criptez un mesaj cu o parolă.

Nu aș putea să XOR octeții cu octeți dintr-un generator de numere pseudoaleatoare criptografic securizat (CSPRNG) cu semințele fiind parola sau un hash al acesteia? Nu văd nimic în neregulă cu asta.

Sau este CSPRNG atât de lent încât sunt necesare scheme de criptare mai complexe?

drapel us
Întrebare similară aici: https://crypto.stackexchange.com/questions/35809/whats-wrong-with-xor-encryption-with-hash-and-an-iterated-salt?rq=1
fraxinus avatar
drapel sa
Aproape că ai inventat modul CTR (Contor) de operare a criptării
Puncte:22
drapel in

Octeții pe care îi XOR cu mesajul pentru a obține textul cifrat se numesc fluxul cheie. Este sigur să creați un flux de chei folosind un CSPRNG da, un generator de numere pseudo-aleatoare securizat criptografic și un seed static.

Cu toate acestea, există probleme practice dacă utilizați CSPRNG al sistemului dvs.:

  • poate decide să (re)sămânțea ocazional;
  • algoritmul se poate schimba în timp sau între sisteme;
  • modul în care sunt extrași octeții aleatori se poate schimba (de exemplu, poate decide să se alinieze cuvintelor).

Deci, trebuie să vă asigurați că operațiunea CSPRNG este turnată în piatră înainte de a o folosi pentru a cripta ceva. În cel mai rău caz, sunt incluse date aleatorii pentru a-ți genera cifrul, caz în care datele se pierd efectiv. Acest s-a mai întâmplat înainte când „SHA1PRNG” al lui Sun a fost înlocuit mai întâi cu un alt algoritm și apoi cu date aleatorii OpenSSL pe Android.

Teoretic vorbind, un cifr de flux - sau un cifr de bloc într-un mod de flux - sunt ambele CSPRNG în care există o sămânță (combinația de cheie și IV/nonce), un algoritm specific și o modalitate prescrisă de a prelua un flux cheie. Deci, în general, răspunsul plictisitor este să utilizați AES-CTR pentru a crea fluxul de cheie și să utilizați AES-GCM - care utilizează AES-CTR intern - dacă aveți nevoie și de autentificarea mesajelor. Pe sistemele fără accelerare hardware, ar putea fi utilizat un cifr de flux precum ChaCha20.

Puțin mai puțin plictisitor, puteți, de asemenea, să construiți un cifr de flux dintr-o funcție hash utilizând modul contor. De preferință, ați folosi o construcție MAC precum HMAC pentru asta. De fapt, majoritatea CSPRNG-urilor pe care le furnizează sistemele nu sunt cu mult mai mult decât atât - dar, așa cum am menționat, sunt de obicei concepute pentru a furniza date aleatorii, nu date deterministe. Și da, în general, acești algoritmi sunt mai lenți decât un cifr de flux dedicat sau un cifr bloc accelerat hardware - sunt mai complex mai degrabă decât mai puțin complexă.

drapel in
Aș considera un PRNG determinist prin definiție. i.e. âCSPRNG-ul sistemului dvs. nu este de fapt un CSPRNG deloc, ci mai degrabă o sursă aleatorie mărită cu un CSPRNG.
Maarten Bodewes avatar
drapel in
Sau un CSPRNG augmentat cu o sursă aleatorie, da. Cel mai adesea le împachetați împreună - ceea ce este bine atâta timp cât le folosiți pentru a obține numere aleatoare (-izate) dintr-o sursă limitată de entropie.
Puncte:16
drapel in

Da, poti; se numeste a stream cipher. Poate fi privit ca o aproximare a a tampon unic, unde nu aveți suficientă entropie disponibilă pentru a genera o cheie OTP (care trebuie să aibă aceeași lungime ca textul simplu), dar aveți suficientă pentru a genera un PRNG.

Vulnerabilitățile generice ale cifrurilor de flux, independente de alegerea algoritmului de generare a fluxului de chei, sunt:

  • Atac cu chei reutilizate. Dacă aveți acces la două mesaje criptate, puteți XOR aceste două mesaje pentru a obține XOR a celor două mesaje text simplu. Acest răspuns ilustrează frumos modul în care acest lucru poate fi nesigur. Pentru a evita acest atac, nu reutilizați niciodată parolele și asigurați-vă că funcția hash de generare a cheilor are o rezistență adecvată la coliziune.
  • Atacul de răsturnare a biților. Să presupunem că un atacator interceptează unul dintre mesajele dvs. criptate și, deși nu știe mesajul complet, ea știe cumva că cifra 1 apare într-o anumită poziție în el, care este codificată în textul cifrat ca 0x2A. Schimbarea acelui octet la 0x22 (= 0x2A ^ („1” ^ „9”)) va schimba asta 1 la a 9 în text simplu, iar „Îți datorez \100$” pe care l-ai trimis este primit ca „Îți datorez \900$”. Acest atac poate fi atenuat prin includerea a MAC cu mesajul dvs. pentru a detecta modificări.
drapel za
să presupunem că atacatorul știe că ultima parte a cookie-ului tău criptat este `is_admin=0` :-)
Joshua avatar
drapel cn
@hanshenrik: Fapt amuzant. Am un cookie care acționează așa. Dar dacă schimbați is_admin la 1, nu faceți decât să păcăliți javascriptul. Serverul nu este păcălit.
Puncte:6
drapel kr

Pe lângă răspunsurile lui „Maarten Bodewes” și „dan04”:

Schema dvs. nu oferă nicio protecție integritate. Dacă utilizați aceeași parolă pentru mesaje diferite, atunci primul octet va fi identic în toate cheile generate, al doilea octet va fi din nou identic în toate cheile generate etc. Aceasta înseamnă că un atacator poate înlocui orice octet din mesajul criptat cu octet cu același număr dintr-un alt mesaj și nu veți putea detecta dacă mesajul dvs. criptat a fost modificat. Pentru a face acest lucru, atacatul nici măcar nu are nevoie să știe parola. Astfel, atacatorul poate schimba mesajul criptat din „Transfer 1000 USD” în „Transfer 5000 USD”, iar nimeni nu va putea detecta că mesajul criptat a fost modificat.

ilkkachu avatar
drapel ws
utilizarea aceleiași parole/chei pentru mai multe mesaje ar putea, de asemenea, să deschidă atacuri de decriptare
drapel kr
@ilkkachu: Sigur. „dan04” a menționat-o. Nu văd sensul să o repet.
drapel kr
Rețineți că al doilea punct din răspunsul lui dan04 este și despre integritate. Diferența dintre acesta și acela este destul de subtilă: acela pare mai general (din moment ce nu depinde de a avea mai multe mesaje), dar poate că există o situație în care acest atac este posibil, dar acela nu este?
R.. GitHub STOP HELPING ICE avatar
drapel cn
Incapacitatea de a reutiliza același flux de cheie este o problemă destul de diferită. Chiar și fără asta, atacatorii pot schimba mesajul. Nu pot înlocui un alt mesaj cunoscut, dar pot răsturna anumite biți etc. Pentru a evita acest lucru, aveți nevoie de criptare autentificată.
Joshua avatar
drapel cn
Și presupui că nu are IV de ce? (IV ar fi încărcat la însămânțarea CSPRNG).
drapel kr
@Joshua: Un punct bun. Am trecut cu vederea „CS” și l-am considerat drept PRNG normal.Dacă este într-adevăr CS, atunci chiar și atunci când este setată aceeași sămânță (parolă), 1) secvența generată pe alt computer va fi diferită și astfel va fi imposibil să decriptați mesajul original; 2) chiar și pe același computer după inițializarea CSPRNG pentru decriptare, secvența generată poate fi diferită (de exemplu, așa funcționează CR PRNG în Java, Class SecureRandom). Astfel, poate fi imposibil să decriptați mesajul criptat anterior. Astfel, schema din OP este și mai rău.
Puncte:1
drapel us

Algoritmul dvs. de criptare va funcționa foarte slab în unele scenarii practice.De exemplu, dacă criptați un disc cu acesta, atunci citirea unui fișier de la sfârșitul discului va necesita ca CSPRNG să genereze gigaocteți / terabytes de numere aleatorii înainte de a obține numerele folosite pentru a cripta acel fișier.

Puncte:0
drapel ss

Va trebui să amestecați un element de aleatorie reală - dacă nu semănați generatorul cu numere aleatorii, nici ieșirea nu va fi aleatorie.Soluția pe care ați descris-o este vulnerabilă la:

  1. Dicţionar attacks. Puteți genera hashe-uri pentru toate semințele pentru parole comune. Sau descărcați-l.
  2. Atacuri cunoscute în text clar. Deoarece sămânța dvs. este fixă, fluxul aleatoriu este fix. Dacă cunoașteți textul simplu al unui mesaj, acum puteți decoda toate celelalte mesaje la aceeași lungime. În funcție de informațiile pe care le trimiteți, ar putea fi mult mai mult text simplu disponibil decât ați crede (de exemplu, fișierele au marcaje specifice, pentru că limbajul mesajelor poate fi mai previzibil decât ați crede).

Trucul XOR face doar confuzie și nu difuzie și este deschis atacurilor statistice. Chiar și pad-urile unice cu XOR sunt parțial vulnerabile. De exemplu. pentru mesaje foarte lungi din punct de vedere statistic, XOR lasă, de asemenea, 1/256 din mesajul tău necriptat, deoarece XOR cu 0 nu face nimic, iar 1/256 este inversat deoarece XOR cu 0xff este același cu NOT. Din nou - în funcție de informațiile pe care le trimiteți, potrivirea 1/256 ar putea fi suficient de bună pentru atacator (de exemplu, dacă atacul dorește să știe dacă ați partajat un anumit fișier despre care cunoaște contextul.)

S-ar putea să doriți să vă sărați RNG-ul cu adevărat aleatoriu, în plus față de hash. Și aveți nevoie de umplutură pentru a vă asigura că nu scurgeți informații despre lungime.

drapel cn
Cred că greșești cheia în utilizare. Întrebarea nu se adresează dacă se folosește o cheie statică sau un fel de schimb de chei. Desigur, orice fel de aleatorie în cadrul procesului de criptare trebuie trimisă la receptor într-un fel (trimiterea IV-ului, procesul de schimb de chei etc.). Și aleatorietatea cheilor ar trebui să fie generată de un proces sigur, dacă este posibil.
drapel cn
Dar despre al doilea paragraf, pur și simplu nu este adevărat. XOR-ul cu 0 nu face nimic - dar exact asta este ideea. Atacatorul nu știe dacă acea poziție a cheii este XORed cu 0 sau 1 (uitând la biți unici). Dacă cheia este cu adevărat aleatorie, uniformă și nu se repetă niciodată, atunci atacatorul nu poate ști ce părți ale mesajului sunt răsturnate sau neschimbate.Acesta este exact motivul pentru care atacurile statistice nu funcționează pentru OTP.

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.