A Hamsi egy Grindahl [1] és Serpent [2] algoritmusokon alapuló kriptográfiai hash függvény . Ez a hash funkció nem szabadalmaztatott , és nyilvános . Az algoritmusnak két változata van : Hamsi-256 és Hamsi-512. Az algoritmus a bővítési függvényen és a ciklikus transzformáción alapul . A ciklikus transzformáció az állapotmátrix négy sorával működik . A mátrix oszlopainak száma Hamsi-256 esetében 4, Hamsi-512 esetén 8. A mátrix elemei 32 bites szavak .
Hamsi egyike volt a Nemzeti Szabványügyi és Technológiai Intézet [4] SHA-3 nyílt versenyének [ 4] , amelynek célja olyan új kriptográfiai hash függvények kifejlesztése volt , amelyek a változó hosszúságú üzeneteket rögzített hosszúságú tömörített szöveges karakterláncokká alakítják, amelyek elektronikusan használhatók. digitális aláírások , üzenet- hitelesítés és egyéb alkalmazások. A verseny első fordulójában 51 pályázó vett részt. Közülük 14-en (köztük Hamsi) jutottak tovább a második körbe [5] . Hamsi azonban nem volt a 2010. december 10-én bejelentett 5 utolsó fordulós jelölt között [6] .
Hamsi olyan transzformációkat használ, mint az összefűzés ( angol Concatenation ), a permutáció ( angol permutáció ) és a kerekítés ( angol csonkítás ), amelyeket más hash - algoritmusokban is használnak , mint például a Snefru [7] és a Grindahl . Az algoritmus minden iterációnál használja a Message expansion és Chaining value függvényeket is . A nemlineáris permutációkhoz ( eng. Non-linear Permitations ) lineáris transzformációkat és egy S-boxot használnak a Serpent blokk titkosításból . A Hamsi általános szerkezete a következőképpen ábrázolható:
egy | üzenetbővítés | E : {0, 1} → {0, 1} |
2 | Összefűzés | C : {0, 1} x {0, 1} → {0, 1} |
3 | Nemlineáris permutációk | P,P : {0, 1} → {0, 1} |
négy | Csonkolás | T : {0, 1} → {0, 1} |
Megnevezések:
F | n elemből álló végső mező |
<<< | Forgatás balra |
Exkluzív VAGY ( XOR ) | |
<< | Kis eltolás balra |
[n, m, d] | Az n hosszúság, az m méret és a d minimális távolság kódja |
A különböző Hamsi-változatok m, n és s értékeit a következő táblázat tartalmazza:
m | n | s | |
Hamsi-256 | 32 | 256 | 512 |
Hamsi-512 | 64 | 512 | 1024 |
A Legyen (M 1 ||M 2 ||M 3 || . . . ||M ||) már egy befejezett üzenet, akkor a Hamsi fajtái így írhatók le:
Hamsi-256:
h = (T ◦ P ◦ C(E(M ), h −1)) ⊕ h −1, h = v 256 , 0 < <
h = (T ◦ P ◦ C(E(M ), h −1)) ⊕ h −1
Hamsi-512:
h = (T ◦ P ◦ C(E(M ), h −1)) ⊕ h −1, h = v 512 , 0 < <
h = (T ◦ P ◦ C(E(M ), h −1)) ⊕ h −1
Az algoritmus kezdeti értéke a h kötési érték kezdeti értéke . A következő üzenet UTF-8 kódolásával szerezhető be : "Ozgul Kucuk, Katholieke Universiteit Leuven, Departement Elektrotechniek, Computer Security and Industrial Cryptography, Kasteelpark Arenberg 10, bus 2446, B-3001 Leuven-Heverlee, Belgium." Az algoritmus különböző változatainak kezdeti értékeit a következő táblázat mutatja be:
v 256 |
| ||||
v 512 |
|
A Hamsi 32 és 64 bites üzenetblokkon működik a Hamsi-256 és a Hamsi-512 algoritmusokhoz . Ha a blokk hossza kisebb a szükségesnél, akkor az üzenet kitöltése történik . A kiegészítés a következő. Egy '1' értékű bit hozzáadódik a jobb oldali üzenethez , majd '0' értékű biteket ad hozzá addig, amíg az üzenet hossza 32 vagy 64 lesz. Példa:
1010 0110 1110 1111 1111 0000 |
A 32 bites kitöltés után így fog kinézni
1010 0110 1110 1111 1111 0000 | 1000 0000 |
Hamsi lineáris kódokat [8] használ az üzenetek kiterjesztésére. A Hamsi-256 esetében a 32 bites üzenet 256 bitessé történő kiterjesztése a [128, 16, 70] kód használatával történik az F [9] mező felett . A Hamsi-512 esetében a 64 bites üzenet 512 bites üzenetté való kiterjesztése a [256, 32, 131] kód használatával történik az F mező felett .
A kiterjesztett üzenet szavaihoz (m ,m , . . . ,m ) kapcsolódási érték (c , c , . . . , c ) van hozzárendelve . Az i és j értékek Hamsi-256 esetén 7, Hamsi-512 esetén 15. Ezután a kapott üzeneten egy nemlineáris permutációt hajtanak végre P. Az összefűzési módszer határozza meg a bitek sorrendjét a P bemeneten.
Hamsi-256-nál
C: {0, 1} x{0, 1} → {0, 1} , további részletek
C(m ,m1 , ...,m7 , c 0 , c 1 , ..., c 7 ) = (m 0 , m 1 , c 0 , c 1 , c 2 , c 3 , m 2 , m 3 , m 4 , m 5 , c 4 , c 5 , c 6 , c 7 , m 6 , m 7 )
A szórendet a következő táblázat segítségével lehet a legkönnyebben megjegyezni, melynek eredményét soronkénti olvasással kaphatjuk meg:
m0 _ | m 1 | c 0 | c 1 |
c 2 | c 3 | m2 _ | m 3 |
m4 _ | m 5 | c 4 | 5 -től |
6 -tól | 7 -től | m6 _ | m 7 |
Hamsi-512-nél
C: {0, 1} × {0, 1} → {0, 1} , további részletek
C(m 0 ,m 1 , ...,m 14 , m 15 , c 0 , c 1 , ..., c 14 , c 15 ) = (m 0 , m 1 , c 0 , c 1 , m 2 ,m 3 , c 2 , c 3 , c 4 , c 5 , m 4 , m 5 , c 6 , c 7 , m 6 , m 7 , m 8 , m 9 , c 8 , c 9 , m 10 , m 11 , s 10 , s 11 , s 12 , s 13 , m 12 , m 13 , s 14 , s 15 , m 14 , m 15 )
A nemlineáris permutáció három szakaszból áll
Mindez annyiszor ismétlődik, ahány ciklusszám adott. A bemenet minden alkalommal kap egy üzenetet (s 0 , s 1 , s 2 , . . . , s j ), ahol j értéke 15 a Hamsi-256 és 31 a Hamsi-512 esetében.
1) Állandók és számláló hozzáadásaEbben a szakaszban a bemeneti üzenet, az állandók és a számláló XOR -re kerülnek . A számláló határozza meg a végrehajtott ciklus számát. Az első ciklusban c 0, a másodikban c = 1, és így tovább. A használt állandókat a következő táblázat mutatja:
α0 = 0xff00f0f0 | α 1 = 0xccccaaaa | α 2 = 0xf0f0cccc | α 3 = 0xff00aaaa |
α 4 = 0xccccaaaa | α 5 = 0xf0f0ff00 | α 6 = 0xaaaacccc | α 7 = 0xf0f0ff00 |
α8 = 0xf0f0cccc | α9 = 0xaaaaff00 | α10 = 0xccccff00 | α 11 = 0xaaaaf0f0 |
α 12 = 0xaaaaf0f0 | α13 = 0xff00cccc | α 14 = 0xccccf0f0 | α 15 = 0xff00aaaa |
α 16 = 0xccccaaaa | α 17 = 0xff00f0f0 | α 18 = 0xff00aaaa | α 19 = 0xf0f0cccc |
α20 = 0xf0f0ff00 | α 21 = 0xccccaaaa | α22 = 0xf0f0ff00 | α 23 = 0xaaaacccc |
α24 = 0xaaaaff00 | α 25 = 0xf0f0cccc | α 26 = 0xaaaaf0f0 | α 27 = 0xccccff00 |
α 28 = 0xff00cccc | α 29 = 0xaaaaf0f0 | α 30 = 0xff00aaaa | α 31 = 0xccccf0f0 |
Hamsi-256-nál
(s 0 , s 1 , . . . , s 15 ) := (s 0 ⊕ α 0 , s 1 ⊕ α 1 ⊕ c, s 2 , ...
Hamsi-512-nél
(s 0 , s 1 , . . . , s 31 ) := (s 0 ⊕ α 0 , s 1 ⊕ α 1 ⊕ c, s 2 , ...
2) Helyettesítési szakaszEbben a szakaszban megtörténik a Serpent algoritmusból vett 4 bites S-boxok helyettesítése . A Hamsi nagyon jól megtervezett a párhuzamos számításokhoz . Mind a 128 egyforma S-box (256 a Hamsi-512-nél) egyszerre számítható, ami felgyorsítja az algoritmust. Hamsiban használt S-box :
x | 0 | egy | 2 | 3 | négy | 5 | 6 | 7 | nyolc | 9 | tíz | tizenegy | 12 | 13 | tizennégy | tizenöt |
s[x] | nyolc | 6 | 7 | 9 | 3 | C | A | F | D | egy | E | négy | 0 | B | 5 | 2 |
A transzformációs lépés az L lineáris transzformáció több alkalmazásán alapul : {0, 1} → {0, 1} . L 32 bites szavakkal működik. Általában a transzformációt így írhatjuk fel (s i , s j , s k , s l ) := L(s i , s j , s k , s l ) .
Az L(a, b, c, d) transzformáció részletesebb leírása :
a := a <<< 13
c := c <<< 3
b := b ⊕ a ⊕ c
d := d ⊕ c ⊕ (a << 3)
b := b <<< 1
d := d <<< 7
a := a ⊕ b ⊕ d
c := c ⊕ d ⊕ (b << 7)
a := a <<< 5
c := c <<< 22
A T kerekítés : {0, 1} 512 → {0, 1} 256 Hamsi-256-ban a következőképpen definiálható:
T (s 0 , s 1 , s 2 , . . ., s 14 , s 15 ) = (s 0 , s 1 , s 2 , s 3 , s 8 , s 9 , s 10 , s 11 )
A Hamsi-512 T kerekítésben: {0, 1} 1024 → {0, 1} 512 a következőképpen van definiálva:
T (s 0 , s 1 , s 2 , ..., s 30 , s 31 ) = (s 0 , s 1 , s 2 , s 3 , s 4 , s 5 , s 6 , s 7 , s 16 , s 17 , s 18 , s 19 , s 20 , s 21 , s 22 , s 23 )
A kerekítés a nemlineáris permutáció utolsó ciklusa után történik.
A P és P f nemlineáris permutációk csak konstansokban különböznek egymástól. Ezenkívül a P f csak az utolsó üzenetblokkra vonatkozik végső transzformációként.
P f konstansai :
α 0 = 0xcaf9639c | α1 = 0x0ff0f9c0 | α2 = 0x639c0ff0 | α 3 = 0xcaf9f9c0 |
α4 = 0x0ff0f9c0 | α 5 = 0x639ccaf9 | α6 = 0xf9c00ff0 | α 7 = 0x639ccaf9 |
α8 = 0x639c0ff0 | α9 = 0xf9c0caf9 | α10 = 0x0ff0caf9 | α 11 = 0xf9c0639c |
α 12 = 0xf9c0639c | α13 = 0xcaf90ff0 | α14 = 0x0ff0639c | α 15 = 0xcaf9f9c0 |
α 16 = 0x0ff0f9c0 | α 17 = 0xcaf9639c | α 18 = 0xcaf9f9c0 | α19 = 0x639c0ff0 |
α20 = 0x639ccaf9 | α 21 = 0x0ff0f9c0 | α22 = 0x639ccaf9 | α 23 = 0xf9c00ff0 |
α 24 = 0xf9c0caf9 | α25 = 0x639c0ff0 | α 26 = 0xf9c0639c | α 27 = 0x0ff0caf9 |
α 28 = 0xcaf90ff0 | α 29 = 0xf9c0639c | α 30 = 0xcaf9f9c0 | α 31 = 0x0ff0639c |
A Hamsi különböző változataihoz tartozó ciklusok számát a táblázat tartalmazza:
Hamsi-256 | Hamsi-512 | |
P ciklusok | 3 | 6 |
P f ciklusok | 6 | 12 |
Az SHA-3 verseny második fordulójában megjelent az algoritmus új módosítása, a Hamsi-256/8. A Hamsi-256-hoz képest az a különbség, hogy a Pf ciklusok száma most 8.