Puncte:4

Multe aproape coliziuni, dar nicio coliziune completă

drapel in

Am citit aceasta intrebare: Crapare $f(x) = Cx \oplus Dx$ Întrebând despre găsirea coliziunilor într-un simplu hash de 64 de biți și m-am gândit că voi încerca și eu doar pentru distracție. Am scris rapid cod pentru a găsi coliziuni: https://gist.github.com/meirmaor/b0e59352eb73cacec47d0f95c25a25fc

Și totuși găsește multe coliziuni aproape și nicio coliziune completă, asta mă deranjează.

Descrierea algoritmului: Am vrut să rezolv acest lucru folosind 8 GB de Ram, așa că am alocat două matrice int de lungime $2^{30}$ *(4 byte int) fiecare. Le populez prin hashing valorile Int, iau cei 30 de biți inferiori ca index în ambele matrice și stochează primii 32 de biți în prima matrice și sursa int în a doua matrice.

populez folosind $2^{32}$ valorile int posibile (ca matrice de octeți) și obțin, așa cum era de așteptat, o rată de umplere de 98%, variază aproape de cea idealizată $1-e^{-4}$ m-as astepta.

Este ca un tabel hash, dar nu mă ocup de coliziuni, doar păstrează o singură valoare pentru fiecare cheie hash de 30 de biți. Este în esență o mapare între hash trunchiat de 62 de biți la originea de 32 de biți.

Apoi încerc să trimit valori mai lungi cu un prefix Int suplimentar și să caut coliziuni, folosind din nou 30 de biți mai mici ca index pentru matrice, verific dacă top 32 se potrivesc și dacă se potrivesc, am găsit o coliziune aproape. Cu toate acestea, când le-am verificat, nu găsesc nicio coliziune completă, am găsit peste 60 de coliziuni aproape până acum, le-am validat separat, se potrivesc într-adevăr pe 62 sau 63 de biți, dar mă așteptam ca 1/4 să fie o coliziune completă, am primit 0.

Am repetat testul de două ori mai întâi comparând hashuri de 4 octeți cu hashuri de 8 octeți începând cu octeții {număr mic, 0,0,0}. Apoi am încercat să compar hashuri de lungime egală prin prepopulare cu hashuri de date, toate începând cu secvența de octeți {1,0,0,0} și comparând din nou cu prefixul {2+,0,0,0}

Cum este posibil acest lucru, ceva special în această funcție hash? O eroare ciudată în codul meu care îmi permite să găsesc cu succes coliziuni aproape, dar fără coliziuni complete? Există vreun motiv pentru care aproape coliziunile găsite în acest fel nu se vor transforma în coliziuni complete?

Un exemplu de aproape coliziune găsită (am multe):

Matrice (24, 0, 0, 0, 14, 103, 61, 80) vs. Matrice (1, 0, 0, 0, -2, -81, 79, 79)

Meir Maor avatar
drapel in
Următoarea mea încercare va fi o memorie cu algoritm O(1) cu două degete, dar încă nu știu de ce prima încercare eșuează.
Puncte:5
drapel ng

Adăugare importantă târziu: Acum îmi dau seama că codul încearcă să găsească coliziuni pentru un 64 de biți $\operatorname{hash}$ acceptând mesaje pe 64 de biți. Daca asta $\operatorname{hash}$ a fost o bijecție, nu s-ar ciocni. Există un continuum între o bijecție și o funcție aleatoare și nicio asigurare $\operatorname{hash}$ se comportă mai ales ca mai târziu. Dimpotrivă, este o funcție internă $f(x)=C\,x\oplus D\,x\bmod2^{64}$ nu are drept-difuzie. Acesta este, $x\equiv x'\pmod{2^i}\implies f(x)\equiv f(x')\pmod{2^i}$, prin urmare $f$ este o funcție de rundă hash slabă. Acest lucru ar putea explica cel puțin parțial dificultatea de a găsi coliziuni prin metode concepute pentru funcții aleatorii. În cele din urmă presupun unul dintre:

  • spațiul de mesaje pentru $x$ este $b$-bit cu $b$ considerabil mai mare decât (ieșire pe 64 de biți)
  • încercăm să găsim ciocniri $x,x'$ astfel încât $\operatorname{hash}(p\mathbin\|x)=\operatorname{hash}(p'\mathbin\|x')$ Unde $p$ și $p'$ sunt prefixe distincte fixe, $x,x'$ sunt $b=64$-pic, $x\ne x'$.

Bănuiesc că o altă problemă importantă este aceea în

Am populat (matricele) prin hashing valorile Int

este hashed incrementale Valori int. Este destul de fezabil să faci o funcție astfel încât valorile incrementale într-un interval mare să nu se ciocnească și este foarte posibil ca funcția $\operatorname{hash}$ căutat pentru coliziuni se comportă astfel, astfel încât orice încercare de a găsi coliziuni între valori consecutive eșuează.

Ca exemplu de funcție fără coliziuni pentru intrare într-un interval mic, luați în considerare $H(x)=\left(263x+\left(\operatorname{MD5}(x)\bmod256\right)\right)\bmod2^{64}$. Tine $H(x)-H(x')\equiv263(x-x')+(r-r')\pmod{2^{64}}$, cu $r,r'\in[0,255]$ deoarece acestea sunt obținute ca ultimul octet al unui MD5; prin urmare $\lvert r-r'\rvert<256$. Prin urmare, dacă $x\ne x'$, singura modalitate de a obține $H(x)=H(x')$ este asta $\lvert x-x'\rvert$ este mare, cel putin $\letaj 2^{64}/263\retaj$, ceea ce nu va fi cazul consecutiv $x$ într-un interval mic.

Când încercați să găsiți coliziuni pentru o astfel de funcție hash insuficient aleatorie $H$, o soluție ușoară este să găsiți coliziuni pentru o funcție mai aleatorie $x\mapsto H(G(x))$, construit folosind o bijecție auxiliară pseudo-aleatorie $G$, de exemplu. $G(x)=G_2(G_1(G_0(x)))$ cu $G_i(x)=k_i(x\oplus(x\gg\lceil b/3+1\rceil))\bmod2^b$ pentru $k_i$ ciudat întâmplător $b$-constante de biți [unde $\gg$ este schimbarea dreapta și $b$ este dimensiunea biților a $x$]. Odată o coliziune $x,x'$ se gaseste cu $H(G(x))=H(G(x'))$ dar $x\ne x'$, o coliziune pentru $H$ este $G(x),G(x')$.


Un avantaj al căutării coliziunilor cu rho lui Pollard cu puncte distincte (mai degrabă decât metoda din codul întrebării) este că natura sa iterativă rezolvă adesea problema unei funcții insuficient aleatorii căutate pentru coliziuni, fără un auxiliar. $G$; sau, un relativ simplu $G$ va face (aici cred că ar trebui să facă o rotație de 1 bit în feedback-ul lui Pollard rho, compensând lipsa difuziei corecte). De asemenea, rho-ul lui Pollard folosește mai puțină memorie, astfel funcționează pentru hashe-uri mai mari; iar pentru funcțiile de hash rapid, este mai rapid, deoarece este prietenos cu memoria cache.

kodlu avatar
drapel sa
Grozav. Există un motiv algebric profund în hash-ul dvs. legat de MD5, care este contrariat la coliziune pentru valorile întregi secvențiale? altul decât 263 fiind relativ prim pentru modulul relevant? nu pot spune dintr-o privire
Reppiz avatar
drapel gb
Eu personal nu prea am înțeles cum, respectiv de ce funcționează G fix. Există vreo explicație suplimentară (sau mai aprofundată)? De asemenea, un link către o lucrare, blog, articol etc... care descrie cumva această metodă ar face.
fgrieu avatar
drapel ng
@Reppiz: Acum încerc să dau rațiunea. În esență, dacă avem o problemă cu $H$ pentru că nu este suficient de aleatoriu, o facem mai aleatorie prin introducerea $G$.
fgrieu avatar
drapel ng
@Meir Maor: asigurați-vă că citiți noua intro!
Meir Maor avatar
drapel in
Da, eram îngrijorat de asta, iar acesta devine un răspuns cu adevărat grozav. Au fost mai multe defecte în încercarea mea. Cu toate acestea, succesul meu de a găsi aproape coliziuni la (oarecum mai puțin, dar nu cu mult mai puțin decât) rata așteptată m-a dezamăgit.
Puncte:2
drapel cn

Prea nereputabil pentru a comenta...

Mă aștept că este o problemă de implementare - descrierea la nivel înalt a metodei pare rezonabilă. Poate găsi o coliziune dacă folosiți în schimb prefixele 0x01000099 și 0xDEADBD5C?

Spoiler: de exemplu. 0x010000992287FF50 vs. 0xDEADBD5C05F19159

Metoda folosită pentru găsirea acestei coliziuni este în esență aceeași cu cea pe care o descrieți, cu excepția faptului că am folosit și asta dacă putem găsi o coliziune a celor 56 de octeți cei mai semnificativi ai hashului (sau, din punct de vedere tehnic, hash-ul fără finalul aplicarea lui f), atunci este trivial să extindem secvențele de octeți cu câte un octet pentru a obține o coliziune completă (64 de biți).

fgrieu avatar
drapel ng
Mi se pare legitim ca răspuns (mai degrabă decât comentariu), chiar dacă răspunde „de ce nu a fost găsită nicio coliziune” prin „ar trebui să existe”; și am o explicație alternativă.
Meir Maor avatar
drapel in
Intriga se îngroașă, cu aceste prefixe codul meu găsește 65 de coliziuni apropiate și 64 dintre ele devin coliziuni complete. Într-o funcție ideală, m-aș fi așteptat să găsesc o singură coliziune aproape în fiecare pereche de prefixe (pentru că stochez doar 1/4 din valorile hashed în primul prefix)
Maarten Bodewes avatar
drapel in
Ceva mod 127 sau similar?

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.