Puncte:1

Cum să spargeți sha256 folosit ca streamcipher cu bloc cunoscut sau ghicit

drapel cn

Utilizarea SHA-256 ca un cifr de flux pare să aibă slăbiciuni criptografice, cu toate acestea, nu sunt foarte sigur cum să le implementez în decriptare.

Să presupunem că am o funcție de criptare folosind blocuri de 64 de octeți. Criptez fiecare dintre blocuri cu hash-ul precedentului pentru a produce textul meu cifrat. Veriga slabă aici este că știu sau pot ghici primul bloc de octeți.

Într-una dintre postările de mai jos, am citit:

Ar trebui să menționez că, dacă există vreun bloc complet de text simplu cunoscut sau ghicit în mesajul dvs., schema dvs. este ușor ruptă, deoarece pad(i) dat oricine poate calcula pad(i+1). Deci, ghiciți un bloc de text simplu, XOR-l față de textul cifrat pentru a recupera o posibilă valoare a pad-ului, apoi calculați următoarea valoare a pad-ului și vedeți dacă textul cifrat recuperat din acel bloc pare valid.

Poate cineva să detalieze ce înseamnă mai exact aici? Dacă cunosc primul bloc, îl fac xor față de primul bloc codificat? Dacă da, cum mă ajută asta să sparg următoarele hashuri care sunt H(prevHashedBlock + currentPlaintextBlock)?

Sunt conștient că acest lucru are de-a face cu stările de hashing și altele, dar nu am găsit multe pe web.

Am citit urmatoarele postari:
Este fezabil să construiți un cifr de flux dintr-o funcție hash criptografică?
Este SHA-256 sigur ca un cifr de bloc CTR?

Puncte:2
drapel in

Nu există o astfel de slăbiciune dacă SHA-256 este utilizat în modul CTR. ChaCha20 este deja unul construit în acest fel.

Utilizați SHA-256 într-un mod înlănțuit pentru a scoate un flux pentru a cripta mesajul cu x-or;

\begin{align} O_1 & = H(cheie) \oplus H(mesaj)\ O_i & = H(O_{i-1}) \end{align}

Apoi criptarea este executată cu x-oring $O_i$s.

$$C_i = P_i \oplus O_i$$

Acum presupuneți că aveți un text simplu cunoscut pentru un anumit bloc $j$. Asta înseamnă că primești $O_j$

$$O_j = P_j \oplus C_j$$

Acum utilizați ecuația de producere a fluxului

\begin{align} O_{j+1} &= H(O_j)\ O_{j+2} &= H(O_{j+1})\ \vdots \quad și \quad\quad\vdots \ O_{j+t} &= H(O_{j+t-1})\ \vdots \quad și \quad\quad\vdots \ \end{align}

După cum puteți vedea, obțineți restul fluxului de ieșire din poziție $j$. Dacă ai prima poziție, vei obține totul.

Acesta este punctul slab al unei astfel de scheme, pe de altă parte, modul CTR este conceput pentru PRF-uri și este obișnuit să-l inițializați cu câteva funcții hash bune.


Vezi cu o imagine

introduceți descrierea imaginii aici

După cum se poate vedea, dacă obțineți oricare dintre rezultate $O_j$ apoi puteți obține restul datorită înlănțuirii hash.

CrazyPhil avatar
drapel cn
Deci, XORing Oj cu Cj ar trebui să producă textul clar al blocului j? Multumesc pentru imagine, m-a ajutat sa inteleg mai bine explicatia ta.
CrazyPhil avatar
drapel cn
Mai mult, ce este exact Oj? Pentru că, evident, nu este hașul finit, corect? Deoarece H(key+ptxt) = C1 nu O1; deci atunci când decriptez acest lucru într-un program, cum aș obține O1?
kelalaka avatar
drapel in
De aceea o desenez. Uneori, o imagine poate spune o mie de cuvinte. $O_j$ sunt rezultatul funcției hash.Când decriptați doar x-sau textul cifrat cu $O_j$, ca în One-time-Pad.
kelalaka avatar
drapel in
Primul hash trebuie să fie $hash(key)\oplus hash(ptxt)$, care nu schimbă atacul, îl voi corecta mai târziu...

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.