Hamsi on kryptografinen hajautusfunktio, joka perustuu Grindahlin [1] ja Serpent [2] algoritmeihin . Tätä hash-toimintoa ei ole patentoitu ja se on julkisessa käytössä . Algoritmeja on kaksi : Hamsi-256 ja Hamsi-512. Algoritmi perustuu laajennusfunktioon ja sykliseen muunnokseen . Syklinen muunnos toimii tilamatriisin neljällä rivillä . Tämän matriisin sarakkeiden lukumäärä on 4 Hamsi-256:lle, 8 Hamsi-512:lle. Matriisin elementit ovat 32- bittisiä sanoja .
Hamsi osallistui Kansallisen Standardi- ja teknologiainstituutin [4] SHA-3 avoimeen kilpailuun [ 4] kehittääkseen uusia kryptografisia hajautusfunktioita , jotka muuntavat muuttuvan pituiset viestit kiinteäpituisiksi pakatuiksi tekstijonoiksi, joita voidaan käyttää sähköisessä muodossa . digitaaliset allekirjoitukset , viestien todennus ja muut sovellukset. Kilpailun ensimmäiseen kierrokseen osallistui 51 ehdokasta. Heistä 14 (mukaan lukien Hamsi) eteni toiselle kierrokselle [5] . Hamsi ei kuitenkaan ollut 10.12.2010 julkistetun viiden viimeisen kierroksen ehdokkaan joukossa [6] .
Hamsi käyttää muunnoksia, kuten ketjuttamista ( englanniksi Concatenation ), permutaatiota ( englanniksi Permutation ) ja pyöristystä ( englanniksi Truncation ), joita käytetään myös muissa hajautusalgoritmeissa , kuten Snefru [7 ] ja Grindahl . Algoritmi käyttää myös Message Expansion - ja Chaining value - funktioita kussakin iteraatiossa . Epälineaarisille permutaatioille ( eng. Non-linear Permitations ) käytetään lineaarisia muunnoksia ja yhtä S-laatikkoa Serpent - lohkosalauksesta . Hamsin yleinen rakenne voidaan esittää seuraavasti:
yksi | viestin laajennus | E : {0, 1} → {0, 1} |
2 | Yhdistäminen | C : {0, 1} x {0, 1} → {0, 1} |
3 | Epälineaariset permutaatiot | P,P : {0, 1} → {0, 1} |
neljä | Katkaisu | T : {0, 1} → {0, 1} |
Nimitykset:
F | n elementin lopullinen kenttä |
<<< | Kierrä vasemmalle |
Yksinomainen OR ( XOR ) | |
<< | Bittinen siirto vasemmalle |
[n, m, d] | Pituuden n koodi , mitta m ja minimietäisyys d |
Eri Hamsi-muunnelmien m-, n- ja s-arvot on esitetty seuraavassa taulukossa:
m | n | s | |
Hamsi-256 | 32 | 256 | 512 |
Hamsi-512 | 64 | 512 | 1024 |
Olkoon (M 1 ||M 2 ||M 3 || . . . ||M ||) on jo valmis viesti, niin Hamsin lajikkeet voidaan kuvata seuraavasti:
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
Algoritmin alkuarvo on sidosarvon h alkuarvo . Se saadaan käyttämällä seuraavan viestin UTF-8- koodausta : "Ozgul Kucuk, Katholieke Universiteit Leuven, Departement Elektrotechniek, Computer Security and Industrial Cryptography, Kasteelpark Arenberg 10, bus 2446, B-3001 Leuven-Heverlee, Belgia." Algoritmin eri muunnelmien alkuarvot on esitetty seuraavassa taulukossa:
v 256 |
| ||||
v 512 |
|
Hamsi toimii 32- ja 64 - bittisillä sanomalohkoilla Hamsi-256- ja Hamsi-512- algoritmeille . Jos lohkon pituus on pienempi kuin on tarpeen, tapahtuu viestin täyttö . Lisäys on seuraava. Oikealla olevaan viestiin lisätään yksi bitti , jonka arvo on '1' ja sitten bittejä , joiden arvo on "0", kunnes viestin pituus on 32 tai 64. Esimerkki:
Siellä on 24- bittinen viesti
1010 0110 1110 1111 1111 0000 |
32- bittisen täytön jälkeen se näyttää tältä
1010 0110 1110 1111 1111 0000 | 1000 0000 |
Hamsi käyttää lineaarisia koodeja [8] viestien laajentamiseen. Hamsi-256:ssa 32-bittisen viestin laajentaminen 256 - bittiseksi sanomaksi tehdään käyttämällä koodia [128, 16, 70] F [9] -kentän päällä . Hamsi-512:ssa 64-bittisen viestin laajentaminen 512 - bittiseksi viestiksi tehdään käyttämällä koodia [256, 32, 131] F-kentän päällä .
Laajennetun viestin sanoille (m ,m , . . . ,m ) on annettu linkitysarvo (c , c , . . . , c ). i- ja j-arvot ovat 7 Hamsi-256:lle ja 15 Hamsi-512:lle. Tämän jälkeen vastaanotetulle viestille suoritetaan epälineaarinen permutaatio P. Ketjutusmenetelmä määrittää bittien järjestyksen tulossa P.
Osoitteessa Hamsi-256
C: {0, 1} x{0, 1} → {0, 1} , lisätietoja
C(m ,m1 ,...,m7 , c0 , c1 , ...,c7 ) = (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 )
Sanajärjestys on helpoin muistaa seuraavan taulukon avulla, jonka tuloksen saa rivi riviltä lukemalla:
m0_ _ | m 1 | c 0 | c 1 |
c 2 | c 3 | m2 _ | m 3 |
m4 _ | m 5 | c 4 | alkaen 5 |
alkaen 6 | alkaen 7 | m6 _ | m 7 |
Osoitteessa Hamsi-512
C: {0, 1} × {0, 1} → {0, 1} , lisätietoja
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 )
Epälineaarinen permutaatio koostuu kolmesta vaiheesta
Kaikki tämä toistetaan niin monta kertaa kuin syklien lukumäärä on annettu. Tulo vastaanottaa joka kerta viestin (s 0 , s 1 , s 2 , . . . , s j ), jossa j on 15 Hamsi-256:lle ja 31 Hamsi-512:lle.
1) Vakioiden ja laskurin lisääminenTässä vaiheessa syöttöviesti, vakiot ja laskuri on XORed . Laskuri määrittää suoritetun jakson numeron. Ensimmäisellä jaksolla c on 0, toisessa c = 1 ja niin edelleen. Käytetyt vakiot on esitetty seuraavassa taulukossa:
α0 = 0xff00f0f0 | α 1 = 0xccccaaaa | α 2 = 0xf0f0cccc | α 3 = 0xff00aaaa |
α 4 = 0xccccaaaa | α 5 = 0xf0f0ff00 | a 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 |
Osoitteessa Hamsi-256
(s 0 , s 1 , . . . . , s 15 ) := (s 0 ⊕ α 0 , s 1 ⊕ α 1 ⊕ c, s 2 , . . . , s 15 ⊕ α 15 )
Osoitteessa Hamsi-512
(s 0 , s 1 , . . . . , s 31 ) := (s 0 ⊕ α 0 , s 1 ⊕ α 1 ⊕ c, s 2 , . . . , s 31 ⊕ α 31 )
2) KorvausvaiheTässä vaiheessa tapahtuu Serpent -algoritmista otettujen 4-bittisten S-laatikoiden korvaaminen . Hamsi on erittäin hyvin suunniteltu rinnakkaislaskentaan . Kaikki 128 identtistä S-laatikkoa (256 Hamsi-512:lle) voidaan laskea samanaikaisesti, mikä nopeuttaa algoritmia. S-box käytössä Hamsissa:
x | 0 | yksi | 2 | 3 | neljä | 5 | 6 | 7 | kahdeksan | 9 | kymmenen | yksitoista | 12 | 13 | neljätoista | viisitoista |
s[x] | kahdeksan | 6 | 7 | 9 | 3 | C | A | F | D | yksi | E | neljä | 0 | B | 5 | 2 |
Muunnosvaihe perustuu lineaarisen muunnoksen L useisiin sovelluksiin: {0, 1} → {0, 1} . L toimii 32-bittisillä sanoilla. Yleensä muunnos voidaan kirjoittaa muodossa (s i , s j , s k , s l ) := L(s i , s j , s k , s l ) .
Tarkempi kuvaus muunnoksesta 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
Pyöristys T : {0, 1} 512 → {0, 1} 256 Hamsi-256:ssa määritellään seuraavasti:
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 )
Hamsi-512 pyöristyksessä T : {0, 1} 1024 → {0, 1} 512 määritellään seuraavasti:
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 )
Pyöristys suoritetaan epälineaarisen permutaation viimeisen jakson jälkeen.
Epälineaariset permutaatiot P ja P f eroavat vain vakioista. Myös P f käytetään vain viimeiseen viestilohkoon viimeisenä muunnoksena.
P f : n vakiot :
α 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 |
Hamsin eri muunnelmien syklien lukumäärä on annettu taulukossa:
Hamsi-256 | Hamsi-512 | |
P sykliä | 3 | 6 |
P f sykliä | 6 | 12 |
SHA-3- kilpailun toisella kierroksella ilmestyi uusi muunnos algoritmista nimeltä Hamsi-256/8. Sen ero Hamsi-256:sta on, että Pf - jaksojen lukumäärä on nyt 8.