SIMD (hashfunktion)

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 27 oktober 2021; kontroller kräver 2 redigeringar .
SIMD
Skapad 2008
publiceras oktober 2008
Hash storlek 256 eller 512 bitar
Antal omgångar fyra
Sorts hash-funktion

SIMD  är en iterativ kryptografisk hashfunktion utvecklad av Gaëtan Leurent, Charles Bouillaguet, Pierre-Alain Fouque. Hon nominerades som en kandidat till standardtävlingen SHA-3 som hölls av National Institute of Standards and Technology (USA) , där hon tog sig till den andra omgången [1] .

Det finns två versioner av hashfunktionen, SIMD-256 och SIMD-512, som omvandlar ett meddelande av godtycklig längd till ett 256 eller 512-bitars hashvärde, även kallat meddelandesammandrag . Dessutom är det möjligt att definiera SIMD-n hashfunktioner som trunkering av SIMD-256 och SIMD-512 funktioner för n<256 respektive 256<n<512 [2] .

Enligt skaparna är hashfunktionens huvudfunktion en betydande expansion av meddelandet, vilket gör att du kan skydda dig mot differentiell kryptoanalys [3] .

Algoritm

Allmän beskrivning och parametrar

Huvuddelen av hashfunktionen h är komprimeringsfunktionen . För att beräkna h(M) delas meddelandet M i k delar om m bitar vardera. Komprimeringsfunktionen : appliceras sedan iterativt på meddelandedelarna . Initialtillståndet eller initialiseringsvektorn är designad och fixerad för varje SIMD-familjefunktion. Det slutliga resultatet av hashfunktionen erhålls genom att applicera avslutningsfunktionen på .

C-komprimeringsfunktionen i Davis-Meier- läge byggs vanligtvis med blockchifferfunktionen : , men flera förbättringar används för SIMD-hashfunktionen.

SIMD-familjen av hashfunktioner använder följande parametrar:

Hashstorlek, n Meddelandeblockstorlek, m Intern tillståndsstorlek( ), sid
SIMD-256 256 512 512
SIMD-512 512 1024 1024

Det interna tillståndet representeras av en 4x4-matris med 32-bitars ord för SIMD-256 och 8x4 för SIMD-512.


Kompressionsfunktion

SIMD-kompressionsfunktionen är baserad på Davis-Meyer-designen med vissa modifieringar.

Först, istället för komprimeringsfunktionen , .

För det andra, istället för XOR-operationen för och i SIMD, används flera ytterligare Feistel-rundor med h som inmatningsnyckel. Denna åtgärd utförs av funktionen .

Således definieras komprimeringsfunktionen som . Enligt författarna till SIMD-hashfunktionen ger dessa modifieringar samma säkerhetsnivå som den ursprungliga Davis-Meyer-designen, men förhindrar samtidigt vissa typer av multi-block attacker [4] .

Meddelandetillägg

Meddelandeexpansionen av hashfunktionen SIMD-256 (resp. SIMD-512) omvandlar ett meddelandeblock på 512 bitar (resp. 1024 bitar) till ett utökat meddelande på 4096 bitar (resp. 8192 bitar) med ett minsta avstånd på 520 ( resp. .1032).

Användning av Feistel-nätverket

Användningen av Feistel-strukturen av SIMD-hashfunktionen är konstruerad på samma sätt som MD/SHA-familjen av hashfunktioner:

eller i ett mer bekvämt format:

för SIMD-256

för SIMD-512

där är en logisk funktion, är modulo-addition och är ett vänstercykliskt skift per bit.

4 parallella Feistel-celler används för SIMD-256 (resp. 8 för SIMD-512), som interagerar med varandra på grund av permutationer . Permutationerna är valda för att säkerställa god blandning.

För SIMD-256 är det definierat:

Följaktligen för SIMD-512:

I allmänhet fungerar komprimeringsfunktionen i 4 omgångar, som var och en består av 8 steg (steg), plus ytterligare en sista omgång.

Slutlig komprimeringsfunktion

Efter att alla block i meddelandet har komprimerats, görs ytterligare ett ytterligare anrop till komprimeringsfunktionen med storleken på meddelandet som indata. I detta fall beräknas meddelandets längd i bitar modulo om det behövs.

För den slutliga komprimeringsfunktionen används en något modifierad meddelandeexpansionsmetod:

för SIMD-256 används istället för .

Följaktligen, för SIMD-512, istället för att använda

Således skiljer sig det utökade meddelandeintervallet för det sista steget från det utökade meddelandeintervallet av meddelandekroppsblock.

Efter att ha tillämpat den slutliga komprimeringsfunktionen är utdata följande strängrepresentation:

för SIMD-256

för SIMD-512

I fallet med SIMD-n matas de första n bitarna av SIMD-256 (n < 256) eller SIMD 512 (256 < n < 512). Till exempel, för SIMD-384 blir utgången

Initialiseringsvektor

Varje SIMD-familjs hashfunktion använder sin egen IV för att undvika länkar mellan utgångarna från olika SIMD-n-funktioner. IV för SIMD-n-funktionen definieras enligt följande:

IV = SIMD-Compress(0, "SIMD-(i)" v1.0, 0) där strängen är i ASCII utfylld med nollor och (i) är decimalrepresentationen av n.

IV-värden för olika hashfunktioner i SIMD-familjen:

Förbättringar för den andra omgången av SHA-3- tävlingen

2 delar av algoritmen har genomgått förändringar: permutationer och cykliska skift (rotationer) [5] .

När de valde nya permutationer vägleddes författarna till hashfunktionen av följande kriterier:


SIMD-256. Inledande permutationer:

Nya permutationer:

var . Således ökade antalet permutationer från 2 till 3.


SIMD-512. Inledande permutationer:

Nya permutationer:

var . Således ökade antalet permutationer från 4 till 7.

SIMD-pseudokod [6]

1: funktion MessageExpansion(M, f) //f markerar den slutliga komprimeringsfunktionen 2: om f = 0 då 3: y(i) = NTT(M + X127) //respektive X255 för SIMD-512 4:annat 5: y(i) = NTT(M + X127 + X125) //respektive X255 + X253 för SIMD-512 6: slut om 7: Beräkna Z(i,j) genom att tillämpa inre koder I(185) och I(233) på y(i). 8: Beräkna W(i,j) genom att tillämpa permutationer för Z(i,j) 9: Returnera W(i,j) 10: slutfunktion elva: 12: funktionsrunda(S, i, r) 13: S = Steg(S; W(8i+0); IF; r0; r1) 14: S = Steg(S; (W8i+1); IF; r1; r2) 15: S = Steg(S; W(8i+2); IF; r2; r3) 16: S = Steg(S; W(8i+3); IF; r3; r0) 17: S = Steg(S; W(8i+4);MAJ; r0; r1) 18: S = Steg(S; W(8i+5);MAJ; r1; r2) 19: S = Steg(S; W(8i+6);MAJ; r2; r3) 20: S = Steg(S; W(8i+7); MAJ; r3; r0) 21: retur S 22: slutfunktion 23: 24: funktion SIMD-Compress(IV, M, f) 25: W = MessageExpansion(M; f) 26: S = IV x eller M 27: S = Rund(S; 0; [3; 20; 14; 27]) 28: S = Rund(S; 1; [26; 4; 23; 11]) 29: S = Rund(S; 2; [19; 28; 7; 22]) 30: S = Rund(S; 3; [15; 5; 29; 9]) 31: S = Steg(S; IV(0); IF; 15; 5) 32: S = Steg(S; IV(1); IF; 5; 29) 33: S = Steg(S; IV(2); IF; 29; 9) 34: S = Steg(S; IV(3); IF; 9; 15) 35: retur S 36: slutfunktion 37: 38: funktion SIMD(M) 39: Dela upp meddelandet M i delar M(i); 0 =<i<k. 40: M(k-1) fylld med nollor. 41:S=IV 42: för 0 =< i < k do 43: S = SIMD-Compress(S; M(i); 0) 44: slut för 45: S = SIMD-Compress(S; ||M||; 1) 46: returnera Truncate(S) 47: slutfunktion

Exempelresultat [7]

Meddelande M SIMD-256(M)
Tomt meddelande 8029e81e7320e13ed9001dc3d8021fec695b7a25cd43ad805260181c35fcaea8
0x00; 0x01; 0x02; … 0x3f 5bebdb816cd3e6c8c2b5a42867a6f41570c4b917f1d3b15aabc17f24679e6acd
Meddelande M SIMD-512(M)
Tomt meddelande 51a5af7e243cd9a5989f7792c880c4c3168c3d60c4518725fe5757d1f7a69c63

66977eaba7905ce2da5d7cfd07773725f0935b55f3efb954996689a49b6d29e0

0x00; 0x01; 0x02; … 0x3f 8851ad0a57426b4af57af3294706c0448fa6accf24683fc239871be58ca913fb

ee53e35c1dedd88016ebd131f2eb0761e97a3048de6e696787fd5f54981d6f2c

Prestanda

Oberoende prestandatester av SIMD-algoritmen, utförda med eBASH benchmark , visade följande resultat (hastigheten anges i cykler per byte ( cpb )) [8] [3] :

CPU Core i5 Core 2 (45nm) Core 2 (65nm)
SIMD-256 7,51 cbp 9,18 cbp 11,34 cbp
SIMD-512 8,63 cbp 10,02 cpb 12,05 cpb

Samtidigt läggs ungefär hälften av hashfunktionens tid på meddelandeexpansionsoperationen: Number-Theoretic Transform (NTT) är den dyraste delen av algoritmen sett till prestanda.

SIMD-komprimeringsfunktionen har en delvis parallell arkitektur, vilket gör att du kan skapa effektiva implementeringar av algoritmen med hjälp av vektorinstruktioner ( SIMD ). Dessa instruktioner finns tillgängliga på många välkända arkitekturer: SSEx86 , AltiVecPowerPC , IwMMXtARM .

När det gäller RAM-krav behöver SIMD-hash-funktionen minne för att lagra internt tillstånd (64 byte för SIMD-256 och 128 byte för SIMD-512) och minne för NTT-utgångsvärden (4*64 = 256 byte för SIMD-256) och 4*128 = 512 byte för SIMD-512).

Resultat av SHA-3-tävlingen för SIMD

SIMD-hashfunktionen valdes inte ut som finalist i SHA-3-tävlingen.

Tävlingsexperterna noterade att även om SIMD-hashfunktionen till stor del upprepar algoritmerna för MD/SHA-familjerna, gjorde de förbättringar som gjorts av författarna det verkligen möjligt att skydda SIMD från många typer av attacker (till exempel en kollisionsattack ). Dessutom kunde ändringarna som gjordes för den andra omgången skydda SIMD-hashfunktionen från den differentiella kryptoanalysattacken utförd av Mendel och Nad, som SIMD utsattes för i sin ursprungliga implementering [9] .

De höga RAM- kraven och tillgängligheten av SIMD-instruktioner för bra prestanda gör dock hashfunktionen till en dålig kandidat för FPGA- implementering [10] . Främst av denna anledning kom SIMD-hashfunktionen inte till slutskedet av tävlingen.

Anteckningar

  1. SHA-3 omgång 2 kandidater .
  2. Officiell beskrivning av SIMD-hashfunktionen , sid. 9.
  3. 1 2 Officiell webbplats för SIMD-hashfunktionen .
  4. Officiell beskrivning av SIMD-hashfunktionen , sid. 7-8.
  5. Förbättringar av SIMD-hash-funktionen för den andra omgången av SHA-3-tävlingen , sid. 1-2.
  6. Officiell beskrivning av SIMD-hashfunktionen , sid. 22.
  7. Officiell beskrivning av SIMD-hashfunktionen , sid. 43-270.
  8. eBASH benchmark officiella webbplats .
  9. Rapportera med resultaten av den andra omgången av SHA-3-tävlingen .
  10. Implementering av SHA-3-tävlingskandidater på FPGA.

Litteratur