XTEA | |
---|---|
Luoja | David Wheeler ja Roger Needham |
Luotu | 1997_ _ |
julkaistu | 1997_ _ |
Avaimen koko | 128 bittinen |
Lohkon koko | 64-bittinen |
Kierrosten lukumäärä | 64 |
Tyyppi | Feistelin verkko |
Salaustekniikassa XTEA (eXtended TEA ) on lohkosalausalgoritmi, joka on suunniteltu poistamaan kriittiset virheet TEA -algoritmissa . Salauksen kehittäjät ovat David Wheeler ja Roger Needham (tietotekniikan laitos , Cambridgen yliopisto ). Algoritmi esiteltiin julkaisemattomassa teknisessä raportissa vuonna 1997 [1] . Salaus ei ole patentoitu, sitä käytetään laajalti useissa salaussovelluksissa ja monissa laitteistoissa sen erittäin alhaisten muistivaatimusten ja helppokäyttöisyyden vuoksi.
Kuten TEA , salaus perustuu 64-bittisiin lohkotoimintoihin, siinä on 32 täyttä jaksoa, jokaisessa täydessä jaksossa on kaksi Feistel Network -kierrosta , mikä tarkoittaa 64 Feistel Network -kierrosta. Kierrosten lukumäärää paremman diffuusion saavuttamiseksi voidaan kuitenkin lisätä suorituskyvyn kustannuksella. Lisäksi XTEA, kuten TEA, käyttää 128-bittistä avainta, joka koostuu neljästä 32-bittisestä sanasta K[0], K[1], K[2] ja K[3]. XTEA:lla ei ole avainaikataulutusalgoritmia tavallisessa mielessä. Määrittääkseen, mitä neljästä avainsanasta käytetään kullakin kierroksella, algoritmi käyttää vakiota δ = 9E3779B9 16 . TEA:ssa tällaista jakelua ei ole. Toinen ero TEA:sta on salauksessa käytettyjen bittitoimintojen permutaatio . Näiden parannusten ansiosta XTEA ei ole kokenut suuria komplikaatioita TEA:han verrattuna, mutta samalla eliminoi kaksi TEA-algoritmin päähaittaa [1] :
XTEA käyttää seuraavia loogisia operaatioita: XOR , bittisiirto ja looginen AND . Lisäksi XTEA käyttää kokonaislukujen yhteenlaskutoimintoa modulo 2 32 , joita merkitään x y (x ja y Z 2 32 ). Yksinomainen "OR" Boolen logiikassa merkitään x y:llä ja C -kielellä x ^ y. Looginen "AND" Boolen logiikassa on x y C-kielellä - x & y. Looginen x:n siirtymä y bitillä vasemmalle on merkitty x y:llä ja x:n looginen siirtymä y bitillä oikealle on merkitty x y:llä. Olkoon algoritmin n:nnen (1 ≤ n ≤ 64) kierroksen syöte (L n ,R n ), ja tulos on (L n+1 ,R n+1 ), jossa L n+1 = R n . Rn +1 lasketaan seuraavasti:
jos n = 2 * i - 1, jos 1 ≤ i ≤ 32, niin R n+1 = L n + ({ (R n 4 R n 5) R n } ({ i - 1 } * δ K [ ({ i ) — 1 } * δ) 3 ]),
jos n = 2 * i, jos 1 ≤ i ≤ 32, niin R n+1 = L n + ({ (R n 4 R n 5) R n } (i * δ K [ (i * δ 11) 3 ]) .
Koska tämä on lohkosalaus, jossa lohkon pituus on 64 bittiä ja datan pituus ei välttämättä ole 64 bitin kerrannainen, kaikkien lohkon 64-bitin kerrannaiseksi täydentävien tavujen arvoksi asetetaan 0x01 .
Uskotaan, että XTEA on turvallisempi kuin TEA, mutta on mahdollista poimia hyökkäystyyppi, jolle XTEA on haavoittuvampi [3] . Ensimmäinen lähestymistapa on differentiaaliset hyökkäykset . Koska TEA käyttää modulo 2 -lisäystä 32 kierroksen näppäimestä ja syöttää selkeää tekstiä, ja XTEA käyttää XOR:ta, on helpompi hyökätä XTEA:han kuin TEA:han. 14 XTEA-kierroksen jälkeen voidaan rakentaa differentiaalinen ominaisuus todennäköisyydellä 2 −57,79 ja käyttää sitä rikkomaan XTEA, joka sisältää 16 kierrosta (tämä hyökkäys vaatii 2 61 valittua selkeää tekstiä). Samaan aikaan TEA:n on vaikea rakentaa hyvää eroa. Toinen lähestymistapa on katkaistu differentiaalinen hyökkäys. Kahdeksan TEA- ja XTEA-kierroksen jälkeen voidaan muodostaa katkaistu erokäyrä todennäköisyydellä 1. Tällä hyökkäyksellä on mahdollista rikkoa XTEA enintään 23 kierrosten lukumäärällä ja TEA enintään 17 kierrosten määrällä. havaitaan kunkin algoritmin tärkeimpien suunnitteluominaisuuksien vuoksi.
Menestynein julkaistu hyökkäys XTEA:ta vastaan on linkitetyn avaimen differentiaalihyökkäys, joka pystyy murtamaan 37 algoritmin 64 kierroksesta käyttämällä 263 valittua selkeää tekstiä, joiden aikamonimutkaisuus on 2125 . Jos tarkastellaan heikkojen avainten osajoukkoa, joka sisältää 2 107,5 avainta 2 128 :sta , niin tämä hyökkäys pystyy murtamaan 51 algoritmin 64 kierroksesta aikakompleksisuudella 2 123 [4] .
C - kielen toteutus (muokattu David Wheelerin ja Roger Needhamin [1] artikkelissa esitetystä koodista ) salauksesta ja salauksen purkamisesta XTEA-algoritmilla:
#include <stdint.h> void xtea_encipher ( unsigned int num_rounds , uint32_t * v , uint32_t const * k ) { allekirjoittamaton int i ; uint32_t v0 = v [ 0 ], v1 = v [ 1 ], summa = 0 , delta = 0x9E3779B9 ; for ( i = 0 ; i < kierrosten_määrä ; i ++ ) { v0 += ((( v1 << 4 ) ^ ( v1 >> 5 )) + v1 ) ^ ( summa + k [ summa & 3 ]); summa += delta ; v1 += ((( v0 << 4 ) ^ ( v0 >> 5 )) + v0 ) ^ ( summa + k [( summa >> 11 ) & 3 ]); } v [ 0 ] = v0 ; v [ 1 ] = v1 ; } void xtea_decipher ( unsigned int num_rounds , uint32_t * v , uint32_t const * k ) { allekirjoittamaton int i ; uint32_t v0 = v [ 0 ], v1 = v [ 1 ], delta = 0x9E3779B9 , summa = delta * kierrosten_määrä ; for ( i = 0 ; i < kierrosten_määrä ; i ++ ) { v1 -= ((( v0 << 4 ) ^ ( v0 >> 5 )) + v0 ) ^ ( summa + k [( summa >> 11 ) & 3 ]); summa -= delta ; v0 -= ((( v1 << 4 ) ^ ( v1 >> 5 )) + v1 ) ^ ( summa + k [ summa & 3 ]); } v [ 0 ] = v0 ; v [ 1 ] = v1 ; }Kommentit:
Muutokset alkuperäiseen koodiin:
Avainaikataulussa löydetyt haavoittuvuudet ja onnistuneet hyökkäykset TEA- , XTEA- ja XXTEA- algoritmeja vastaan johtivat useiden kryptaanalyytikoiden vaihtoehtoisten salausten luomiseen. Erityisesti tällä hetkellä on olemassa TEA -perheen salakirjoihin perustuvia algoritmeja RTEA (Sean O'Neill), Raiden (Julio Castro), XTEA-1, XTEA-2 ja XTEA-3 [5] (Tom St. Denis) . Näitä modifikaatioita ei kuitenkaan ole tutkittu niin laajasti, eivätkä ne ole saaneet riittävää käytännön sovellusta.
Yksi XTEA:n haavoittuvuuksista on, että avaimen bitit vaikuttavat samoihin bitteihin algoritmin jokaisella kierroksella. Tämä ongelma voidaan poistaa käyttämällä salausta, joka sisältää avaimen ajoitusalgoritmin. Avainten ajoitus on dynaamista eikä vaadi muistin varaamista. Näppäinajoitus tehdään syklisellä avaimen bittisiirrolla selkotekstistä riippuvalla arvolla. XTEA-1-algoritmi toteuttaa tämän idean XTEA-salauksen vahvistamisesta muuttamalla hieman salauksen rakennetta muuttamatta algoritmin perusperiaatteita.
Salaus käyttää whitewashing-tekniikkaa ja tiedoista riippuvaa aliavainmuunnoksia, mikä vaikeuttaa kryptausanalyysiä , koska alkuperäinen algoritmi sisälsi haavoittuvuuden - tiettyjen avainbittien modifikaatio heijastui vastaaviin salatekstin bitteihin.
XTEA-1:n toteutus C -kielellä :
#include <stdint.h> uint32_t rol ( uint32_t base , uint32_t shift ) { uint32_t res ; /* vain 5 bittiä muutos on merkitsevää*/ vaihto &= 0x1F ; res = ( kanta << siirto ) | ( pohja >> ( 32 - vuoro )); return res ; } void xtea1_encipher ( unsigned int num_rounds , uint32_t * v , uint32_t const * k ) { allekirjoittamaton int i ; uint32_t y , z , summa = 0 , delta = 0x9E3779B9 ; /* lataa ja esivalko rekisterit */ y = v [ 0 ] + k [ 0 ]; z = v [ 1 ] + k [ 1 ]; /* Pyöreät funktiot */ for ( i = 0 ; i < kierrosten_määrä ; i ++ ) { y += (( z << 4 ) ^ ( z >> 5 )) + ( z ^ summa ) + rol ( k [ summa & 3 ], z ); summa += delta ; z += (( y << 4 ) ^ ( y >> 5 )) + ( y ^ summa ) + rol ( k [( summa >> 11 ) & 3 ], y ); } /* postittaa valkoinen ja kaupparekisterit */ v [ 0 ] = y ^ k [ 2 ]; v [ 1 ] = z ^ k [ 3 ]; } void xtea1_decipher ( unsigned int num_rounds , uint32_t * v , uint32_t const * k ) { allekirjoittamaton int i ; uint32_t y , z , delta = 0x9E3779B9 , summa = delta * kierrosten_määrä ; z = v [ 1 ] ^ k [ 3 ]; y = v [ 0 ] ^ k [ 2 ]; for ( i = 0 ; i < kierrosten_määrä ; i ++ ) { z -= (( y << 4 ) ^ ( y >> 5 )) + ( y ^ summa ) + rol ( k [( summa >> 11 ) & 3 ], y ); summa -= delta ; y -= (( z << 4 ) ^ ( z >> 5 )) + ( z ^ summa ) + rol ( k [ summa & 3 ], z ); } v [ 1 ] = z - k [ 1 ]; v [ 0 ] = y - k [ 0 ]; }"Roll"-toiminto suorittaa näppäimen syklisen bittisiirron käyttämällä vähiten merkitsevää 5 bittiä. Tämä algoritmi käyttää vain yhtä vuoroa kierrosta kohti, mikä on varsin tehokasta ja nopeaa useimmissa nykyaikaisissa prosessoreissa .
On mahdollista vaihtaa XTEA-1 käyttämällä 128-bittistä lohkoa. Tuloksena oleva algoritmi vaatii enemmän kierroksia, mutta sen salausnopeus on suurempi kuin XTEA:n.
XTEA-2:n käyttöönotto C :ssä :
#include <stdint.h> void xtea2_encipher ( unsigned int num_rounds , uint32_t * v , uint32_t const * k ){ allekirjoittamaton int i ; uint32_t a , b , c , d , summa = 0 , t , delta = 0x9E3779B9 ; a = v [ 0 ]; b = v [ 1 ] + k [ 0 ]; c = v [ 2 ]; d = v [ 3 ] + k [ 1 ]; for ( i = 0 ; i < kierrosten_määrä ; i ++ ) { a += (( b << 4 ) ^ ( b >> 5 )) + ( d ^ summa ) + rol ( k [ summa & 3 ], b ); summa += delta ; c += (( d << 4 ) ^ ( d >> 5 )) + ( b ^ summa ) + rol ( k [( summa >> 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 ){ allekirjoittamaton int i ; uint32_t a , b , c , d , t , delta = 0x9E3779B9 , summa = delta * kierrosten_määrä ; d = v [ 3 ]; c = v [ 2 ] ^ k [ 3 ]; b = v [ 1 ]; a = v [ 0 ] ^ k [ 2 ]; for ( i = 0 ; i < kierrosten_määrä ; i ++ ) { t = d_ _ d = c ; c = b _ b = a ; a = t_ _ c -= (( d << 4 ) ^ ( d >> 5 )) + ( b ^ summa ) + rol ( k [( summa >> 11 ) & 3 ], d ); summa -= delta ; a -= (( b << 4 ) ^ ( b >> 5 )) + ( d ^ summa ) + rol ( k [ summa & 3 ], b ); } v [ 0 ] = a ; v [ 1 ] = b - k [ 0 ]; v [ 2 ] = c ; v [ 3 ] = d - k [ 1 ]; }Tämän algoritmin tärkein etu on kyky salata suuria lohkoja. Tämä algoritmi käyttää samoja perustoimintoja kuin XTEA-1, mutta vaatii enemmän iteraatioita. Se vaatii itse asiassa kaksi kertaa enemmän iteraatioita 32-64 (64-128 kierrosta). 48 iteraatio on kompromissi salauksen nopeuden ja luotettavuuden välillä.
Toinen XTEA-1:n luonnollinen laajennus on 256-bittisen avaimen ja käytännöllisemmän 128-bittisen lohkon käyttö. Tämä algoritmi vaatii 32-64 iteraatiota, mutta tarjoaa samalla luotettavan suojan hyökkäyksiä vastaan kattavalla haulla. Salaus käyttää whitewashing-tekniikkaa ja toteuttaa avaimesta riippuvaisia operaatioita, mikä tekee kryptan analysoinnista vaikeaa.
XTEA-3:n käyttöönotto C :ssä :
#include <stdint.h> void xtea3_encipher ( unsigned int num_rounds , uint32_t * v , uint32_t const * k ) { allekirjoittamaton int i ; uint32_t a , b , c , d , summa = 0 , t , delta = 0x9E3779B9 ; summa = 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 < kierrosten_määrä ; i ++ ){ a += ((( b << 4 ) + rol ( k [( summa % 4 ) + 4 ], b )) ^ ( d + summa ) ^ (( b >> 5 ) + rol ( k [ summa % 4 ], b >> 27 ))); summa += delta ; c += ((( d << 4 ) + rol ( k [(( summa >> 11 ) % 4 ) + 4 ], d )) ^ ( b + summa ) ^ (( d >> 5 ) + rol ( k [( summa >> 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 ) { allekirjoittamaton int i ; uint32_t a , b , c , d , t , delta = 0x9E3779B9 , summa = delta * kierrosten_määrä ; d = v [ 3 ] ^ k [ 7 ]; c = v [ 2 ] ^ k [ 6 ]; b = v [ 1 ] ^ k [ 5 ]; a = v [ 0 ] ^ k [ 4 ]; for ( i = 0 ; i < kierrosten_määrä ; i ++ ){ t = d_ _ d = c ; c = b _ b = a ; a = t_ _ c -= ((( d << 4 ) + rol ( k [(( summa >> 11 ) % 4 ) + 4 ], d )) ^ ( b + summa ) ^ (( d >> 5 ) + rol ( k [( summa >> 11 ) % 4 ], d >> 27 ))); summa -= delta ; a -= ((( b << 4 ) + rol ( k [( summa % 4 ) + 4 ], b )) ^ ( d + summa ) ^ (( b >> 5 ) + rol ( k [ summa % 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 käyttää 5 MSB:tä ja 5 LSB:tä selväkielirekisteristä avaimen kiertämiseen, koska tilastot osoittavat, että nämä bitit ovat alttiimpia muutoksille. Tämä algoritmi vaatii myös vähintään 32 iteraatiota, mutta 48 iteraatiota on kompromissi tiedon salauksen nopeuden ja luotettavuuden välillä.
Nämä kolme algoritmia ovat TEA : n ja XTEA:n luonnollisia laajennuksia. Niiden erottuvia piirteitä alkuperäisiin salausalgoritmeihin verrattuna ovat parempi avainaikataulu ja suurempi lohko- ja/tai avaimen koko. Selkeästä tekstistä dynaamisesti riippuvien avainten käyttö tarkoittaa, että näppäinten käytölle ei ole ennalta määrättyä järjestystä eikä muistin varaamista tarvita. Tämä on varsin hyödyllinen ominaisuus, koska useimmin käytettyjen avainten löytäminen vaikeutuu. Salaukset ovat turvallisempia differentiaalista kryptausanalyysiä vastaan , koska avaimen bitit voivat vaikuttaa muihin salatekstin bitteihin. Epälineaarisen algebran käyttö (lisäys modulo 2 32 pois lukien "OR") on tehokas lineaarista kryptausanalyysiä vastaan . Lisäksi näiden toimintojen käyttö ei tuo haavoittuvuuksia algoritmeihin.
Ensimmäisellä algoritmilla (XTEA-1) on suurin nopeus ja riittävällä kierrosmäärällä (32-64) hyvä luotettavuus. XTEA-2 on suurempi lohkolaajennus, eikä se ole turvallisempi kuin XTEA-1. XTEA-3 on algoritmin laajennus käyttämällä suurempaa lohkokokoa ja avainta. Kolmas vaihtoehto on hieman hitaampi, mutta turvallisempi. Koska nämä algoritmit perustuvat alkuperäiseen TEA :han ja poistavat kaikki tunnetut puutteet, niitä voidaan pitää varsin luotettavina.
Vertaileva algoritmitaulukko:
Algoritmin nimi | Kierrosten vähimmäismäärä | Kierrosten enimmäismäärä | Lohkon koko | Avaimen koko |
---|---|---|---|---|
XTEA-1 | 32 | 64 | 64 bittiä | 128 bittinen |
XTEA-2 | 64 | 128 | 128 bittinen | 128 bittinen |
XTEA-3 | 64 | 128 | 128 bittinen | 256 bittiä |
Nämä algoritmit vaativat kuitenkin vielä tarkennusta. Ensimmäinen ongelma on, että vain vähiten merkitseviä selkeän tekstin bittejä käytetään avaimen sykliseen bittisiirtoon (kuten XTEA-1:ssä ja XTEA-2:ssa). Toinen ongelma on, että avain on jaettu kahteen 4 elementin alaryhmään, ja jokainen lausekkeen osa käyttää vain yhtä alaryhmää (kuten XTEA-3:ssa). XTEA-3:a voidaan laajentaa käyttämällä kaikkia kahdeksaa elementtiä lausekkeen molemmissa osissa. Jos nämä parannukset tehdään, algoritmista tulee käytännöllisempi, mutta silloin se on liian erilainen kuin alkuperäinen TEA.
Symmetriset salausjärjestelmät | |
---|---|
Suoratoista salauksia | |
Feistelin verkko | |
SP verkko | |
Muut |