CEAI | |
---|---|
Creator | David Wheeler și Roger Needham |
Creată | 1994 _ |
publicat | 1994 _ |
Dimensiunea cheii | 128 de biți |
Dimensiunea blocului | pe 64 de biți |
Numărul de runde | 64 (32 de cicluri) |
Tip de | Rețeaua Feistel |
În criptografie , Tiny Encryption Algorithm (TEA) [1] este un algoritm de criptare în bloc de tip Feistel Network . Algoritmul a fost dezvoltat la Departamentul de Informatică al Universității din Cambridge de David Wheeler ( David Wheeler ) și Roger Needham ( Roger Needham ) și a fost prezentat pentru prima dată în 1994 [2] la un simpozion despre algoritmii de criptare rapidă din Leuven ( Belgia ).
Cifrul este neproprietar , utilizat pe scară largă într-o serie de aplicații criptografice și într-o mare varietate de hardware datorită cerințelor sale extrem de scăzute de memorie și ușurinței de implementare. Algoritmul are atât o implementare software în diferite limbaje de programare, cât și o implementare hardware pe circuite integrate de tip FPGA .
Algoritmul de criptare TEA [1] se bazează pe operații pe biți cu un bloc de 64 de biți , are o cheie de criptare de 128 de biți . Numărul standard de runde de rețea Feistel este de 64 (32 de runde), totuși, pentru a obține cea mai bună performanță sau criptare, numărul de runde poate fi variat de la 8 (16 runde) la 64 (128 de runde). Rețeaua Feistel este asimetrică datorită utilizării adăugării modulo 2 32 ca operație de suprapunere .
Avantajele cifrului sunt ușurința de implementare, dimensiunea mică a codului și viteza de execuție destul de mare, precum și posibilitatea de optimizare a execuției pe procesoare standard pe 32 de biți, deoarece operațiunile principale sunt exclusiv „OR” (XOR) , deplasare pe biți. şi adăugarea prin modulul 2 32 . Deoarece algoritmul nu folosește tabele de căutare și funcția de rotunjire este destul de simplă, algoritmul are nevoie de cel puțin 16 cicluri (32 de runde) pentru a obține o difuzie eficientă, deși difuzia completă se realizează în 6 cicluri (12 runde). [unu]
Algoritmul are o rezistență excelentă la criptoanaliza liniară și o rezistență destul de bună la criptoanaliza diferențială . Principalul dezavantaj al acestui algoritm de criptare este vulnerabilitatea lui la atacurile legate de chei . Datorită programării simple a tastelor, fiecare tastă are 3 taste echivalente. Aceasta înseamnă că lungimea efectivă a cheii este de numai 126 de biți [3] [4] , deci acest algoritm nu trebuie utilizat ca funcție hash .
Textul sursă este împărțit în blocuri de 64 de biți fiecare. Cheia de 128 de biți K este împărțită în patru subchei de 32 de biți K[0], K[1], K[2] și K[3]. Acest lucru completează procesul pregătitor, după care fiecare bloc de 64 de biți este criptat pentru 32 de cicluri (64 de runde) conform algoritmului de mai jos. [5]
Să presupunem că intrarea rundei a n-a (pentru 1 ≤ n ≤ 64) este părțile din dreapta și din stânga (L n , R n ), atunci rezultatul rundei a n-a va fi părțile din stânga și din dreapta (L n+1 , R n +1 ), care se calculează conform următoarelor reguli:
L n+1 = R n .
Dacă n = 2 * i - 1 pentru 1 ≤ i ≤ 32 (runde impare), atunci R n+1 = L n ({ [ R n 4 ] K[0] } { R n i * δ } { [ R n 5 ] K[1] })
Dacă n = 2 * i pentru 1 ≤ i ≤ 32 (runde pare), atunci R n+1 = L n ({ [ R n 4 ] K[2] } { R n i * δ } { [ R n 5 ] K[3] })
Unde
De asemenea, este evident că nu există un algoritm de programare a cheilor ca atare în algoritmul de criptare TEA. În schimb, subcheile K[0] și K[1] sunt folosite în runde impare, iar K[2] și K[3] în runde pare.
Deoarece acesta este un cifr de bloc , unde lungimea blocului este de 64 de biți și lungimea datelor poate să nu fie un multiplu de 64 de biți, valoarea tuturor octeților care completează blocul la un multiplu de 64 de biți este setată la 0x01 .
Implementarea în limbajul de programare C (o versiune adaptată a codului prezentat în articolul lui David Wheeler și Roger Needham [2] ) a funcțiilor de criptare și decriptare folosind algoritmul TEA:
#include <stdint.h> void encrypt ( uint32_t * v , const uint32_t * k ) { /* înființat */ uint32_tv0 = v [ 0 ] ; uint32_tv1 = v [ 1 ] ; uint32_t suma = 0 ; uint32_t i ; /* o constantă cheie de program */ uint32_t delta = 0x9e3779b9 ; /* cheie cache */ uint32_tk0 = k [ 0 ] ; uint32_tk1 = k [ 1 ] ; uint32_t k2 = k [ 2 ]; uint32_t k3 = k [ 3 ]; /* începerea ciclului de bază */ pentru ( i = 0 ; i < 32 ; ++ i ) { suma += delta ; v0 += ( ( v1 << 4 ) + k0 ) ^ ( v1 + sumă ) ^ ( ( v1 >> 5 ) + k1 ); v1 += ( ( v0 << 4 ) + k2 ) ^ ( v0 + sumă ) ^ ( ( v0 >> 5 ) + k3 ); } /* sfarsit ciclu */ v [ 0 ] = v0 ; v [ 1 ] = v1 ; } void decrypt ( uint32_t * v , const uint32_t * k ) { /* înființat */ uint32_tv0 = v [ 0 ] ; uint32_tv1 = v [ 1 ] ; uint32_tsum = 0xC6EF3720 ; _ uint32_t i ; /* o constantă cheie de program */ uint32_t delta = 0x9e3779b9 ; /* cheie cache */ uint32_tk0 = k [ 0 ] ; uint32_tk1 = k [ 1 ] ; uint32_t k2 = k [ 2 ]; uint32_t k3 = k [ 3 ]; /* începerea ciclului de bază */ pentru ( i = 0 ; i < 32 ; ++ i ) { v1 -= ( ( v0 << 4 ) + k2 ) ^ ( v0 + sumă ) ^ ( ( v0 >> 5 ) + k3 ); v0 -= ( ( v1 << 4 ) + k0 ) ^ ( v1 + sumă ) ^ ( ( v1 >> 5 ) + k1 ); suma -= delta ; } /* sfarsit ciclu */ v [ 0 ] = v0 ; v [ 1 ] = v1 ; }Comentarii:
Modificări față de codul original:
Se presupune că acest algoritm oferă o securitate comparabilă cu algoritmul de criptare IDEA , deoarece folosește aceeași idee de utilizare a operațiilor din grupuri algebrice ortogonale . [1] Această abordare oferă o protecție excelentă împotriva tehnicilor de criptoanaliza liniară .
Algoritmul este cel mai vulnerabil la atacurile legate de chei din cauza programării simple a cheilor ( inclusiv a lipsei unui algoritm de programare a cheilor ca atare). Sunt cunoscute cel puțin trei atacuri de acest tip, ele au fost prezentate în lucrarea lui John Kelsey ( John Kelsea ), Bruce Schneier ( Bruce Schneier ) și David Wagner ( David Wagner ) în 1997 [6] . Cele mai simple dintre ele dau un răspuns diferențial cu o probabilitate de 2 -32 după 32 de cicluri ale algoritmului, deci sunt necesare cel puțin 2 34 de texte clare alese pentru a găsi răspunsul diferențial cu o probabilitate de 1 și a determina toți biții cheii. Un atac mai complex, care combină ideile „atacului cheie legat” [7] al lui Eli Biham și un atac diferențial , oferă un răspuns diferențial cu o probabilitate de 2 −11 , necesită doar 2 23 de texte clare alese și un timp de aproximativ 2 32 de timpi de criptare (adică necesită un număr de operații pe biți de ordinul a 2 32 ).
TEA sa dovedit a fi destul de robust împotriva criptoanalizei diferenţiale . Un atac TEA cu 10 runde necesită 2 52,5 texte clare alese și are o complexitate de timp de 2 84 [8] . Cel mai bun rezultat este criptoanaliza a 17 runde de TEA [9] . Acest atac necesită doar 1920 de texte clare alese, dar are o complexitate temporală de 2123,37 .
O altă problemă a algoritmului TEA este existența cheilor echivalente. S-a demonstrat că fiecare tastă are trei echivalente [4] . Aceasta înseamnă că lungimea efectivă a cheii este de numai 126 de biți în loc de cei 128 intenționați de dezvoltatori, așa că nu este de dorit să se utilizeze TEA ca funcție hash , ceea ce a fost reflectat în cartea lui Andrew Huang „ Hacking the Xbox: an introduction to reverse engineering” („Hacking the Xbox: An Introduction to Reverse Engineering”) folosind exemplul de piratare a consolei de jocuri Microsoft Xbox .
Tabelul cheilor echivalente:
K[0] | K[1] | K[2] | K[3] |
K[0] | K[1] | K[2] 80000000 h | K[3] 80000000 h |
K[0 ] 80000000h | K[1] 80000000 h | K[2] | K[3] |
K[0 ] 80000000h | K[1] 80000000 h | K[2] 80000000 h | K[3] 80000000 h |
Descoperirea unui număr de vulnerabilități și slăbiciuni grave în algoritmul TEA original a condus la crearea rapidă a extensiilor sale. Principalele diferențe ale tuturor acestor algoritmi sunt o programare îmbunătățită a cheilor, dependența dinamică a cheii de text, precum și o dimensiune diferită a cheii, bloc de intrare și/sau numărul de runde ale rețelei Feistel.
XTEAXTEA are o dimensiune a blocului de 64 de biți, o dimensiune a cheii de 128 de biți și o rundă de rețea Feistel de 64. Algoritmul a fost dezvoltat de David Wheeler și Roger Needham și publicat în 1997 . Principala diferență față de algoritmul TEA original este prezența unui algoritm de programare a cheilor, care a făcut posibilă eliminarea unei vulnerabilități critice pentru „atacuri asupra cheilor asociate”, dar a condus la o deteriorare a rezistenței la criptoanaliza diferențială [9] . Există trei modificări ale acestui algoritm dezvoltat de Tom Denis [10] : XTEA-1 (dimensiunea blocului - 64 de biți, dimensiunea cheii - 128 de biți, numărul de runde ale rețelei Feistel - 32), XTEA-2 (dimensiunea blocului - 128 de biți , dimensiunea cheii 128 biți, numărul rețelei Feistel 64) și XTEA-3 (dimensiunea blocului 128 biți, dimensiunea cheii 256 biți, numărul rețelei Feistel 64).
XXTEAÎn 1998, a fost publicată următoarea extensie a algoritmului, numită XXTEA . Dimensiunea cheii este de 128 de biți. O caracteristică distinctivă este capacitatea de a cripta orice blocuri care sunt multiplu de 64 de biți, numărul de runde este de 52 + 6 * (numărul de cuvinte de 32 de biți dintr-un bloc) sau 52 + 12 * M cu o lungime de bloc de 64 * M biți. Eficacitatea practică a unui atac diferențial publicat anonim nu a fost dovedită [11] .
RTEAExistă, de asemenea, o modificare alternativă a algoritmului TEA, numită RTEA , dezvoltată în 2007 de Marcos el Ruptor . Dimensiunea blocului - 64 de biți; pentru o cheie de 128 de biți, numărul de runde ale rețelei Feistel este de 48, pentru o cheie de 256 de biți este de 64. Potrivit dezvoltatorilor, acest algoritm este mai productiv și mai rezistent la criptoanaliza [12] decât XTEA, totuși , acest algoritm are deja un „atac asupra cheilor aferente” [13] .
RaidenFolosind mecanisme de programare genetică în 2006, o echipă de dezvoltatori condusă de Julio Castro ( ing. Julio César Hernández Castro ) a creat algoritmul Raiden , conceput pentru a elimina vulnerabilitățile cifrului TEA. Acesta repetă aproape exact structura algoritmului TEA, cu excepția faptului că algoritmul Raiden are un algoritm extins de programare a cheilor. Numărul standard de runde ale rețelei Feistel este de 32 (16 cicluri). Raiden folosește un program de chei asemănător PRNG, transformă cheia și generează subchei pentru fiecare rundă. Cifrul trece cu succes testele Diehard , Sexton și ORL [14] .
Comparația diferitelor versiuni ale extensiei algoritmului TEAIată un tabel comparativ cu principalele caracteristici ale familiei de algoritmi TEA:
Numele algoritmului | Număr standard de runde de rețea Feistel | Dimensiunea blocului | Dimensiunea cheii |
---|---|---|---|
CEAI | 64 | 64 de biți | 128 de biți |
XTEA | 64 | 64 de biți | 128 de biți |
XTEA-1 | 32 | 64 de biți | 128 de biți |
XTEA-2 | 64 | 128 de biți | 128 de biți |
XTEA-3 | 64 | 128 de biți | 256 de biți |
XXTEA | 52+12*M | 64*M biți | 128 de biți |
RTEA | 48 sau 64 | 64 de biți | 128 sau 256 de biți |
Raiden | 32 | 64 de biți | 128 de biți |
În același timp, autorii algoritmului TEA pe pagina lor oficială [1] atrag atenția asupra faptului că, în condiții reale de utilizare practică, algoritmul TEA este încă destul de fiabil și toate vulnerabilitățile găsite, de regulă, nu sunt critic, de exemplu, la transmiterea datelor în timp real.
Criptosisteme simetrice | |
---|---|
Cifruri în flux | |
Rețeaua Feistel | |
Rețeaua SP | |
Alte |