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)