Puncte:2

Având în vedere o funcție hash și o valoare hash, puteți spune dacă poate produce o astfel de valoare?

drapel tr

Am venit cu următoarea întrebare:

Dată o funcție hash H() și o valoare hash h care se află în codomeniul/gama de ieșiri ale H(), puteți determina dacă h poate fi produs de H() (adică este h în imaginea lui H())?

Se poate răspunde la întrebare? Contravine proprietății de rezistență preimagine?

Există vreun beneficiu la care vă puteți gândi pentru o funcție hash care are proprietatea de mai sus (la care puteți/nu puteți spune dacă h poate fi produs de funcția hash)?

Maarten Bodewes avatar
drapel in
Rețineți că titlul indică o întrebare la care [a fost deja răspuns] (https://crypto.stackexchange.com/a/41708/1172). Cu toate acestea, întrebările ulterioare sunt suficient de interesante pentru a rămâne deschise, în opinia mea personală.
Puncte:2
drapel in

Având în vedere o funcție hash H() și o valoare hash h care se află în codomeniul/intervalul de ieșiri ale $H()$, puteți determina dacă $h$ poate fi produs de $H()$ (adică este $h$ în imaginea lui $H()$)?

În general, nu poți dacă luați în considerare $H$ a fi o cutie neagră. Aș fi surprins dacă există valori care nu pot fi atinse de o funcție hash precum SHA-2/3, din cauza modului în care sunt construite. Ca și în întrebările/răspunsurile pe care le-am indicat, în cele din urmă veți dori să vă uitați la funcționarea interioară a funcției hash.

Se poate răspunde la întrebare? Contravine proprietății de rezistență preimagine?

Nu direct. Ar reduce codomeniul desigur, dar nu semnificativ. Cu toate acestea, ar putea pune mari îndoieli cu privire la construcția funcției hash. Oamenii ar încerca să analizeze de ce distribuția nu este perfectă și cred că vor găsi alte probleme destul de curând, cu excepția cazului în care funcția hash a fost proiectată în mod deliberat pentru a evita anumite valori (de exemplu, „dacă ieșirea = 0, atunci efectuează un alt bloc de hashing ").

Există vreun beneficiu la care vă puteți gândi pentru o funcție hash care are proprietatea de mai sus (la care puteți/nu puteți spune dacă $h$ poate fi produs de funcția hash)?

Ai putea de ex. utilizați acele valori pentru a indica că ceva a mers prost - dacă ați reușit cumva să le găsiți. De exemplu, v-ați putea gândi la canale ascunse care folosesc astfel de valori - dar rețineți că, cu rezistența pre-imagine, puteți alege pur și simplu câteva din codomeniu.

Dacă reușiți să faceți ca rezultatul să evite anumite valori care se aplică unei funcții comune, atunci vă puteți asigura că cineva nu câștigă niciodată o loterie, de exemplu (deși, pentru loteriile obișnuite, este posibil să nu aveți nevoie de efort). De obicei, ați lua doar o ieșire hash parțială pentru astfel de lucruri, deci de ex. ați putea să vă asigurați că biții inițiali nu sunt niciodată zero (dar rețineți că acele funcții hash nu vor trece prin multe suite de testare).

Cu construcțiile obișnuite, ar putea fi dificil să ascunzi aceste tipuri de valori speciale de alții care analizează structura internă a funcției hash, mai ales pe termen lung. Acestea fiind spuse, puteți privi de ex. Dual_EC_DRBG pentru a înțelege că puteți face lucruri destul de urâte cu un algoritm, mai ales când vine vorba de selectarea constantelor.

drapel tr
Vă mulțumim pentru contribuție! Nu ar fi asta tocmai pentru că H este o cutie neagră, pot întotdeauna să răspund „da” din cauza probabilității mari ca toate imaginile să fie mapate? Apoi, având în vedere un hash artificial cu niște valori cunoscute, nu va ieși niciodată, voi răspunde „da” dacă h nu este în acele valori și „nu” în caz contrar. Pot câștiga întotdeauna?
Maarten Bodewes avatar
drapel in
Nu, deoarece dacă este o cutie neagră, nu ați putea spune ce valori ar fi excluse din rezultat. În general, v-ați aștepta ca o ieșire hash să fie bine distribuită, dar dacă omiteți doar câteva, atunci acest lucru este neglijabil și indetectable.
Puncte:2
drapel ng

Dată o funcție hash $\mathcal H()$ și o valoare hash $H$ care se află în codomeniul/gama de ieșiri ale $\mathcal H()$, puteți determina dacă $H$ poate fi produs de $\mathcal H()$ (adică este $H$ în imaginea lui $\mathcal H()$)?

Voi presupune că „codomeniul/gamă de ieșiri” este definit fără referire la ceea ce iese de fapt hash-ul (mai degrabă decât ca setul de ieșiri reale ale hash-ului, ceea ce ar face ca totul să fie atins prin definiție).

Dacă o funcție hash $\mathcal H$ a fost astfel încât pentru o parte considerabilă din dat $H$ în codomeniul său se poate expoziţie intrare $M$ astfel încât $H(M)=H$, atunci acea funcție nu ar fi rezistentă la preimagine. Astfel, expoziția menționată trebuie să fie imposibilă din punct de vedere computațional pentru o întâmplare $H$.

Dacă modelăm un hash ca funcție aleatoare $\{0,1\}^*\la\{0,1\}^n$, apoi conform colector de cupoane problema, numărul așteptat de hashe-uri ale mesajelor aleatorii pentru a atinge toate valorile este $E=2^n\,(n\,\ln(2)+\gamma)+1/2+o(1)$. În practica criptografică $n\ge128$ prin urmare $\log_2(E)\aprox n+\log_2(n)-0,53$. Astfel, în medie, ar trebui să hashing mai puțin decât toate mesajele de exact 33 de octeți pentru a ajunge la toate valorile pentru un hash ideal de 256 de biți, dar trebuie să hash mai mult decât toate mesajele de exact 65 de octeți pentru a atinge toate valorile pentru un 512-biți ideal. putin hash. A face atât de multe hashe-uri este imposibil.

Pentru funcțiile hash obișnuite, cum ar fi SHA-1, SHA-256, SHA-512 și cred că SHA-3, așa cum se spune în aceea alt raspuns, nu avem nicio dovadă matematică că fiecare valoare de ieșire poate fi atinsă. Cel mai bun lucru pe care putem spune este că este probabil valabil (chiar și limitându-se la mesajele care se potrivesc unui singur bloc, și cu atât mai mult cu mai multe), dar ar fi surprinzător dacă ar putea fi fie dovedit, fie infirmat.


Dar cred că putem construi o funcție hash care dovedit atinge tot spațiul său de ieșire, dar are în mare măsură proprietățile așteptate de la un hash criptografic. Iată un hash candidat de șir de biți arbitrar care ajunge, în mod demonstrabil, la întreg $\{0,1\}^{512}$.

Voi folosi un 3072 de biți prime sigure $p$, adică așa încât $q=(p-1)/2$ este, de asemenea, prim; si un generator $g$ a grupului multiplicativ $\mathbb Z_p^*$, acesta este $g\in[2,p-2]$ cu $g^q\equiv-1\pmod p$. Putem folosi $p=2^{3072}-2^{3008}+2^{64}\,(\left\lfloor2^{2942}\,\pi\right\rfloor+1690314)-1$ al Grup MODP pe 3072 de biți, și $g=\left\retajul 2^{3070}\,e\right\rfloor$.

Calculați hash-ul $H(M)\in\{0,1\}^{512}$ a mesajului de intrare $M\în\{0,1\}^*$ după cum urmează:

  1. Convertiți șirul de biți $M$ la un întreg $m$ conform convenției big-endian și urmăriți lungimea biților $\ell$ de $M$.
  2. Calcula $$\begin{align} m_0&=m\bmod(p-1)\ h_0&=(g^{m_0}\bmod p)-1\ h_1&=\left\lfloor h_0/2^{1024}\right\rfloor\bmod2^{512}\ h_2&=\left\lfloor h_0/2^{1664}\right\rfloor\bmod2^{512}\ m_1&=\stânga\l etaj m/(p-1)\dreapta\retaj\ \end{align}$$ Notă: constantele 1024 și 1664 selectează poziția a două segmente arbitrare de 512 biți care nu se suprapun în reprezentarea binară a $h_0$.
  3. Convertit $h_1$ la șir de biți $H_1\in\{0,1\}^{512}$, $h_2$ la șir de biți $H_2\in\{0,1\}^{512}$, și $m_1$ la șir de biți $M_1\in\{0,1\}^{\ell}$ conform convenției big-endian.
  4. Calculați și ieșiți $H=H_1\oplus H_2\oplus\operatorname{SHA3-512}(M_1)$.

Transformarea dintre $m_0$ și $h_0$ este o bijectie a $[0,p-2]$. Dacă urmează, am putea găsi o preimagine $M$ din oricare $H\în\{0,1\}^{512}$ dacă am putea rezolva DLP-ul în grupul multiplicativ $\mathbb Z_p^*$: reparam $M_1=0^{3072}$ (prin urmare $\ell=3072$ și $m_0=m$), $h_0=2^{640}\,h_1$ (prin urmare $H_2=0^{512}$), care ne permite să calculăm $H_1=H\oplus\operatorname{SHA3-512}(M_1)$, atunci $h_1$, atunci $h_0=2^{640}\,h_1$. Rezolvăm problema DLP $(g^{m_0}\bmod p)=h_0+1$ a obține $m_0$, atunci $m$, apoi pe 3072 de biți $M$.

Argumentul meu că hash-ul este rezistent la coliziuni și rezistent la preimagine este că $M\mapsto(M_1,m_0)$ este injectiv, $m_0\mapsto H_1\oplus H_2$ pare a fi destul de greu de inversat sau de ciocnit, iar XORing asta cu un hash bun fără legătură de $M_1$ mai puțin de jumătate din rezistența la coliziune.


Există vreun beneficiu la care te poți gândi?

Nu văd niciunul tehnic real beneficiază de o funcție hash care, în mod demonstrabil, atinge tot codomeniul său, deoarece nu putem face diferența experimental cu o funcție hash standard bună fără această proprietate. Pe de altă parte, ar fi satisfăcător din punct de vedere intelectual. Problema este că orice îmi vine în minte (cum ar fi candidatul de mai sus) dacă este mai lent și mai puțin sigur la o lățime de ieșire dată decât este un hash standard și această considerație practică ponderează beneficiul intangibil de a fi sigur că toate valorile de ieșire pot fi atinse.

Nu văd niciun beneficiu pentru o funcție hash care, în mod demonstrabil, nu poate atinge o parte din spațiul său de ieșire și, astfel, este imposibil din punct de vedere computațional să afișați o astfel de valoare de ieșire sau imposibil de a spune dacă o anumită valoare a spațiului de ieșire este accesibilă.

Îmi imaginez aplicații pentru hashuri care probabil nu pot ajunge la câteva cunoscut valori în spațiul lor de ieșire (de exemplu, o astfel de valoare poate fi rezervată ca indicator al unui caz special). Pe de altă parte, putem construi cu ușurință astfel de hashe-uri din primitive standard. De exemplu, pentru un hash de 256 de biți care nu poate ajunge $0^{256}$, putem folosi (cu conversii obișnuite între șiruri de biți și numere întregi) $M\mapsto(\operatorname{SHAKE128}(M,416)\bmod(2^{256}-1))+1$. Și, în practică, am putea folosi la fel de bine orice hash standard de 256 de biți.

kelalaka avatar
drapel in
Nu-i așa că XORingul primii 512 biți ai intrării la ieșirea SHA3-512 este o modalitate mai ușoară de a garanta că întregul interval este spațiul de 512 biți?
fgrieu avatar
drapel ng
@kelalaka: dacă propuneți $H(m_0\mathbin\|m_1)=m_0\oplus\operatorname{SHA3-512}(m_0\mathbin\|m_1)$ cu $m_0\in\{0,1\}^ {512}$, atunci nu, nu există nicio dovadă care să atingă toate valorile de ieșire și este foarte probabil fals când ne limităm la mesajele pe 512 biți. Dacă înțeleg corect matematica lui [Coupon collector](https://en.wikipedia.org/wiki/Coupon_collector%27s_problem), acest lucru devine probabil după ce indexăm mesaje de aproximativ $2^{512+8.5}$. Funcția mea _demonstrabil_ atinge toate valorile de ieșire, dar ar trebui să rezolvăm o variantă a problemei DLP pentru a o inversa.
kelalaka avatar
drapel in
Da, nu este corect, ar trebui să spun x-oring mesajul în 512-blocuri, apoi x-sau cu hash, tot nu există nicio dovadă, doar așteptare.

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.