XTEA | |
---|---|
Tvůrce | David Wheeler a Roger Needham |
Vytvořeno | 1997 _ |
zveřejněno | 1997 _ |
Velikost klíče | 128 bit |
Velikost bloku | 64 bit |
Počet kol | 64 |
Typ | Síť Feistel |
V kryptografii je XTEA (eXtended TEA ) blokový šifrovací algoritmus navržený k odstranění kritických chyb v algoritmu TEA . Vývojáři šifry jsou David Wheeler a Roger Needham (Department of Computer Science , University of Cambridge ). Algoritmus byl představen v nepublikované technické zprávě v roce 1997 [1] . Šifra není proprietární, je široce používána v řadě kryptografických aplikací a široké škále hardwaru kvůli extrémně nízkým nárokům na paměť a snadné implementaci.
Stejně jako TEA je šifra založena na 64bitových blokových operacích, má 32 celých cyklů, každý celý cyklus má dvě kola Feistel Network , což znamená 64 kol Feistel Network. Počet nábojů pro dosažení lepší difúze však lze zvýšit na úkor výkonu. Kromě toho XTEA, stejně jako TEA, používá 128bitový klíč sestávající ze čtyř 32bitových slov K[0], K[1], K[2] a K[3]. XTEA nemá klíčový plánovací algoritmus v obvyklém smyslu. Aby bylo možné určit, které ze čtyř klíčových slov použít v každém kole, používá algoritmus konstantu δ = 9E3779B9 16 . V TEA taková distribuce neexistuje. Dalším rozdílem oproti TEA je permutace bitových operací použitých v šifře. Díky těmto vylepšením neprodělala XTEA ve srovnání s TEA větší komplikace, ale zároveň eliminovala dvě hlavní nevýhody algoritmu TEA [1] :
XTEA používá následující logické operace: XOR , bitový posun a logické AND . XTEA navíc používá operaci sčítání celých čísel modulo 2 32 , označených jako x y (x a y Z 2 32 ). Exkluzivní "OR" v booleovské logice je označeno jako x y a v jazyce C jako x ^ y. Logické "AND" v booleovské logice je x y v jazyce C - x & y. Logický posun x o y bitů doleva se označí x y a logický posun x o y bitů doprava se označí x y. Nechť vstup n-tého (1 ≤ n ≤ 64) kola algoritmu je (L n ,R n ) a výstup je (L n+1 ,R n+1 ), přičemž L n+1 = R n . Rn +1 se vypočítá takto:
pokud n = 2 * i - 1 pro 1 ≤ i ≤ 32, pak R n+1 = L n + ({ (R n 4 R n 5) R n } ({ i - 1 } * δ K [ ({ i — 1 } * δ) 3 ]),
pokud n = 2 * i pro 1 ≤ i ≤ 32, pak R n+1 = L n + ({ (R n 4 R n 5) R n } (i * δ K [ (i * δ 11) 3 ]) .
Protože se jedná o blokovou šifru, kde délka bloku je 64 bitů a délka dat nemusí být násobkem 64 bitů, je hodnota všech bajtů vyplnění bloku na násobek 64 bitů nastavena na 0x01 .
Předpokládá se, že XTEA je bezpečnější než TEA, ale je možné zachytit typ útoku, pro který je XTEA zranitelnější [3] . Prvním přístupem jsou diferenciální útoky . Vzhledem k tomu, že TEA používá modulo 2 přidání 32 kruhové klávesy a vstupního prostého textu a XTEA používá XOR, je snazší napadnout XTEA diferenciálně než TEA. Po 14 kolech XTEA lze sestavit diferenciální charakteristiku s pravděpodobností 2 −57,79 a použít ji k rozbití XTEA, která obsahuje 16 kol (tento útok vyžaduje 2 61 vybraných otevřených textů). Zároveň je pro TEA obtížné vybudovat dobrou diferenciální charakteristiku. Druhým přístupem je zkrácený diferenciální útok. Po 8 kolech TEA a XTEA lze sestrojit zkrácenou diferenciální charakteristiku s pravděpodobností 1. Prostřednictvím tohoto útoku je možné rozbít XTEA s maximálním počtem kol 23 a TEA s maximálním počtem kol 17. Tento rozdíl je pozorován díky klíčovým plánovacím vlastnostem v každém z algoritmů.
Nejúspěšnějším publikovaným útokem na XTEA je diferenciální útok s propojeným klíčem, který je schopen prolomit 37 ze 64 kol algoritmu pomocí 263 vybraných otevřených textů s časovou složitostí 2125 . Pokud vezmeme v úvahu podmnožinu slabých klíčů, která zahrnuje 2 107,5 klíčů z 2 128 , pak je tento útok schopen prolomit 51 ze 64 kol algoritmu s časovou složitostí 2 123 [4] .
Implementace šifrování a dešifrování pomocí algoritmu XTEA v jazyce C (převzato z kódu prezentovaného v článku Davida Wheelera a Rogera Needhama [1] ).
#include <stdint.h> void xtea_encipher ( unsigned int num_rounds , uint32_t * v , uint32_t const * k ) { unsigned int i ; uint32_t v0 = v [ 0 ], v1 = v [ 1 ], součet = 0 , delta = 0x9E3779B9 ; for ( i = 0 ; i < počet_kol ; i ++ ) { v0 += ((( v1 << 4 ) ^ ( v1 >> 5 )) + v1 ) ^ ( součet + k [ součet & 3 ]); součet += delta ; v1 += ((( v0 << 4 ) ^ ( v0 >> 5 )) + v0 ) ^ ( součet + k [( součet >> 11 ) & 3 ]); } v [ 0 ] = v0 ; v [ 1 ] = v1 ; } void xtea_decipher ( unsigned int num_rounds , uint32_t * v , uint32_t const * k ) { unsigned int i ; uint32_t v0 = v [ 0 ], v1 = v [ 1 ], delta = 0x9E3779B9 , suma = delta * počet_kol ; for ( i = 0 ; i < počet_kol ; i ++ ) { v1 -= ((( v0 << 4 ) ^ ( v0 >> 5 )) + v0 ) ^ ( součet + k [( součet >> 11 ) & 3 ]); součet -= delta ; v0 -= ((( v1 << 4 ) ^ ( v1 >> 5 )) + v1 ) ^ ( součet + k [ součet & 3 ]); } v [ 0 ] = v0 ; v [ 1 ] = v1 ; }komentáře:
Změny oproti původnímu kódu:
Objevená zranitelnost v plánu klíčů a přítomnost úspěšných útoků na algoritmy TEA , XTEA a XXTEA vedly k vytvoření alternativních šifer řadou kryptoanalytiků. Konkrétně v současnosti existují algoritmy RTEA (Sean O'Neill), Raiden (Julio Castro), XTEA-1, XTEA-2 a XTEA-3 [ 5] (Tom St. Denis) založené na šifrách rodiny TEA . Tyto modifikace však nebyly tak široce studovány a nenašly dostatečné praktické uplatnění.
Jednou ze zranitelností XTEA je to, že bity v klíči ovlivňují stejné bity v každém kole algoritmu. Tento problém lze eliminovat použitím šifry, která obsahuje algoritmus pro plánování klíčů. Plánování klíčů je dynamické a nevyžaduje alokaci paměti. Plánování klíče se provádí cyklickým bitovým posouváním klíče o hodnotu, která závisí na otevřeném textu. Algoritmus XTEA-1 implementuje tuto myšlenku posílení šifry XTEA mírnou změnou struktury šifry, aniž by se změnily základní principy algoritmu.
Šifra využívá technologii whitewashing a transformaci podklíče závislou na datech, což ztěžuje kryptoanalýzu , protože původní algoritmus obsahoval zranitelnost - úprava určitých klíčových bitů se projevila v odpovídajících bitech šifrového textu.
Implementace XTEA-1 v jazyce C :
#include <stdint.h> uint32_t rol ( základ uint32_t , posun uint32_t ) { uint32_t res ; /* pouze 5 bitů posunu je významných*/ posun &= 0x1F ; res = ( základ << posun ) | ( základ >> ( 32 - posun )); vrátit res ; } void xtea1_encipher ( unsigned int num_rounds , uint32_t * v , uint32_t const * k ) { unsigned int i ; uint32_t y , z , součet = 0 , delta = 0x9E3779B9 ; /* načíst a předbílit registry */ y = v [ 0 ] + k [ 0 ]; z = v [ 1 ] + k [ 1 ]; /* Kulaté funkce */ for ( i = 0 ; i < počet_kol ; i ++ ) { y += (( z << 4 ) ^ ( z >> 5 )) + ( z ^ součet ) + rol ( k [ součet & 3 ], z ); součet += delta ; z += (( y << 4 ) ^ ( y >> 5 )) + ( y ^ součet ) + rol ( k [( součet >> 11 ) & 3 ], y ); } /* zveřejňovat a ukládat registry */ v [ 0 ] = y ^ k [ 2 ]; v [ 1 ] = z ^ k [ 3 ]; } void xtea1_decipher ( unsigned int num_rounds , uint32_t * v , uint32_t const * k ) { unsigned int i ; uint32_t y , z , delta = 0x9E3779B9 , suma = delta * počet_kol ; z = v [ 1 ] ^ k [ 3 ]; y = v [ 0 ] ^ k [ 2 ]; for ( i = 0 ; i < počet_kol ; i ++ ) { z -= (( y << 4 ) ^ ( y >> 5 )) + ( y ^ součet ) + rol ( k [( součet >> 11 ) & 3 ], y ); součet -= delta ; y -= (( z << 4 ) ^ ( z >> 5 )) + ( z ^ součet ) + rol ( k [ součet & 3 ], z ); } v [ 1 ] = z - k [ 1 ]; v [ 0 ] = y - k [ 0 ]; }Funkce 'rol' provádí cyklický bitový posun klíče pomocí nejméně významných 5 bitů posunu. Tento algoritmus používá pouze jeden posun za kolo, což je na většině moderních procesorů poměrně efektivní a rychlé .
XTEA-1 je možné změnit pomocí 128bitového bloku. Výsledný algoritmus vyžaduje více kol, ale jeho rychlost šifrování je vyšší než u XTEA.
Implementace XTEA-2 v C :
#include <stdint.h> void xtea2_encipher ( unsigned int num_rounds , uint32_t * v , uint32_t const * k ){ unsigned int i ; uint32_ta , b , c , d , součet = 0 , t , delta = 0x9E3779B9 ; _ a = v [ 0 ]; b = v [ 1 ] + k [ 0 ]; c = v [ 2 ]; d = v [ 3 ] + k [ 1 ]; for ( i = 0 ; i < počet_kol ; i ++ ) { a += (( b << 4 ) ^ ( b >> 5 )) + ( d ^ součet ) + rol ( k [ součet & 3 ], b ); součet += delta ; c += (( d << 4 ) ^ ( d >> 5 )) + ( b ^ součet ) + rol ( k [( součet >> 11 ) & 3 ], d ); t = a ; a = b_ _ b = c ; c = d ; d = t ; } v [ 0 ] = a ^ k [ 2 ]; v [ 1 ] = b ; v [ 2 ] = c ^ k [ 3 ]; v [ 3 ] = d ; } void xtea2_decipher ( unsigned int num_rounds , uint32_t * v , uint32_t const * k ){ unsigned int i ; uint32_ta , b , c , d , t , delta = 0x9E3779B9 , součet = delta * počet_kol ; _ d = v [ 3 ]; c = v [ 2 ] ^ k [ 3 ]; b = v [ 1 ]; a = v [ 0 ] ^ k [ 2 ]; for ( i = 0 ; i < počet_kol ; i ++ ) { t = d _ d = c ; c = b _ b = a ; a = t_ _ c -= (( d << 4 ) ^ ( d >> 5 )) + ( b ^ součet ) + rol ( k [( součet >> 11 ) & 3 ], d ); součet -= delta ; a -= (( b << 4 ) ^ ( b >> 5 )) + ( d ^ součet ) + rol ( k [ součet & 3 ], b ); } v [ 0 ] = a ; v [ 1 ] = b - k [ 0 ]; v [ 2 ] = c ; v [ 3 ] = d - k [ 1 ]; }Hlavní výhodou tohoto algoritmu je schopnost šifrovat velké bloky. Tento algoritmus používá stejné základní operace jako XTEA-1, ale vyžaduje více iterací. Ve skutečnosti vyžaduje dvakrát tolik iterací od 32 do 64 (od 64 do 128 kol). 48 iterací je kompromisem mezi rychlostí a spolehlivostí šifrování.
Dalším přirozeným rozšířením XTEA-1 je použití 256bitového klíče a praktičtějšího 128bitového bloku. Tento algoritmus vyžaduje 32 až 64 iterací, ale zároveň poskytuje spolehlivou ochranu proti útokům vyčerpávajícím vyhledáváním. Šifra používá technologii whitewashing a implementuje operace závislé na klíči, což ztěžuje kryptoanalýzu.
Implementace XTEA-3 v C :
#include <stdint.h> void xtea3_encipher ( unsigned int num_rounds , uint32_t * v , uint32_t const * k ) { unsigned int i ; uint32_ta , b , c , d , součet = 0 , t , delta = 0x9E3779B9 ; _ součet = 0 ; a = v [ 0 ] + k [ 0 ]; b = v [ 1 ] + k [ 1 ]; c = v [ 2 ] + k [ 2 ]; d = v [ 3 ] + k [ 3 ]; for ( i = 0 ; i < num_rounds ; i ++ ){ a += ((( b << 4 ) + rol ( k [( součet % 4 ) + 4 ], b )) ^ ( d + součet ) ^ (( b >> 5 ) + rol ( k [ součet % 4 ], b >> 27 ))); součet += delta ; c += ((( d << 4 ) + rol ( k [(( součet >> 11 ) % 4 ) + 4 ], d )) ^ ( b + součet ) ^ (( d >> 5 ) + rol ( k [( součet >> 11 ) % 4 ], d >> 27 ))); t = a ; a = b_ _ b = c ; c = d ; d = t ; } v [ 0 ] = a ^ k [ 4 ]; v [ 1 ] = b ^ k [ 5 ]; v [ 2 ] = c ^ k [ 6 ]; v [ 3 ] = d ^ k [ 7 ]; } void xtea3_decipher ( unsigned int num_rounds , uint32_t * v , uint32_t const * k ) { unsigned int i ; uint32_ta , b , c , d , t , delta = 0x9E3779B9 , součet = delta * počet_kol ; _ d = v [ 3 ] ^ k [ 7 ]; c = v [ 2 ] ^ k [ 6 ]; b = v [ 1 ] ^ k [ 5 ]; a = v [ 0 ] ^ k [ 4 ]; for ( i = 0 ; i < num_rounds ; i ++ ){ t = d _ d = c ; c = b _ b = a ; a = t_ _ c -= ((( d << 4 ) + rol ( k [(( součet >> 11 ) % 4 ) + 4 ], d )) ^ ( b + součet ) ^ (( d >> 5 ) + rol ( k [( součet >> 11 ) % 4 ], d >> 27 ))); součet -= delta ; a -= ((( b << 4 ) + rol ( k [( součet % 4 ) + 4 ], b )) ^ ( d + součet ) ^ (( b >> 5 ) + rol ( k [ součet % 4 ], b >> 27 ))); } v [ 3 ] = d - k [ 3 ]; v [ 2 ] = c - k [ 2 ]; v [ 1 ] = b - k [ 1 ]; v [ 0 ] = a - k [ 0 ]; }XTEA-3 používá 5 MSB a 5 LSB registru prostého textu k otáčení klíče, protože statistiky ukazují, že tyto bity jsou nejvíce náchylné ke změně. Tento algoritmus také vyžaduje minimálně 32 iterací, avšak 48 iterací je kompromisem mezi rychlostí a spolehlivostí šifrování dat.
Tyto tři algoritmy jsou přirozeným rozšířením TEA a XTEA. Jejich charakteristické rysy ve srovnání s původními šifrovacími algoritmy jsou lepší rozvrh klíčů a větší blok a/nebo velikost klíče. Použití klíčů, které jsou dynamicky závislé na otevřeném textu, znamená, že neexistuje žádné předem určené pořadí pro použití klíčů a není vyžadována alokace paměti. To je poměrně užitečná vlastnost, protože úkol objevit nejčastěji používané klíče se stává obtížnější. Šifry jsou bezpečnější proti rozdílové kryptoanalýze , protože bity v klíči mohou ovlivnit jakékoli jiné bity v šifrovaném textu. Použití nelineární algebry (sčítání modulo 2 32 kromě "OR") je účinné proti lineární kryptoanalýze . Kromě toho použití těchto operací nezavádí do algoritmů zranitelnosti.
První algoritmus (XTEA-1) má nejvyšší rychlost a při dostatečném počtu kol (od 32 do 64) má dobrou spolehlivost. XTEA-2 je větší blokové rozšíření a není o nic bezpečnější než XTEA-1. XTEA-3 je rozšířením algoritmu pomocí větší velikosti bloku a klíče. Třetí možnost je o něco pomalejší, ale bezpečnější. Vzhledem k tomu, že tyto algoritmy jsou založeny na původním TEA s odstraněním všech známých nedostatků, lze je považovat za poměrně spolehlivé.
Srovnávací tabulka algoritmů:
Název algoritmu | Minimální počet kol | Maximální počet kol | Velikost bloku | Velikost klíče |
---|---|---|---|---|
XTEA-1 | 32 | 64 | 64 bitů | 128 bit |
XTEA-2 | 64 | 128 | 128 bit | 128 bit |
XTEA-3 | 64 | 128 | 128 bit | 256 bit |
Tyto algoritmy však stále vyžadují další vylepšení. Prvním problémem je, že pro klíčové cyklické bitové posouvání se používají pouze nejméně významné bity otevřeného textu (jako v XTEA-1 a XTEA-2). Druhým problémem je, že klíč je rozdělen do dvou podskupin po 4 prvcích a každá část výrazu používá pouze jednu podskupinu (jako v XTEA-3). XTEA-3 lze rozšířit použitím všech osmi prvků v obou částech výrazu. Pokud dojde k těmto vylepšením, algoritmus se stane praktičtějším, ale pak se bude příliš lišit od původního TEA.
Symetrické kryptosystémy | |
---|---|
Streamové šifry | |
Síť Feistel | |
Síť SP | |
jiný |