SHAvite-3

SHAvite-3
Vývojáři Eli Biham nebo Dunkelman
Vytvořeno 2008
zveřejněno 2009
Velikost hash variabilní, až 512 bitů
Počet kol 12 nebo 16
Typ hashovací funkce

SHAvite-3  je kryptografická hašovací funkce vyvinutá izraelskými kryptografy Eli Bihamem a Orrem Dunkelmanem .  Jeden ze čtrnácti příspěvků ve druhém kole soutěže SHA-3 sponzorované organizací NIST . SHAvite-3 je založen na kombinaci komponent AES s rámcem HAIFA . Tato hašovací funkce využívá kryptografická primitiva, jako je Feistelova síť a Davis-Meierova konstrukce. Rodina hašovacích funkcí SHAvite-3 zahrnuje dva algoritmy – SHAvite-3 256 a SHAvite-3 512 [1] .  

Název

Název funkce SHAVite-3 se vyslovuje jako „shavait shalosh“ ( hebrejsky ‏shavait tři ‏‎). Autoři to tak pojmenovali z následujících důvodů [2] :

Historie

Algoritmus SHAvite-3 byl speciálně navržen pro soutěž SHA-3 . Mezi požadavky na hashovací funkci patřila schopnost získat výtahy o délce 224, 256, 384 a 512 bitů, které by nahradily rodinu kryptografických algoritmů SHA-2 [3] . Autoři SHAvite-3 vyvinuli dvě funkce: SHAvite-3 256 pro generování 224, 256 bitových výtahů a SHAvite-3 512 pro generování 384 a 512 bitových výtahů. V důsledku prvního kola soutěže byla nalezena zranitelnost v základním algoritmu blokové šifry, která však nevedla ke kompromitaci hashovací funkce [4] [5] .

Autoři navrhli úpravu verze původně přihlášené do soutěže za účelem zvýšení bezpečnosti algoritmu. Změna se nazývala vylepšená verze a týkala se jak SHAvite-3 256 , tak SHAvite-3 512 [2] . Následovala oprava chyby v implementaci funkce AES round a zlepšená kryptografická síla SHAvite-3 512 zvýšením počtu kol ze 14 na 16 [6] . Funkce se dostala do druhého kola soutěže kryptografických funkcí, ale do finále nebyla připuštěna z důvodu nedostatečného zabezpečení inicializace S-boxů pod blokovou šifrou, což vedlo k relativně nízké úrovni zabezpečení v 512. -bitová verze [7] [8] [9] . Současně měla hašovací funkce relativně nízkou propustnost [10] .

Designové prvky

Funkce hashovací funkce SHAVite-3 jsou [1] :

Algoritmus

AES kolo

Ve svém jádru SHAVite-3 používá kolo AES [1] . Kolo definuje operace na 128bitovém čísle . 128bitová data jsou rozdělena do 16 bloků po 8 bitech, poté jsou bloky zapsány jako matice 4×4. Každý prvek matice představuje hodnotu v poli GF(2 8 ). Kolo se skládá ze sekvenční aplikace operací SubBytes ( ), ShiftRows ( ), MixColumns ( ) a sčítání modulo 2 pomocí kulaté klávesy .

A E S R Ó u n d s u b k E y ( X ) = M C ( S R ( S B ( X ) ) ) ⊕ s u b k E y {\displaystyle AESRound_{podklíč}(x)=MC(SR(SB(x)))\podklíč oplus}

haifa

SHAvite-3 je postaven na iteračním režimu pro hašovací funkce HAIFA [1] . HAIFA nastavuje pravidla, podle kterých se zpráva doplní na požadovanou délku, zkomprimuje se speciální funkcí a výstupní hodnota se zkrátí na požadovanou délku. Výpočet hashovací funkce pomocí algoritmu SHAVite-3 tedy spočívá v provedení několika kroků za sebou:

  1. Vyplnění zprávy na určitou délku, aby ji bylo možné rozdělit na bloky stejné velikosti. Označme doplněnou zprávu ;
  2. Rozdělení rozšířené zprávy na bloky stejné velikosti: ;
  3. Vezmeme-li nějakou počáteční hodnotu , kde  je hlavní počáteční hodnota,  je požadovaná velikost digestu;
  4. Výpočet následné hodnoty podle vzorce , kde  je počet bitů zprávy hashovaný časem výpočtu včetně aktuálního bloku. Jinými slovy  délka . Parametrem  je sůl . V aplikacích, kde není vyžadováno použití soli, navrhují autoři SHAvite-3 používat , přičemž umožňují snížení bezpečnosti a zvýšení výpočetní rychlosti [1] ;
  5. Zkrácení konečné hodnoty na požadovanou délku bude výsledkem výpočtu hashovací funkce.
Dokončení zprávy

Pokud je velikost původní zprávy , požadovaná velikost hodnoty hash je , a velikost bloku , na kterém funkce komprese pracuje , pak je výplň zprávy , která má délku , na násobek délky . provádí v následujícím pořadí:

  1. Jeden bit s hodnotou 1 je přidán na konec zprávy , dostaneme ;
  2. Hodnota je přiřazena , která je zakódována v bitech: ;
  3. Hodnota je přiřazena , která je zakódována v bitech: ;
  4. Po bitu 1 se vloží minimální počet nul, který je nutný k tomu, aby délka přijaté zprávy byla násobkem : . Počet nul lze vypočítat pomocí vzorce: .

Odrůdy algoritmu

Algoritmus SHAvite-3 má dvě varianty, které se liší použitou kompresní funkcí a délkou digestu [1] :

  • SHAvite-3 256 využívá funkci komprese a umožňuje získat hash dlouhý až 256 bitů;
  • SHAvite-3 512 využívá funkci komprese a umožňuje získat hash o délce 257 až 512 bitů.

Generování přehledu

Pokud je původní zpráva a chcete získat výtah délky , proveďte následující posloupnost akcí:

  1. Pojďme definovat . Nazvěme první případ a druhý - . V prvním případě , ve druhém - .
  2. Najít kde ;
  3. Vyplňte zprávu na velikost, která je násobkem =512 v prvním případě nebo až =1024 ve druhém. K tomu použijeme výše popsaný postup , kdy v prvním případě počítáme =64 a ve druhém =128. V obou případech =16;
  4. Rozdělme vyplněnou zprávu na bloky bitů a vypočítejme všechny kromě posledních dvou. Pokud je délka původní zprávy taková, že se v důsledku přidání zprávy na konec vytvoří blok, který neobsahuje jediný bit původní zprávy, pak , . Jinak se počítá podle stejných vzorců jako předchozí , a ;
  5. Vezměme si první kousek . Toto je požadovaná hodnota hash.

Funkce a

Jako vstup se berou čtyři bitové vektory:

  • Hodnota řetězení s velikostí =256 bitů pro ( bitů pro );
  • Blok zpráv o velikosti =512 bitů pro ( =1024 bitů pro );
  • Sůl o velikosti =256 bitů pro ( =512 bitů pro );
  • Bitový čítač o velikosti =64 bitů pro ( =128 bitů pro ).

Výstupem je vektor o velikosti 256 bitů pro (512 bitů pro ).

Pro realizaci je použita konstrukce Davis-Meyer . To znamená, že hodnota řetězce je přepočítána podle vzorců , resp. [1] .

Funkce

 - 12kolová bloková šifra . Tato bloková šifra je Feistelova síť , která se skládá z 12 Feistelových buněk. jako vstup přijímá 256bitový prostý text . Lze jej rozdělit na dvě části po 128 bitech. . Přepočet hodnot v každém kole se provádí podle vzorce: .

Zde  je vektor tří klíčů, odlišných pro každé kolo, a  je to nějaká funkce. V důsledku toho lze návratovou hodnotu vypočítat: .

Funkce

Funkce přijímá jako vstup 128bitový text a 384bitový klíč , který se získá kombinací tří 128bitových klíčů . Skládá se z aplikace kola AES třikrát: . Vstupní vektor je přidán modulo 2 s klíčem a na výsledek jsou aplikována tři kola AES s různými klíči v následujícím pořadí: kolo AES s klíčem , další kolo AES s klíčem , poslední kolo s klíčem 0 (128 bitů).

Generování klíče pro

Pro výpočet funkce jsou zapotřebí tři 128bitové klíče v každém z 12 kol. K tomu se používá algoritmus pro generování klíčů z jednoho klíče. Jako jediný klíč, ze kterého se následně vygeneruje 36, je použita kombinace bloku zpráv (512 bitů), salt (256 bitů) a bitového čítače (64 bitů). V algoritmu jsou všechny operace prováděny na 4bajtových hodnotách. Představme si následující zápis:

  •  — blok zpráv;
  •  — počítadlo bitů;
  •  - sůl.

V důsledku algoritmu získáme 144 hodnot (také 4bajtové):

// Algoritmus generování klíče pro E^256 v C/C++ // Inicializuje prvních 16 hodnot výsledného pole počáteční zprávou pro ( int i = 0 ; i < 16 ; i ++ ) rk [ i ] = msg [ i ]; int i = 16 ; for ( int k = 0 ; k < 4 ; k ++ ) { uint32_t t [ 4 ]; // Nelineární krok pro ( int r = 0 ; r < 2 ; r ++ ) { // Proveďte kolo AES s klíčem 0 na 128bitové hodnotě // což je součet modulo-2 dříve vypočítaných // prvků pole rk a soli (bity 0-127). // Zapište 128bitový výsledek do pole t AESRound0 ( rk [ i -15 ] ^ sůl [ 0 ], rg [ i -14 ] ^ sůl [ 1 ], rk [ i -13 ] ^ sůl [ 2 ], rk [ i -16 ] ^ sůl [ 3 ], & t [ 0 ], & t [ 1 ], & t [ 2 ], & t [ 3 ] ); for ( int j = 0 ; j < 4 ; j ++ ) rk [ i + j ] = t [ j ] ^ rk [ i + j - 4 ]; if ( i == 16 ) { rk [ 16 ] ^= cnt [ 0 ]; rk [ 17 ] ^= ~ cnt [ 1 ]; } if ( i == 56 ) { rk [ 16 ] ^= cnt [ 1 ]; rk [ 17 ] ^= ~ cnt [ 0 ]; } i + = 4 ; // Stejné kolo AES jako předtím // ale se zbytkem soli (128-255 bitů) AESRound0 ( rk [ i -15 ] ^ sůl [ 4 ], rg [ i -14 ] ^ sůl [ 5 ], rk [ i -13 ] ^ sůl [ 6 ], rk [ i -16 ] ^ sůl [ 7 ], & t [ 0 ], & t [ 1 ], & t [ 2 ], & t [ 3 ] ); for ( int j = 0 ; j < 4 ; j ++ ) rk [ i + j ] = t [ j ] ^ rk [ i + j - 4 ]; if ( i == 84 ) { rk [ 86 ] ^= cnt [ 1 ]; rk [ 87 ] ^= ~ cnt [ 0 ]; } if ( i == 124 ) { rk [ 124 ] ^= cnt [ 0 ]; rk [ 127 ] ^= ~ cnt [ 1 ]; } i + = 4 ; } // Lineární krok pro ( int r = 0 ; r != 16 ; ++ r ) { rk [ i ] = rk [ i -16 ] ^ rk [ i -3 ]; i + = 1 ; } }

Algoritmus uvedený výše je upravená verze autorů. Jediný rozdíl od verze původně předložené do soutěže SHA-3 je přítomnost bitových negačních operací „~“ čítače . Negace byla přidána, aby se zvýšila kryptografická síla hashovací funkce. Přítomnost takových operací zaručuje, že alespoň 4 z 8 bajtů čítače budou nenulové [2] .

Klávesy pro výpočet funkce jsou získány z následujících: , kde , .

Funkce

Tato funkce je implementována analogicky s , ale přijímá 512bitový prostý text jako vstup , který je reprezentován jako 4 části podle

128 bitů: . Přepočet se provádí podle vzorce na 14 kol (v aktualizované verzi autoři navrhli použít 16 kol [6] ). .

Funkce

Jako vstup přijímá 128 bitů textu a 512 bitový klíč . Počítáno jako 4 kola AES. .

Generování klíče pro

Funkce vyžaduje osm 128bitových klíčů v každém ze 14 kol k výpočtu funkce . Celkem je k dispozici 112 klíčů. Jsou založeny na bloku zpráv (1024 bitů), soli (512 bitů) a bitovém čítači (128 bitů). Všechny operace se provádějí na 4bajtových hodnotách. Představme si následující zápis:

  •  - blok zpráv
  •  - počítadlo bitů
  •  - sůl

V důsledku algoritmu získáme 448 hodnot (4bajtové):

// Algoritmus generování klíče pro E^512 v C/C++ // Inicializuje prvních 32 hodnot výsledného pole počáteční zprávou pro ( int i = 0 ; i < 32 ; i ++ ) rk [ i ] = msg [ i ]; int i = 32 ; for ( int k = 0 ; k < 7 ; k ++ ) { uint32_t t [ 4 ]; // Nelineární krok (7krát) pro ( int r = 0 ; r < 2 ; r ++ ) { AESRound0 ( rk [ i -31 ] ^ sůl [ 0 ], rg [ i -30 ] ^ sůl [ 1 ], rk [ i -29 ] ^ sůl [ 2 ], rk [ i -32 ] ^ sůl [ 3 ], & t [ 0 ], & t [ 1 ], & t [ 2 ], & t [ 3 ]); // AES zaokrouhlí s klíčem 0, salt 0-3 for ( int j = 0 ; j < 4 ; j ++ ) rk [ i + j ] = t [ j ] ^ rk [ i + j -4 ]; if ( i == 32 ) { rk [ 32 ] ^= cnt [ 0 ]; rk [ 33 ] ^= cnt [ 1 ]; rk [ 34 ] ^= cnt [ 2 ]; rk [ 35 ] ^= ~ cnt [ 3 ]; } i + = 4 ; AESRound0 ( rk [ i -31 ] ^ sůl [ 4 ], rg [ i -30 ] ^ sůl [ 5 ], rk [ i -29 ] ^ sůl [ 6 ], rk [ i -32 ] ^ sůl [ 7 ], & t [ 0 ], & t [ 1 ], & t [ 2 ], & t [ 3 ]); // AES zaokrouhlí s klíčem 0, salt 4-7 for ( int j = 0 ; j < 4 ; j ++ ) rk [ i + j ] = t [ j ] ^ rk [ i + j -4 ]; if ( i == 164 ) { rk [ 164 ] ^= cnt [ 3 ]; rk [ 165 ] ^= cnt [ 2 ]; rk [ 166 ] ^= cnt [ 1 ]; rk [ 167 ] ^= ~ cnt [ 0 ]; } i + = 4 ; AESRound0 ( rk [ i -31 ] ^ sůl [ 8 ], rg [ i -30 ] ^ sůl [ 9 ], rk [ i -29 ] ^ sůl [ 10 ], rk [ i -32 ] ^ sůl [ 11 ], & t [ 0 ], & t [ 1 ], & t [ 2 ], & t [ 3 ]); // AES zaokrouhluje klíč 0, sůl 8-11 for ( int j = 0 ; j < 4 ; j ++ ) rk [ i + j ] = t [ j ] ^ rk [ i + j -4 ]; if ( i == 440 ) { rk [ 440 ] ^= cnt [ 1 ]; rk [ 441 ] ^= cnt [ 0 ]; rk [ 442 ] ^= cnt [ 3 ]; rk [ 443 ] ^= ~ cnt [ 2 ]; } i + = 4 ; AESRound0 ( rk [ i -31 ] ^ sůl [ 12 ], rg [ i -30 ] ^ sůl [ 13 ], rk [ i -29 ] ^ sůl [ 14 ], rk [ i -32 ] ^ sůl [ 15 ], & t [ 0 ], & t [ 1 ], & t [ 2 ], & t [ 3 ]); // AES zaokrouhlí s klíčem 0, salt 12-15 for ( int j = 0 ; j < 4 ; j ++ ) rk [ i + j ] = t [ j ] ^ rk [ i + j -4 ]; if ( i == 316 ) { rk [ 316 ] ^= cnt [ 2 ]; rk [ 317 ] ^= cnt [ 3 ]; rk [ 318 ] ^= cnt [ 0 ]; rk [ 319 ] ^= ~ cnt [ 1 ]; } i + = 4 ; } if ( k == 6 ) break ; // nedělat 7. lineární krok // Lineární krok (6krát) pro ( int r = 0 ; r != 32 ; ++ r ) { rk [ i ] = rk [ i -32 ] ^ rk [ i -7 ]; i + = 1 ; } }

Zde, stejně jako ve 256bitové verzi, je jediným rozdílem mezi vylepšenou verzí a tou původně předloženou do soutěže SHA-3 přítomnost bitových operací NOT "~" před hodnotami čítače. Přítomnost takových operací zaručuje, že alespoň 4 ze 16 bajtů čítače budou nenulové [2] .

Dále jsou klávesy pro výpočet funkce získány z následujících: , kde , .

Výkon

Tabulka uvádí srovnávací údaje o rychlosti algoritmů [1] .

Algoritmus Rychlost (cykly/bajt)
32 bit 64 bit
MD5 7.4 8.8
SHA-1 9.8 9.5
SHA-256 28.8 25.3
SHA-512 77,8 16.9
SHAVite-3 256 (změnit) 35.3 26.7
SHAVite-3 256 (cca) 26.6 18.6
SHAVite-3 256 (s nástrojem AES) < 8 < 8
SHAVite-3 512 (změnit) 55,0 38.2
SHAVite-3 512 (cca) 35.3 28.4
SHAvite-3 512 (s nástrojem AES) < 12 < 12

Funkci lze implementovat i hardwarově.

Délka Technika Velikost Šířka pásma
256 ASIC 10,3 kg brány 7,6 Mbps
55,0 kg brány 604,4 Mbps
FPGA 510 plátků 1,7 Mbps
3585 872,3 Mbps
512 ASIC 18,5 kg 4,7 Mbps
81Kgates 907,7 ​​Mbps
FPGA 895 plátků 1,0 Mbps
7170 plátků 1,12 Gbps

V tabulce jsou uvedeny údaje založené na hardwarové implementaci AES v roce 2005, výkon v současnosti může být lepší [1] .

Poznámky

  1. ↑ 1 2 3 4 5 6 7 8 9 Eli Biham, Orr Dunkelman. Hashovací funkce SHAVite-3 . cs.technion.ac.il . Katedra informatiky, Technion (31. října 2008). Získáno 2. listopadu 2016. Archivováno z originálu 19. srpna 2019.
  2. ↑ 1 2 3 4 Eli Biham, Orr Dunkelman. Hashovací funkce SHAVite-3. Vylepšená verze . cs.technion.ac.il . Katedra informatiky, Technion (23. listopadu 2009). Datum přístupu: 21. prosince 2013. Archivováno z originálu 23. září 2015.
  3. Richard F. Kayser. Oznamujeme žádost o nominace kandidátských algoritmů pro novou rodinu kryptografických hashovacích algoritmů (SHA-3)  //  Federal Register. - 2007. - 2. listopadu ( roč. 72 , č. 212 ). - S. 62212-62220 . — ISSN 0097-6326 . Archivováno z originálu 31. března 2011.
  4. Thomas Peyrin. Zpráva na mailing listu NIST o nalezené zranitelnosti . NIST mailing list . NIST Computer Security Resource Center (19. ledna 2009). Získáno 2. listopadu 2016. Archivováno z originálu 25. prosince 2016.
  5. Paul Souradyuti. OFICIÁLNÍ KOMENTÁŘ: SHAVite-3 . NIST mailing list . NIST Computer Security Resource Center (16. června 2009). Staženo 2. listopadu 2016. Archivováno z originálu 19. prosince 2016.
  6. ↑ 1 2 Eli Biham, Orr Dunkelman. Aktualizace na SHAVite-3 . cs.technion.ac.il . Katedra informatiky, Technion (23. srpna 2010). Datum přístupu: 21. prosince 2013. Archivováno z originálu 23. září 2015.
  7. Mridul Nandi, Souradyuti Paul. Zpráva na mailing listu NIST o nalezené zranitelnosti . NIST mailing list . NIST Computer Security Resource Center (18. června 2009). Získáno 2. listopadu 2016. Archivováno z originálu 25. prosince 2016.
  8. Gauravaram P. , Leurent G. , Mendel F. , Naya-Plasencia M. , Peyrin T. , Rechberger C. , Schläffer M. Cryptanalysis of the 10-Round Hash and Full Compression Function of SHAvite-3-512  // Progress in Cryptology - AFRICACRYPT 2010 : Third International Conference on Cryptology in Africa, Stellenbosch, South Africa, 3-6 May 2010. Proceedings / D. J. Bernstein , T. Lange - Berlin , Heidelberg , New York, NY , London [ etc.] : Springer Berlin Heidelberg , 2010. - S. 419-436. - ( Lecture Notes in Computer Science ; Vol. 6055) - ISBN 978-3-642-12677-2 - ISSN 0302-9743 ; 1611-3349doi:10.1007/978-3-642-12678-9_25
  9. Bouillaguet C. , Dunkelman O. , Leurent G. , Fouque P. Útoky na hashovací funkce založené na zobecněném Feistelu: Aplikace na Reduced-Round Lesamnta a SHAvite-3₅₁₂  // Vybrané oblasti v kryptografii : 17. mezinárodní seminář Waterloo, SACloo , Ontario, Kanada, 12. – 13. srpna 2010, Revised Selected Papers / A. Biryukov , G. Gong , D. Stinson - Berlín , Heidelberg , New York, NY , Londýn [atd.] : Springer Science+ Business Media , 2011. - S. 18-35. — 411 s. - ( Lecture Notes in Computer Science ; Vol. 6544) - ISBN 978-3-642-19573-0 - ISSN 0302-9743 ; 1611-3349doi:10.1007/978-3-642-19574-7
  10. Meltem Sonmez Turan a kol. Zpráva o stavu druhého kola soutěže o kryptografický hash algoritmus SHA-3 . csrc.nist.gov . NIST Computer Security Resource Center (2011). Datum přístupu: 21. prosince 2013. Archivováno z originálu 15. února 2013.

Odkazy