În capitolul 6 din Criptografie serioasă, ei scriu despre functie de burete:
- XOR-ul primului bloc de mesaje, M1, la H0, o valoare inițială predefinită a stării interne (de exemplu, șirul total zero). Blocurile de mesaje sunt toate de aceeași dimensiune și mai mici decât starea internă.
- O permutare, P, transformă starea internă într-o altă valoare de aceeași dimensiune.
- XOR blochează M2 și aplică din nou P, apoi repetă acest lucru pentru blocurile de mesaje M3, M4 și așa mai departe. Aceasta se numește faza absorbanta.
- După injectarea tuturor blocurilor de mesaje, aplică din nou P și extrage un bloc de biți din stare pentru a forma hash-ul. (Dacă aveți nevoie de un hash mai lung, aplicați din nou P și extrageți un bloc.) Acesta se numește faza de stoarcere.
Securitatea funcției unui burete depinde de lungimea stării sale interne și de lungimea blocurilor. Dacă blocurile de mesaje sunt lungi de r-biți și starea internă este de w-biți, atunci există c = w â r biți ai stării interne care nu pot fi modificate de blocurile de mesaje. Valoarea lui c se numește capacitatea unui burete, iar nivelul de securitate garantat de funcția burete este c/2. De exemplu, pentru a ajunge la securitatea pe 256 de biți cu blocuri de mesaje pe 64 de biți, starea internă ar trebui să fie w = 2 × 256 + 64 = 576 de biți. Desigur, nivelul de securitate depinde și de lungimea, n, a valorii hash. Complexitatea unui atac de coliziune este, prin urmare, cea mai mică valoare între 2^{n/2} și 2^{c/2}, în timp ce complexitatea unui al doilea atac preimagine este cea mai mică valoare între 2^n și 2^{c/ 2}.
Pentru a fi sigur, permutarea P ar trebui să se comporte ca o aleatorie
permutare, fără părtinire statistică și fără o structură matematică
care ar permite unui atacator să prezică rezultate. Ca și în compresie
hash-uri bazate pe funcții, funcții burete, de asemenea, mesaje pad, dar
umplutura este mai simplă, deoarece nu trebuie să includă mesajele
lungime. Ultimul bit de mesaj este pur și simplu urmat de un bit și tot atât
zerouri după cum este necesar.
The Pagina Wikipedia este prea opac pentru a fi transformat și în cod.
Mă întreb dacă ar putea să arăți o demonstrație simplistă a funcției de burete din lumea reală, pentru a naviga acasă aceste 4 puncte de marcare despre cum funcționează.
niste întrebări legate de implementarea acestuia:
- Care este dimensiunea blocului? Presupunând 512
- Care sunt datele de intrare (utf-8, etc.)? Conteaza?
- Cu ce să XOR primul bloc de mesaje? Ce numar? Și blocurile viitoare?
Nu prea știu de unde să încep, nici nu am găsit fragmente de cod legate de „funcțiile sponge”.
The Hârtie Keccak Sponge Functions este puțin prea greu de matematică pentru a putea obține o implementare clară a software-ului (cel puțin pentru mine).
Caut doar elementele de bază. Poate acest este cât se poate de simplu?