CubeHash [1] är en parametrerbar familj av CubeHash r/b kryptografiska hashfunktioner . CubeHash8/1 föreslogs av Daniel Bernstein som en ny standard för SHA-3 i hashtävlingen National Institute of Standards and Technology (NIST ) . Inledningsvis krävde NIST cirka 200 cykler per byte [2] . Efter några förtydliganden från NIST ändrade författaren parametrarna till CubeHash16/32, vilket är cirka 16 gånger snabbare än CubeHash8/1 och kommer lätt ikapp SHA-256 och SHA-512 på olika plattformar [3] [4] [5] [6] .
CubeHash tog sig till den andra omgången av tävlingen, men tog sig inte till de fem bästa finalisterna [7] [8] .
Arbetet med CubeHash r/bh bygger på tre parametrar: r , b och h .
Algoritmen har 5 huvudsteg:
Initialisering. 128-byte-tillståndet ses som en sekvens av 32 fyra-byte-ord x 00000 , x 00001 , x 00010 ,…, x 11111 , vart och ett representerat i little-endian form som 32-bitars heltal. De tre första orden x 00000 , x 00001 , x 00010 är inställda på h /8, b , r respektive. De återstående orden är noll. Sedan omvandlas tillståndet genom 10 r identiska omgångar.
Fyllning. 1 bit läggs till det inkommande meddelandet, sedan fylls det med minsta möjliga antal nollbitar så att antalet bitar är en multipel av 8 b .
Utfyllnad kräver inte att lagringen av meddelandelängden, bearbetningsblocket och resten separeras. En implementering kan lagra ett enda nummer mellan 0 och 8 b för att registrera antalet bitar som hittills bearbetats i det aktuella blocket.
Komplettering. 1 adderas modulo två till det sista tillståndet av ordet x 11111. Vidare transformeras tillståndet genom att hålla 10 r identiska omgångar.
Varje omgång innehåller 10 steg:
CubeHash-algoritmen inkluderar inte räknarblock, block som använder slumptal och liknande block. Utan dessa block är det lättare att hitta tillståndet där kollisionen inträffar , men det här argumentet fungerar inte när tillståndets storlek är ganska stor. En typisk attack på CubeHash skulle ta 2^400 försök att hitta en 1024-bitars tillståndskollision för CubeHash. Det finns heller ingen anledning att bryta någon symmetri som används i omgångar .
Initieringstillståndet för CubeHash är inte symmetriskt, om parametern b inte är särskilt stor, har angriparen inte tillräckligt med datorkraft för att beräkna ett symmetriskt tillstånd eller ett par tillstånd.
De huvudsakliga operationerna som används i CubeHash är:
Dessa operationer tar konstant tid på typiska processorer. De flesta implementeringar kommer att undvika läckor från olika mjukvarulager. Till exempel är det möjligt för de flesta programvaruimplementeringar som använder AES att läcka nycklar genom cachen . Detta faktum tvingade Intel att lägga till en tidskonstant relaterad till AES.
På SHA - 3 -tävlingen testade NIST de föreslagna funktionerna, en av dem var CubeHash med parametrarna 16/32. Testning utfördes på två Intel Core 2 Duo 6f6 (katana) och Intel Core 2 Duo E8400 1067a (brick)-processorer:
• 11,47 cykler/byte: CubeHash16/32, brick, AMD64-arkitektur.
• 12,60 cykler/byte: SHA-512, brick, AMD64-arkitektur.
• 12,60 cykler/byte: SHA-512, katana, AMD64-arkitektur.
• 12,66 cykler/byte: CubeHash16/32, katana, AMD64-arkitektur.
• 12,74 cykler/byte: CubeHash16/32, brick, x86-arkitektur.
• 14,07 cykler/byte: CubeHash16/32, katana, x86-arkitektur.
• 15,43 cykler/byte: SHA-256, brick, x86-arkitektur.
• 15,53 cykler/byte: SHA-256, brick, amd64-arkitektur.
• 15,56 cykler/byte: SHA-256, katana, AMD64-arkitektur.
• 17,76 cykler/byte: SHA-512, brick, x86-arkitektur.
• 20.00 cykler/byte: SHA-512, katana, x86-arkitektur.
• 22,76 cykler/byte: SHA-256, katana, x86-arkitektur.
CubeHash är inte sämre i hastighet än sina motståndare.
Det här exemplet använder CubeHash 8/1-512.
Initieringsvektorn är densamma för alla 8/1-512-hashar och ser ut så här:
6998f35dfb0930c760948910e626160f36077cf3b58b0d0c57cf193d3341e7b8\ a334805b2089f9ef31ffc4142aef3850fe121839e940a4527d5293a27045ca12\ 9358096e81bf70349a90a44a93c33edb14c3e9844a87dbd0bc451df25212b3ac\ 6aabe51c5df0f63bddbb8ae8fad3cf0fd52582fbad2e2446094025a521a23d5cAtt hasha ASCII- meddelandet "Hej" (hex: 0x48, 0x65, 0x6c, 0x6c, 0x6f) använder 6 block. De första 5 blocken kommer (eftersom i detta fall varje bokstav är en byte) från meddelandet och ytterligare ett block att fylla.
Värdet på 512-bitars hash är:
7ce309a25e2e1603ca0fc369267b4d43f0b1b744ac45d6213ca08e7567566444\ 8e2f62fdbf7bbd637ce40fc293286d75b9d09e8dda31bd029113e02eccfd39bEn liten förändring i meddelandet (till exempel en förändring på en bit) leder till en betydande förändring av hashen (den så kallade lavineffekten ).
Låt oss till exempel ta meddelandet "hej", som skiljer sig från "Hej" med bara en bit. Hashen i detta meddelande är:
01ee7f4eb0e0ebfdb8bf77460f64993faf13afce01b55b0d3d2a63690d25010f\ 7127109455a7c143ef12254183e762b15575e0fcc49c79a0471a970ba8a66638CubeHash r/bh accepterar många olika parametrar som används för att bestämma hashen. Detta ger flexibilitet till algoritmen i förhållande till slutanvändaren, som själv bestämmer de bästa parametrarna för användning. Nedan finns några exempel på hash för olika meddelanden som använder olika algoritmparametrar. Alla meddelanden är skrivna i ASCII. De tre parametrarna som används i hashgenerering är i r/bh- format.
Meddelande: "" (tom sträng, noll-längd sträng) CubeHash 16/32-512: 4a1d00bbcfcb5a9562fb981e7f7db3350fe2658639d948b9d57452c22328bb32\ f468b072208450bad5ee178271408be0b16e5633ac8a1e3cf9864cfbfc8e043a CubeHash 8/1-512: 90bc3f2948f7374065a811f1e47a208a53b1a2f3be1c0072759ed49c9c6c7f28\ f26eb30d5b0658c563077d599da23f97df0c2c0ac6cce734ffe87b2e76ff7294 CubeHash 1/1-512: 3f917707df9acd9b94244681b3812880e267d204f1fdf795d398799b584fa8f1\ f4a0b2dbd52fd1c4b6c5e020dc7a96192397dd1bce9b6d16484049f85bb71f2f CubeHash 16/32-256: 44c6de3ac6c73c391bf0906cb7482600ec06b216c7c54a2a8688a6a42676577d CubeHash 8/1-256: 38d1e8a22d7baac6fd5262d83de89cacf784a02caa866335299987722aeabc59 CubeHash 1/1-256: 80f72e07d04ddadb44a78823e0af2ea9f72ef3bf366fd773aa1fa33fc030e5cb Meddelande: "Hej" CubeHash 16/32-512: dcc0503aae279a3c8c95fa1181d37c418783204e2e3048a081392fd61bace883\ a1f7c4c96b16b4060c42104f1ce45a622f1a9abaeb994beb107fed53a78f588c CubeHash 8/1-512: 7ce309a25e2e1603ca0fc369267b4d43f0b1b744ac45d6213ca08e7567566444\ 8e2f62fdbf7bbd637ce40fc293286d75b9d09e8dda31bd029113e02eccfd39b CubeHash 1/1-512: 13cf99c1a71e40b135f5535bee02e151eb4897e4de410b9cb6d7179c677074eb\ 6ef1ae9a9e685ef2d2807509541f484d39559525179d53838eda95eb3f6a401d CubeHash 16/32-256: e712139e3b892f2f5fe52d0f30d78a0cb16b51b217da0e4acb103dd0856f2db0 CubeHash 8/1-256: 692638db57760867326f851bd2376533f37b640bd47a0ddc607a9456b692f70f CubeHash 1/1-256: f63041a946aa98bd47f3175e6009dcb2ccf597b2718617ba46d56f27ffe35d49Styrkan hos denna algoritm ökar både när b minskar till 1 och när r ökar .
Därför är CubeHash 8/1-512 mer stabil (säkrare) än CubeHash 1/1-512, och CubeHash 1/1-512 är mer stabil än CubeHash 1/2-512. Den svagaste möjliga versionen av denna algoritm är CubeHash 1/128- h . Säkerheten är dock tidsberoende. Det säkrare alternativet tar längre tid att beräkna hashvärdet.
Attacker som använder strukturen för en hashfunktion är vanligtvis de mest framgångsrika av alla möjliga typer av attacker. Sådana attacker kan hitta kollisioner, förbilder och andra förbilder. Det utmärkande för sådana attacker är dock att de nästan alltid är designade för en specifik hashfunktion, eftersom sådana attacker använder en specifik implementering av tillståndsberäkningen [9] .
Eftersom beräkningsomgången i CubeHash är reversibel, kan initialtillståndet beräknas genom att utföra de omvända operationerna på sluttillståndet. Single block attack baseras på denna omständighet.
Låt oss överväga algoritmen för denna attack.
Givet en hash H för något meddelande, beräknas b - byten för den andra förbilden av meddelandet med hjälp av CubeHashr/bh .
Genom att upprepa proceduren ovan med olika värden på T kommer en andra förbild så småningom att genereras. Metoden för att välja värdet på T är inte kritisk. Till exempel kan en sekvens av på varandra följande nummer användas.
Om vi antar att CubeHash (framåt eller bakåt) beter sig som en slumpmässig mappning för ett godtyckligt testvärde T, så är sannolikheten att de sista 128-b byten av tillstånd 1 kommer att vara lika med motsvarande byte för initialiseringsvektorn 2 −8( 128-b) . Antalet probmeddelanden före framgång är således 28 (128-b) . Om 2 8(128-b) < 2 timmar så kommer en enda blockattack att hitta den andra förbilden på färre försök än brute force. Med andra ord, en enstaka blockattack är mer effektiv än brute force för följande värden h = 224 och b > 100 , för h = 256 och b > 96 , för h=384 och b> 80 , för h=512 och b > 64 .
Det förväntade antalet försök som krävs för att lyckas beror dock inte på antalet omgångar r. Tiden som behövs för att utföra en attack ökar linjärt med r, och inte som en exponentiell funktion. För b = 128 kommer vilket värde som helst på T omedelbart att vara den andra förbilden.
Överväg en algoritm för att förbättra attacken för att hitta den första förbilden.
Det finns 2 nb möjliga ingång n block och ett av dem kommer att kollidera. Antalet försök som krävs för att hitta en kollision uppskattas till
2 * (521 / b - 4) * 2 512 - 4b = 2 * 522 - 4b - logb
Dessutom tar vi hänsyn till att varje omgång kräver 2 11 -bitarsoperationer, då ändras formeln till 2 533-4b-logb+logr- bitarsoperationer. Accelerationen av denna attack kan uppnås på grund av det faktum att vi kommer att söka efter en kollision inte bara efter beräkningen av det n:e blocket, utan också i varje annat tillstånd som vi har nått (vi kommer också att använda mellantillstånd). Därmed kommer vi att bli av med faktorn (512/b-4) . Sedan kommer antalet försök som krävs för att hitta en kollision att uppskattas till 2513-4b bitars operationer. Betrakta CubeHash-512 med parametrarna h, b, r lika med 512, 1, 8 respektive. För den förbättrade algoritmen är antalet försök som krävs för att hitta en kollision 2523 jämfört med standardattackalgoritmen med 2532 försök att hitta en kollision . Om r = 8 behöver den förbättrade algoritmen b > 3 för att antalet försök ska vara mindre än 2512 måste den normala algoritmen uppfylla b > 5 .
Som nämnts ovan är CubeHash-algoritmen mycket symmetrisk och använder inga konstanter. Därför finns det många symmetriklasser med avseende på permutationer. Den mest effektiva attacken är att använda en symmetriklass för vilken ett meddelandetillägg kan generera symmetriska meddelanden. Vi kan till exempel använda en symmetriklass som heter C2. För denna klass kallas ett tillstånd symmetriskt om x ijkl0 =x ijkl1 för valfri i, j, k, l.
När parameter b är 32, dvs. CubeHash är normal, ger meddelandeinjektion kontroll över x 00klm för valfri k, l, m.
Därför, för att uppnå ett symmetriskt tillstånd, behöver man helt enkelt nå ett tillstånd som uppfyller följande 384-bitars ekvation
x 01kl0 = x 01kl1
x 10kl0 = x 10kl1
x 11kl0 = x 11kl1
för varje k, l.
Och då kan meddelandeinjektion användas för att uppnå ett helt symmetriskt tillstånd. Den förväntade komplexiteten är 2 384 .
Detta kan användas för en preimage-attack. Algoritmen kan skrivas enligt följande
b 01kl0 =c 01kl0
b 10kl0 =c 10kl0
b 11kl0 =c 11kl0
sedan följer följande likheter av symmetrin
b 01kl1 =c 01kl1
b 10kl1 =c 10kl1
b 11kl1 =c 11kl1
som håller för något k, l.
Vi använder sedan X-blocket för att matcha de första 256 bitarna. Detta ger en förbild - vi utför en operation eller på A, B i 0 , X, C i 0 , D.
Komplexiteten för steg 1 och 2 är 2384 och komplexiteten för steg 3 och 4 är 2192 . Det kan implementeras utan stora minneskostnader. Denna attack har samma komplexitet som den maktbaserade attacken när B är en potens av två, men den blir mer effektiv när b inte är en potens av två.
Den mest tidskrävande delen av en symmetribaserad attack är den beräkning som krävs för att beräkna symmetritillståndet. Det visar sig dock att detta problem enkelt löses med Grovers algoritm på en kvantdator. Faktum är att att hitta ett tillstånd som uppfyller ekvationen som beskrivs ovan är likvärdigt med att hitta en förbild på noll för en hashfunktion som kommer att iterera över varven för CubeHash-funktionen, och vars utdata kommer att representeras av
x 01000 x 01001
x 01010 x 01011
x 01100 x 01101
x 01110 x 01111
x 10 000 x 10 001
x 10010 x 10011
x 10100 x 10101
x 10110 x 10111
x 11 000 x 11 001
x 11010 x 11011
x 11100 x 11101
x 11110 x 11111
För en 384-bitars funktion har Grovers algoritm en komplexitet på 2 192 operationer. Då skulle en symmetriattack kräva 2 192 operationer, förutsatt att kvantdatorer är tillgängliga.
Hash-funktioner | |
---|---|
generell mening | |
Kryptografisk | |
Nyckelgenereringsfunktioner | |
Kontrollnummer ( jämförelse ) | |
Hashes |
|