CubeHash - CubeHash
CubeHash to kryptograficzna funkcja skrótu przesłana do konkursu funkcji skrótu NIST przez Daniela J. Bernsteina . CubeHash ma stan 128 bajtów, używa konstrukcji szerokich potoków i jest oparty na ARX . Bloki komunikatów są XORowane do początkowych bitów stanu 128-bajtowego, który następnie przechodzi przez transformację bijektywną na rundę między blokami. Początkowa propozycja NIST („Cubehash8 / 1”) wymagała około 200 cykli na bajt . Po wyjaśnieniach ze strony NIST, autor zmienił propozycję na Cubehash16 / 32, która „jest około 16 razy szybsza niż CubeHash8 / 1, z łatwością doganiając zarówno SHA-256, jak i SHA-512 na platformie referencyjnej”, zachowując jednocześnie „wygodny margines bezpieczeństwa ”.
CubeHash awansował do drugiej rundy konkursu, ale nie został wybrany jako jeden z 5 finalistów. Od tego czasu Bernstein jeszcze bardziej dostroił parametry, a jego głównym zaleceniem jest CubeHash512, zdefiniowane jako CubeHash16 + 16/32 + 32–512.
Operacja
Ten opis odnosi się do najnowszej specyfikacji, a nie do przedłożenia przez NIST.
CubeHash ma 5 parametrów, pewna instancja jest oznaczona przez CubeHash i + r / b + f - h .
- i jest liczbą początkowych rund
- r to liczba rund na blok
- b to rozmiar bloku w bajtach zdefiniowany dla {1, 2, 3, ... 128}
- f to liczba ostatnich rund
- h jest rozmiarem wyjściowego skrótu w bitach, zdefiniowanym dla {8, 16, 24, 32, ... 512}
W pierwotnym składania NIST, I i K została ustalona na 10 r . Przestarzałe oznaczenie CubeHash R / b - h oznacza I , a F jest niejawnie 10 r .
Stan wewnętrzny jest definiowany jako pięciowymiarowa tablica słów (czterobajtowe liczby całkowite), 0-1 w obu wymiarach. Słowa odnoszą się do ich współrzędnych [00000] do [11111]. Słowa są traktowane jako little-endian.
Stan wewnętrzny jest inicjowany przez ustawienie pierwszych trzech słów ([00000], [00001], [00010]) odpowiednio na h / 8, b i r , a wszystkie pozostałe słowa na zero. Stan jest następnie przeprowadzany przez i rundy i etap inicjalizacji jest zakończony. Stan jest teraz wektorem inicjalizacyjnym (IV). IV można zapisać i ponownie wykorzystać dla danej kombinacji h , b , r .
Wiadomość jest dopełniana i dzielona na bloki b- bajtowe. Wypełnienie dołącza 1 bit, po którym następuje tyle 0 bitów, ile potrzeba, aby utworzyć pełny blok.
Każdy blok jest wprowadzany przez XOR do pierwszych b bajtów stanu, a następnie wykonuje r rund transformacji.
Ostatecznie 1 jest XORowane do słowa stanowego [11111], a następnie wykonywanych jest f rund transformacji.
Wynikowy skrót jest teraz zawarty w pierwszych h / 8 bajtów tego stanu końcowego.
Funkcja Round
Funkcja rundy CubeHash składa się z następujących dziesięciu kroków:
- Dodaj x [ 0 jklm] do x [ 1 jklm] modulo 2 32 , dla każdego (j, k, l, m).
- Obróć x [ 0 jklm] w górę o 7 bitów, dla każdego (j, k, l, m).
- Zamień x [ 00 klm] na x [ 01 klm], dla każdego (k, l, m).
- Xor x [ 1 jklm] do x [ 0 jklm], dla każdego (j, k, l, m).
- Zamień x [ 1 jk 0 m] na x [ 1 jk 1 m], dla każdego (j, k, m).
- Dodaj x [ 0 jklm] do x [ 1 jklm] modulo 2 32 , dla każdego (j, k, l, m).
- Obróć x [ 0 jklm] w górę o 11 bitów, dla każdego (j, k, l, m).
- Zamień x [ 0 j 0 lm] na x [ 0 j 1 lm], dla każdego (j, l, m).
- Xor x [ 1 jklm] do x [ 0 jklm], dla każdego (j, k, l, m).
- Zamień x [ 1 jkl 0 ] na x [ 1 jkl 1 ], dla każdego (j, k, l).
Przykładowe skróty
W tym przykładzie zastosowano CubeHash80 + 8/1 + 80-512. Wektor inicjalizacji jest taki sam dla wszystkich skrótów 80 + 8/1 + f -512 i przedstawia się następująco:
5df39869c73009fb108994600f1626e6f37c07360c0d8bb53d19cf57b8e74133\ 5b8034a3eff9892014c4ff315038ef2a391812fe52a440e9a293527d12ca4570\ 6e0958933470bf814aa4909adb3ec39384e9c314d0db874af21d45bcacb31252\ 1ce5ab6a3bf6f05de88abbdd0fcfd3fafb8225d546242eada52540095c3da221
Haszowanie wiadomości ASCII „Hello” (szesnastkowo: 0x48, 0x65, 0x6c, 0x6c, 0x6f) wykorzystuje 6 bloków wiadomości. Wiadomość zawiera 5 bloków, a ponieważ jest to wejście wyrównane do bajtów, istnieje 1 blok do wypełnienia. 512-bitowa wartość skrótu to:
7ce309a25e2e1603ca0fc369267b4d43f0b1b744ac45d6213ca08e7567566444\ 8e2f62fdbf7bbd637ce40fc293286d75b9d09e8dda31bd029113e02ecccfd39b
Niewielka zmiana w wiadomości, taka jak przerzucenie pojedynczego bitu, gwałtownie zmieni wynik skrótu z powodu efektu lawiny . Hashowanie wiadomości „hello” (różniącej się od „Hello” tylko 1-bitową pozycją) daje następującą wartość skrótu:
01ee7f4eb0e0ebfdb8bf77460f64993faf13afce01b55b0d3d2a63690d25010f\ 7127109455a7c143ef12254183e762b15575e0fcc49c79a0471a970ba8a66638
Zmiana parametrów
CubeHash pozwala na użycie wielu różnych parametrów do określenia wartości wyjściowej skrótu. Użytkownik decyduje, jakich parametrów chce użyć. Oto kilka przykładowych skrótów różnych wiadomości z różnymi parametrami. Wszystkie wiadomości są w ASCII.
message: "" (the zero-length string)
CubeHash160+16/32+160-512: 4a1d00bbcfcb5a9562fb981e7f7db3350fe2658639d948b9d57452c22328bb32\
f468b072208450bad5ee178271408be0b16e5633ac8a1e3cf9864cfbfc8e043a
CubeHash80+8/1+80-512: 90bc3f2948f7374065a811f1e47a208a53b1a2f3be1c0072759ed49c9c6c7f28\
f26eb30d5b0658c563077d599da23f97df0c2c0ac6cce734ffe87b2e76ff7294
CubeHash10+1/1+10-512: 3f917707df9acd9b94244681b3812880e267d204f1fdf795d398799b584fa8f1\
f4a0b2dbd52fd1c4b6c5e020dc7a96192397dd1bce9b6d16484049f85bb71f2f
CubeHash160+16/32+160-256: 44c6de3ac6c73c391bf0906cb7482600ec06b216c7c54a2a8688a6a42676577d
CubeHash80+8/1+80-256: 38d1e8a22d7baac6fd5262d83de89cacf784a02caa866335299987722aeabc59
CubeHash10+1/1+10-256: 80f72e07d04ddadb44a78823e0af2ea9f72ef3bf366fd773aa1fa33fc030e5cb
message: "Hello"
CubeHash160+16/32+160-512: dcc0503aae279a3c8c95fa1181d37c418783204e2e3048a081392fd61bace883\
a1f7c4c96b16b4060c42104f1ce45a622f1a9abaeb994beb107fed53a78f588c
CubeHash80+8/1+80-512: 7ce309a25e2e1603ca0fc369267b4d43f0b1b744ac45d6213ca08e7567566444\
8e2f62fdbf7bbd637ce40fc293286d75b9d09e8dda31bd029113e02ecccfd39b
CubeHash10+1/1+10-512: 13cf99c1a71e40b135f5535bee02e151eb4897e4de410b9cb6d7179c677074eb\
6ef1ae9a9e685ef2d2807509541f484d39559525179d53838eda95eb3f6a401d
CubeHash160+16/32+160-256: e712139e3b892f2f5fe52d0f30d78a0cb16b51b217da0e4acb103dd0856f2db0
CubeHash80+8/1+80-256: 692638db57760867326f851bd2376533f37b640bd47a0ddc607a9456b692f70f
CubeHash10+1/1+10-256: f63041a946aa98bd47f3175e6009dcb2ccf597b2718617ba46d56f27ffe35d49
message: "The quick brown fox jumps over the lazy dog"
CubeHash160+16/32+160-512: bdba44a28cd16b774bdf3c9511def1a2baf39d4ef98b92c27cf5e37beb8990b7\
cdb6575dae1a548330780810618b8a5c351c1368904db7ebdf8857d596083a86
CubeHash80+8/1+80-512: ca942b088ed9103726af1fa87b4deb59e50cf3b5c6dcfbcebf5bba22fb39a6be\
9936c87bfdd7c52fc5e71700993958fa4e7b5e6e2a3672122475c40f9ec816ba
CubeHash10+1/1+10-512: eb7f5f80706e8668c61186c3c710ce57f9094fbfa1dbdc7554842cdbb4d10ce4\
2fce72736d10b152f6216f23fc648bce810a7af4d58e571ec1b852fa514a0a8e
CubeHash160+16/32+160-256: 5151e251e348cbbfee46538651c06b138b10eeb71cf6ea6054d7ca5fec82eb79
CubeHash80+8/1+80-256: 94e0c958d85cdfaf554919980f0f50b945b88ad08413e0762d6ff0219aff3e55
CubeHash10+1/1+10-256: 217a4876f2b24cec489c9171f85d53395cc979156ea0254938c4c2c59dfdf8a4
Wektory inicjalizacyjne dla czterech przedstawionych wariantów są również różne. Na przykład wektor inicjujący dla CubeHash80 + 8/1 + 80-512 można zobaczyć powyżej, a IV dla CubeHash80 + 8/1 + 80-256 to:
830b2bd5273d616fd785876a4a500218a5388963eeb702fb47547842459f8d89\ 8727a1c8ba40bd48cef47fe82543c2735c033052ae9fcd632d4541bde6b6cb0d\ cb8a9cdf579f5b67b2ae00968180af6e51ebdf0ca597cd2bf91f981f7ab29a62\ 01ad72d946e6c075c6d1337e0a293d6f90c438ac38be153f32aa288ffc5eca8a
Bezpieczeństwo
Siła tej funkcji rośnie, gdy b maleje do 1, a r rośnie. CubeHash 8 / 1-512 jest więc silniejszy (bezpieczniejszy) niż CubeHash 1 / 1-512, a CubeHash 1 / 1-512 jest silniejszy niż CubeHash 1 / 2-512. Najsłabszą możliwą wersją tego algorytmu jest CubeHash 1/128- h . Istnieje jednak kompromis między bezpieczeństwem a czasem. W przypadku bezpieczniejszej wersji obliczenie wartości skrótu zajmie więcej czasu niż w przypadku wersji osłabionej.