Hamsi este o funcție hash criptografică bazată pe algoritmii Grindahl [1] și Serpent [2] . Această funcție hash nu este brevetată și este în domeniul public . Există două varietăți de algoritm : Hamsi-256 și Hamsi-512. Algoritmul se bazează pe funcția de expansiune și transformarea ciclică . Transformarea ciclică funcționează cu patru rânduri ale matricei de stare . Numărul de coloane din această matrice este 4 pentru Hamsi-256, 8 pentru Hamsi-512. Elementele matricei sunt cuvinte de 32 de biți .
Hamsi a fost unul dintre participanții la competiția deschisă SHA-3 [4] a Institutului Național de Standarde și Tehnologie [ 4] pentru a dezvolta noi funcții hash criptografice care convertesc mesajele de lungime variabilă în șiruri de text comprimate de lungime fixă care pot fi utilizate pentru electronice . semnături digitale , autentificare a mesajelor și alte aplicații. La primul tur al concursului au participat 51 de candidați. 14 dintre ei (inclusiv Hamsi) au avansat în turul doi [5] . Hamsi nu s-a numărat însă printre cei 5 candidați din ultimul tur anunțați pe 10 decembrie 2010 [6] .
Hamsi folosește transformări precum concatenare ( English Concatenation ), permutare ( English Permutation ) și rotunjire ( English Truncation ), care sunt, de asemenea, utilizate în alți algoritmi de hashing , cum ar fi Snefru [7] și Grindahl . Algoritmul folosește, de asemenea, funcțiile de expansiune a mesajului și de valoare Chaining la fiecare iterație . Pentru permutările neliniare ( ing. Permisiuni neliniare ) se folosesc transformări liniare și o cutie S din cifrul bloc Serpent . Structura generală a lui Hamsi poate fi reprezentată ca:
unu | extinderea mesajului | E : {0, 1} → {0, 1} |
2 | Concatenare | C : {0, 1} x {0, 1} → {0, 1} |
3 | Permutări neliniare | P,P : {0, 1} → {0, 1} |
patru | Trunchiere | T : {0, 1} → {0, 1} |
Denumiri:
F | Câmp final de n elemente |
<<< | Rotiți la stânga |
SAU exclusiv ( XOR ) | |
<< | Deplasare biți la stânga |
[n, m, d] | Cod de lungime n, dimensiune m și distanță minimă d |
Valorile m, n și s pentru diferite variante Hamsi sunt prezentate în următorul tabel:
m | n | s | |
Hamsi-256 | 32 | 256 | 512 |
Hamsi-512 | 64 | 512 | 1024 |
Fie (M 1 ||M 2 ||M 3 || . . . . ||M ||) este deja un mesaj finalizat, atunci soiurile de Hamsi pot fi descrise după cum urmează:
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
Valoarea inițială pentru algoritm este valoarea inițială a valorii de legare h . Se obține folosind codificarea UTF-8 a următorului mesaj: „Ozgul Kucuk, Katholieke Universiteit Leuven, Departement Elektrotechniek, Computer Security and Industrial Cryptography, Kasteelpark Arenberg 10, bus 2446, B-3001 Leuven-Heverlee, Belgia”. Valorile inițiale pentru diferitele variante ale algoritmului sunt prezentate în următorul tabel:
v 256 |
| ||||
v 512 |
|
Hamsi operează pe blocuri de mesaje de 32 și 64 de biți pentru algoritmii Hamsi-256 și, respectiv, Hamsi-512 . Dacă lungimea blocului este mai mică decât este necesar, atunci apare mesajul de umplere . Adăugarea este după cum urmează. La mesajul din dreapta se adaugă un bit cu valoarea „1” și apoi se adaugă biții cu valoarea „0” până când lungimea mesajului este de 32 sau 64. Exemplu:
Există un mesaj pe 24 de biți
1010 0110 1110 1111 1111 0000 |
După completarea la 32 de biți , va arăta așa
1010 0110 1110 1111 1111 0000 | 1000 0000 |
Hamsi folosește coduri liniare [8] pentru a extinde mesajele. Pentru Hamsi-256, extinderea unui mesaj de 32 de biți într-un mesaj de 256 de biți se face folosind codul [128, 16, 70] peste câmpul F [9] . Pentru Hamsi-512, extinderea unui mesaj de 64 de biți într-un mesaj de 512 de biți se face folosind codul [256, 32, 131] peste câmpul F.
Cuvintele mesajului extins (m ,m , . . . ,m ) li se atribuie o valoare de legătură (c , c , . . . . , c ). Valorile i și j sunt 7 pentru Hamsi-256 și 15 pentru Hamsi-512. Apoi, pe mesajul primit va fi efectuată o permutare neliniară P. Metoda concatenării determină ordinea biților la intrarea P.
La Hamsi-256
C: {0, 1} x{0, 1} → {0, 1} , mai multe detalii
C(m , m1 , ...,m7 , c0 , c1 ,...,c7 ) = ( m0 , m1 , c0 , c1 , c2 , c3 , m2 , m 3 ,m 4 , m 5 , c 4 , c 5 , c 6 , c 7 ,m 6 ,m 7 )
Ordinea cuvintelor este cel mai ușor de reținut folosind următorul tabel, al cărui rezultat poate fi obținut prin citirea rând cu rând:
m0 _ | m 1 | c 0 | c 1 |
c 2 | c 3 | m2 _ | m 3 |
m4 _ | m 5 | c 4 | de la 5 |
de la 6 | de la 7 | m6 _ | m 7 |
La Hamsi-512
C: {0, 1} × {0, 1} → {0, 1} , mai multe detalii
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 )
Permutarea neliniară constă din trei etape
Toate acestea se repetă de câte ori este dat numărul de cicluri. Intrarea primește de fiecare dată un mesaj (s 0 , s 1 , s 2 , . . . , s j ), unde j este 15 pentru Hamsi-256 și 31 pentru Hamsi-512.
1) Adăugarea constantelor și a contoruluiÎn această etapă, mesajul de intrare, constantele și contorul sunt XOR . Contorul determină numărul ciclului executat. Pentru primul ciclu, c este 0, pentru al doilea, c = 1 și așa mai departe. Constantele utilizate sunt prezentate în următorul tabel:
α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 |
La Hamsi-256
(s 0 , s 1 , . . . , s 15 ) := (s 0 ⊕ α 0 , s 1 ⊕ α 1 ⊕ c, s 2 , . . . , s 15 ⊕ α 15 )
La Hamsi-512
(s 0 , s 1 , . . . , s 31 ) := (s 0 ⊕ α 0 , s 1 ⊕ α 1 ⊕ c, s 2 , . . . , s 31 ⊕ α 31 )
2) Etapa de înlocuireÎn această etapă, are loc înlocuirea cutiilor S pe 4 biți preluate din algoritmul Serpent . Hamsi este foarte bine proiectat pentru calculul paralel . Toate cele 128 de cutii S identice (256 pentru Hamsi-512) pot fi calculate în același timp, ceea ce accelerează algoritmul. S-box folosit în Hamsi:
X | 0 | unu | 2 | 3 | patru | 5 | 6 | 7 | opt | 9 | zece | unsprezece | 12 | 13 | paisprezece | cincisprezece |
s x] | opt | 6 | 7 | 9 | 3 | C | A | F | D | unu | E | patru | 0 | B | 5 | 2 |
Etapa de transformare se bazează pe mai multe aplicații ale transformării liniare L: {0, 1} → {0, 1} . L operează pe cuvinte de 32 de biți. În general, transformarea poate fi scrisă ca (s i , s j , s k , s l ) := L(s i , s j , s k , s l ) .
O descriere mai detaliată a transformării L(a, b, c, d) :
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
Rotunjirea T : {0, 1} 512 → {0, 1} 256 în Hamsi-256 este definită după cum urmează:
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 )
În Hamsi-512 rotunjirea T : {0, 1} 1024 → {0, 1} 512 este definit după cum urmează:
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 )
Rotunjirea se realizează după ciclul final al permutării neliniare.
Permutările neliniare P și P f diferă numai în constante. De asemenea, P f este aplicat doar ultimului bloc de mesaj ca transformare finală.
Constante pentru P f :
α 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 |
Numărul de cicluri pentru diferite variante de Hamsi este prezentat în tabel:
Hamsi-256 | Hamsi-512 | |
cicluri P | 3 | 6 |
P f cicluri | 6 | 12 |
În a doua rundă a competiției SHA-3 , a apărut o nouă modificare a algoritmului numită Hamsi-256/8. Diferența sa față de Hamsi-256 este că numărul de cicluri Pf este acum 8.