Dvě ryby | |
---|---|
Tvůrce | skupina specialistů vedená Brucem Schneierem |
Vytvořeno | 1998 |
Velikost klíče | 128/192/256 bitů |
Velikost bloku | 128 bit |
Počet kol | 16 |
Typ | Síť Feistel |
Twofish je symetrická bloková šifra s velikostí bloku 128 bitů a délkou klíče až 256 bitů. Počet kol 16. Vyvinuto skupinou specialistů pod vedením Bruce Schneiera . Byl jedním z pěti finalistů druhé fáze soutěže AES . Algoritmus je založen na algoritmech Blowfish , SAFER a SQUARE .
Charakteristickými rysy algoritmu jsou použití předem vypočítaných a na klíči závislých náhradních uzlů a složité schéma pro rozbalení šifrovacích podklíčů. Polovina n - bitového šifrovacího klíče se používá jako vlastní šifrovací klíč, druhá polovina se používá k úpravě algoritmu (na něm závisí substituční uzly).
Twofish byl vyvinut speciálně pro splnění požadavků a doporučení NIST pro AES [1] :
V jeho prospěch však nehrála složitost struktury algoritmu, a tedy složitost jeho analýzy na slabé klíče nebo skryté odkazy, stejně jako poměrně pomalá doba provádění ve srovnání s Rijndaelem na většině platforem [2 ] .
Algoritmus Twofish vznikl z pokusu upravit algoritmus Blowfish pro 128bitový vstupní blok. Nový algoritmus musel být snadno hardwarově implementovatelný (včetně použití menších tabulek), měl mít pokročilejší systém rozšíření klíče ( angl. key schedule ) a mít jednohodnotovou funkci F.
Ve výsledku byl algoritmus implementován jako smíšená Feistelova síť se čtyřmi větvemi, které se vzájemně modifikují pomocí Hadamarovy kryptotransformace ( angl. pseudo-Hadamar transform, PHT ).
Možnost efektivní implementace na moderních (na tehdejší dobu) 32bitových procesorech (stejně jako v čipových kartách a podobných zařízeních) je jedním z klíčových principů, kterými se řídili vývojáři Twofish.
Například funkce F při výpočtu PHT a přidávání do klíčové části K záměrně používá sčítání místo tradičního xor . To umožňuje použít instrukci LEA z rodiny procesorů Pentium, která umožňuje vypočítat Hadamardovu transformaci v jednom hodinovém cyklu . (V tomto případě však musí být kód zkompilován pro konkrétní hodnotu klíče).
Algoritmus Twofish není patentován a může jej používat kdokoli bez jakýchkoli poplatků nebo licenčních poplatků. Používá se v mnoha šifrovacích programech, i když je méně běžný než Blowfish .
Twofish rozdělí vstupní 128bitový datový blok na čtyři 32bitové dílčí bloky, na kterých se po proceduře vstupního bělení provede 16 cyklů transformací. Po posledním kole se provede výstupní bělení.
Whitening je postup pro xorování dat s podklíči před prvním kolem a po posledním kole. Tato technika byla poprvé použita v šifře Khufu / Khare a nezávisle Ron Rivest v šifrovacím algoritmu DESX . Joe Killian (NEC) a Phillip Rogaway (University of California) ukázali, že bělení ztěžuje úkol vyčerpávajícího vyhledávání klíčů v DESX [3] . Vývojáři Twofish argumentují [4] , že v Twofish whitening také výrazně komplikuje úkol uhodnout klíč, protože kryptoanalytik nemůže zjistit, jaká data se dostávají do vstupu funkce prvního kola F.
Našly se však i negativní stránky. Zajímavou studii provedli specialisté z IBM Research Center. [5] Implementovali algoritmus Twofish na typickou čipovou kartu CMOS a analyzovali možnost útoku pomocí diferenciální analýzy výkonu (DPA). Napadena byla procedura vstupního bělení, protože přímo používá xor podklíčů se vstupními daty. Výsledkem bylo, že výzkumníci ukázali, že je možné plně vypočítat 128bitový klíč analýzou pouze 100 náhodných blokových šifrovacích operací.
Funkce g je základem algoritmu Twofish. Vstupem funkce je 32bitové číslo X, které je poté rozděleno do čtyř bajtů x0, x1, x2, x3. Každý z výsledných bajtů prochází jeho S-boxem. (Je třeba poznamenat, že S-boxy v algoritmu nejsou pevně dané, ale závisí na klíči). Výsledné 4 bajty na výstupech S-boxů jsou interpretovány jako vektor se čtyřmi složkami. Tento vektor je vynásoben pevnou maticí 4x4 MDS (oddělitelná maximální vzdálenost) a výpočty se provádějí v Galoisově poli modulo neredukovatelného polynomu.
Matice MDS je taková matice nad konečným polem K, že pokud ji vezmeme jako matici lineární transformace z prostoru do prostoru , pak libovolné dva vektory z prostoru tvaru (x, f(x)) budou mít alespoň m + 1 rozdílů ve složkách . To znamená, že množina vektorů ve tvaru (x, f(x)) tvoří kód s maximální vzdáleností oddělitelnou vlastností kódu. Takovým kodexem je například Reed-Solomonův kodex .
V Twofish vlastnost maximální diverzity matice MDS znamená, že celkový počet měnících se bajtů vektoru a a vektoru je alespoň pět. Jinými slovy, jakákoli změna pouze na jeden bajt v a změní všechny čtyři bajty v b.
Crypto Hadamard transform je vratná transformace bitového řetězce délky 2n. Řetězec je rozdělen na dvě části aab stejné délky v n bitech. Transformace se vypočítá takto:
Tato operace se často používá k „rozptýlení“ kódu (například v šifře SAFER ).
V Twofish se tato transformace používá při smíchání výsledků dvou g-funkcí (n = 32).
V každém kole jsou dva pravé 32bitové bloky, které jsou xoredovány s výsledky funkce F, navíc otočeny o jeden bit. Třetí blok je posunut před operací xor, čtvrtý blok poté. Tyto posuny jsou záměrně přidány, aby narušily zarovnání bajtů, které je vlastní S-boxům a násobení matic MDS. Šifra však přestává být zcela symetrická, protože během šifrování a dešifrování by měly být posuny prováděny v opačných směrech.
Twofish je navržen pro práci se 128, 192 a 256 bitovými klíči. Z počátečního klíče se vygeneruje 40 32bitových podklíčů, z nichž prvních osm se používá pouze ve vstupních a výstupních bělicích operacích a zbývajících 32 se používá v šifrovacích kolech, dva podklíče na kolo. Funkce Twofish je, že původní klíč se také používá ke změně samotného šifrovacího algoritmu, protože S-boxy použité ve funkci g nejsou pevně dané, ale závisí na klíči.
Pro vytvoření kulatých podklíčů je původní klíč M rozdělen s permutací bajtů na dva identické bloky a . Potom se pomocí bloku a funkce h zašifruje hodnota 2*i a pomocí bloku se zašifruje hodnota 2*i+1, kde i je číslo aktuálního kola (0 - 15). Výsledné zašifrované bloky jsou smíchány Hadamardovou krypto-transformací a poté použity jako kulaté podklíče.
Podívejme se podrobněji na algoritmus pro generování kruhových podklíčů a také na klíčově závislou funkci g. Jak generování podklíče, tak tvorba g funkce v Twofish používá jednu hlavní funkci: h(X, L 0 , L 1 , …, L k ). Zde X, Lo , L1 , … , Lk jsou 32-bitová slova a k = N/64, kde N je délka původního klíče v bitech . Výsledkem funkce je jedno 32bitové slovo.
Funkce se provádí v k fázích. To znamená, že pro klíč o délce 256 bitů budou 4 stupně, pro klíč 192 bitů - 3 stupně, pro 128 bitů - 2 stupně.
V každé fázi je vstupní 32bitové slovo rozděleno na 4 bajty a každý bajt je podroben pevné bitové permutaci q 0 nebo q 1
Výsledek je reprezentován jako vektor o velikosti 4 bajtů a vynásobený maticí MDS. Výpočty se provádějí v Galoisově poli GF(2 8 ) modulo neredukovatelný polynom .
Matice MDS má tvar:Permutace q 0 a q 1
q 0 a q 1 jsou pevné permutace 8 bitů vstupního bytu x.
Byte x je rozdělen na dvě 4bitové poloviny a 0 a b 0 , přes které se provádějí následující transformace:
Zde je 4bitový cyklický posun doprava a to , ti , t2 , t3 jsou tabulkové náhrady 4bitových čísel .
Pro q 0 vypadají tabulky takto:
t 0 = [ 8 1 7 D 6 F 3 2 0 B 5 9 ECA 4 ] t 1 = [ ECB 8 1 2 3 5 F 4 A 6 7 0 9 D ] t 2 = [ BA 5 E 6 D 9 0 C 8 F 3 2 4 7 1 ] t 3 = [ D 7 F 4 1 2 6 E 9 B 3 0 8 5 CA ]Pro q 1 vypadají tabulky takto:
t 0 = [ 2 8 BDF 7 6 E 3 1 9 4 0 AC 5 ] t 1 = [ 1 E 2 B 4 C 3 7 6 DA 5 F 9 0 8 ] t 2 = [ 4 C 7 5 1 6 9 A 0 ED 8 2 B 3 F ] t 3 = [ B 9 5 1 C 3 DE 6 4 7 F 2 0 8 A ]Nechť M je původní klíč, N je jeho délka v bitech. Podklíče se generují následovně:
Podklíče pro i-té kolo se počítají podle vzorců:
Funkce g je definována pomocí funkce h : .
Vektor S , stejně jako vektory Me a Mo , je rovněž vytvořen z původního klíče a skládá se z k 32bitových slov. Původní klíčové bajty jsou rozděleny do k skupin po osmi bytech. Každá taková skupina je považována za vektor s 8 složkami a vynásobená pevnou maticí RS 4×8 bajtů. V důsledku násobení se získá vektor sestávající ze čtyř bajtů. Výpočty jsou prováděny v Galoisově poli modulo neredukovatelném polynomu . Matice RS má tvar
Studie Twofish se sníženým počtem kol ukázala, že algoritmus má velkou rezervu v bezpečnosti a ve srovnání se zbytkem finalistů soutěže AES se ukázal jako nejvytrvalejší. Jeho neobvyklá struktura a relativní složitost však vyvolaly určité pochybnosti o kvalitě této síly.
Rozdělení původního klíče na dvě poloviny při vytváření kulatých podklíčů vyvolalo kritiku. Kryptografové Fauzan Mirza a Sean Murphy navrhli, že takové rozdělení umožňuje zorganizovat útok podle principu „rozděl a panuj“, tedy rozdělit úkol na dva podobné, ale jednodušší [6] . K takovému útoku však ve skutečnosti nedošlo.
Pro rok 2008 je nejlepší variantou kryptoanalýzy Twofish varianta zkrácené diferenciální kryptoanalýzy, kterou publikovali Shiho Moriai a Yiqun Lisa Yin v Japonsku v roce 2000 [7] . Ukázali, že k nalezení nezbytných rozdílů je zapotřebí 251 shodných otevřených textů . Přesto byly studie teoretického charakteru, žádný skutečný útok nebyl proveden. Tvůrce Twofish Bruce Schneier na svém blogu tvrdí, že takový útok je ve skutečnosti nemožný [8] .
Symetrické kryptosystémy | |
---|---|
Streamové šifry | |
Síť Feistel | |
Síť SP | |
jiný |