Two-Track-MAC este un cod de autentificare a mesajelor conceput pentru a verifica autenticitatea și integritatea datelor transmise. Cu alte cuvinte, ne putem asigura că datele au fost transferate din sursa corectă și că conținutul acestora nu s-a schimbat în timpul transferului.
Scopul principal : Preveniți modificarea mesajelor de către o terță parte în timpul transmiterii. Exemple de mesaje sunt plățile bancare electronice sau sistemele automate de control pentru obiectele în mișcare.
Dezvoltatori : Bart van Rompay , Bert den Boer .
Algoritmul Two-Track-MAC a fost ales în proiectul NESSIE (New European Electronic Signature Algorithms) în noiembrie 2000 și a fost conceput ca un analog mai rapid și mai fiabil al algoritmilor MAC disponibili la acea vreme. Bart van Rompay de la Universitatea din Leuven (Katholieke Universiteit Leuven) - Belgia și Bert den Boer de la debis AG (Germania) au participat la dezvoltare .
Two-Track-MAC se bazează pe funcția hash RIPEMD-160 . Particularitatea constă în criptarea mesajului de-a lungul a două căi independente (indicate ca L și R în figură ). Această abordare vă permite să măriți dimensiunea stării interne. Ca rezultat, obținem mai multe valori posibile ale funcției de criptare internă. Acest lucru face posibilă complicarea atacurilor pe baza enumerarii tuturor valorilor posibile.
În comparație cu MDx-MAC, care se bazează și pe RIPEMD-160, Two-Track-MAC este mult mai eficient pentru mesajele scurte (512 sau 1024 biți) și, de asemenea, mai eficient pentru mesajele lungi.
Un alt avantaj important al TTMAC este capacitatea de a schimba rapid cheia de criptare. Acest lucru vă permite să creșteți stabilitatea sistemului, fără a reduce viteza. Cu o schimbare destul de frecventă a cheii, un atacator nu va putea colecta un număr mare de perechi mesaj-cod MAC, ceea ce reduce foarte mult probabilitatea de a ghici cheia sau codul MAC.
După cum sa menționat deja, Two-Track-MAC are două blocuri de transformare paralele L(K,M) și R(K,M) , care acceptă mesajul M și tasta K ca intrare . Ca rezultat, fiecare dintre blocuri funcționează independent unul de celălalt și creează două reprezentări diferite ( A și B în figură) ale acelorași date.
Să presupunem mai întâi că dimensiunea mesajului M este de 512 biți. Mărimea cheii K este întotdeauna fixă și este de 160 de biți. Pentru a complica transformările , L(K,M) scoate cinci cuvinte de 32 de biți ( ) . Adică, împarte în mod oficial versiunea încă preliminară a cheii în 5 părți de aceeași dimensiune. În mod similar, mulțimea ( ) dă rezultatul funcției R(K,M) . Apoi aceste cuvinte se scad modulo . Acesta este un fel de amestecare a două valori pentru a aduce de la o lungime fixă de 160 de biți. Rezultatul final: ) , unde . De fapt, pentru asta s-a făcut totul. E este codul de autentificare a mesajului M .
Dacă mesajul depășește 512 biți, atunci M este împărțit în blocuri , unde are o lungime de 512 biți. Ca urmare a procesului, efectuăm aceleași operații pe fiecare bloc, amestecându-le pe rând. Un mesaj cu lungimea nu multiplu de 512 este umplut cu zerouri și unu la dimensiunea de care avem nevoie.
După ce fiecare ramură a algoritmului procesează următorul bloc al mesajului, rezultatele trebuie să fie cumva transformate, astfel încât rezultatul să fie o lungime fixă a cheii. Să luăm în considerare acest proces mai detaliat.
Să introducem notația:
Apoi, creăm două blocuri de 160 de biți și . Aceste blocuri sunt umplute cu diferite combinații cu ieșirea funcțiilor L și R. Și anume:
,
,
,
,
,
,
,
,
.
Nu uitați că toate adunările și scăderile se fac modulo .
Când mesajul este mai mare de 512 biți, blocurile C și D primite vor fi introduse în locul tastei pentru următorul bloc de mesaj. Aceasta continuă până când vom parcurge întregul mesaj.
În mod convențional, întregul proces de creare a unui cod de autenticitate poate fi reprezentat astfel:
apoi procesul se repetă, cu singura diferență că cheia este rezultatul calculului anterior.
În ultima iterație, schimbăm datele de intrare pentru R și L. Acest lucru se face pentru a crește puterea codului de autentificare. Cele finale sunt Two-track-MAC.
Mai jos este pseudocodul algoritmului.
FOR i:= 0 TO n-1 { DACĂ (i!=n-1) FOR j:= 0 TO 79 { ; } else FOR j:= 0 TO 79 { } IF (i != n-1) { } } ; Clarificări și posibile implementăriAcesta explică notația folosită în pseudocodul TTMAC și discută fezabilitatea implementării acestuia.
este o funcție neliniară care funcționează cu biți. Pentru diferit j efectuează diferite operații pe x, y, z. Și anume:
De exemplu, în C este convenabil să reprezentați aceste funcții ca macrocomenzi [1] :
#define F1(x, y, z) (x ^ y ^ z) #define F2(x, y, z) (z ^ (x & (y^z))) #definiți F3(x, y, z) (z ^ (x | ~y)) #define F4(x, y, z) (y ^ (z & (x^y))) #definiți F5(x, y, z) (x ^ (y | ~z))Simbolurile denotă constante ale căror valori sunt determinate de intervalul j:
Funcțiile r(j) și r' dau unul dintre cele 16 blocuri posibile în care este împărțit mesajul original. Deoarece blocurile au o dimensiune de 512 biți, r(j) poate lua valori de la 0 la 15. Unde r(j) = 0 (r'(j) = 0) înseamnă biți 0...15 și r(j) = 15 (r'(j) = 15) sunt biții 495…511 respectiv.
Exemplu: Fiți mesajul:
M = "Hashing universal optimizat pentru software și autentificare a mesajelor."Să atribuim un cod specific fiecărui personaj:
„S”, „o”, „f”, „t”, „w”, „a”, „r”, „e”, „-”, „o”, „p”, „t”, „i " ", "m", "i", "z" 83, 111, 102, 116, 119, 97, 114, 101, 45, 111, 112, 116, 105, 109, 105, 122 "e", "d", " ", "u", "n", "i", "v", "e", "r", "s", "a", "l", " ", „h”, „a”, „s” 101, 100, 32, 117, 110, 105, 118, 101, 114, 115, 97, 108, 32, 104, 97, 115 "h", "i", "n", "g", " ", "a", "n", "d", " ", "m", "e", "s", "s", „a”, „g”, „e” 104, 105, 110, 103, 32, 97, 110, 100, 32, 109, 101, 115, 115, 97, 103, 101 " ", "a", "u", "t", "h", "e", "n", "t", "i", "c", "a", "t", "i" , "pe", "." 32, 97, 117, 116, 104, 101, 110, 116, 105, 99, 97, 116, 105, 111, 110, 46În reprezentare binară, textul mesajului va conține 512 zerouri și unu. Apoi este împărțit în 16 blocuri de 32 de biți:
= (01010011 01101111 01100110 01110100) = (01110111 01100001 01110010 01100101) = (00101101 01101111 01110000 01110100) = (01101001 01101101 01101001 01111010) = (01100101 01100100 00100000 01110101) = (01101110 01101001 01110110 01100101) = (01110010 01110011 01100001 01101100) = (00100000 01101000 01100001 01110011) = (01101000 01101001 01101110 01100111) = (00100000 01100001 01101110 01100100) = (00100000 01101101 01100101 01110011) = (01110011 01100001 01100111 01100101) = (00100000 01100001 01110101 01110100) = (01101000 01100101 01101110 01110100) = ( 01101001 01100011 01100001 01110100) = (01101001 01101111 01101110 00101110)Ca rezultat, funcția va returna: (00100000 01101000 01100001 01110011). A va da al treilea bit, adică 1.
s(j) și - dați numărul de biți pentru operația de rotație a biților rol.
De fapt, toate expresiile descrise mai sus sunt împrumutate din algoritmul hash RIPEMD-160 . De aceea RIPEMD-160 este baza pentru Two-Track-MAC.
O implementare a algoritmului TTMAC a fost inclusă în biblioteca criptografică Crypto++ [2] .
Să demonstrăm un exemplu despre cum funcționează algoritmul pentru diferite date de intrare. Primul parametru este o cheie de 160 de biți. Al doilea parametru este mesajul care trebuie trimis. La ieșire, obținem un cod de autentificare pe 160 de biți.
TTMAC(K,M) = TTMAC(00000000000000000000000000000000000000,"") = 46724343BDDF4A150009046D4CBF16F2A6378073 TTMAC(K,M) = TTMAC(0000000000000000000000000000000000000,„Bună lume”) = 5C8350FEEA6922C4E79F262A72603AA7F99C381D TTMAC(K,M) = TTMAC(00000000000000000000000000000000000001,"1") = 8B91136B35096C30C58FA17D7ADE882DBC1CC482Codul de autentificare rezultat vă permite să verificați că datele nu au fost modificate în niciun fel de când au fost create, transmise sau stocate de o sursă de încredere. Există diverse scheme care efectuează acest tip de verificare.
De exemplu, două părți care au încredere una în cealaltă au convenit în avans să folosească o cheie secretă care este cunoscută doar de ei. Aceasta garantează autenticitatea sursei și a mesajului. Dezavantajul acestei abordări este evident. Este nevoie de două părți care să aibă încredere unul în celălalt.
De asemenea, este posibil să partajați codul de autentificare a mesajului împreună cu funcția de criptare simetrică conform uneia dintre schemele:
Această abordare implică o diferență în chei și , precum și o diferență în algoritmii de criptare și calcul MAC. În caz contrar, există posibilitatea unor corelații suplimentare care pot fi folosite pentru a respinge cheile.
În special, TTMAC poate fi utilizat pentru „autentificarea tranzacțiilor”. Aceasta înseamnă că mesajul este confirmat prin unicitate și transmitere în timp util. Acest tip de autentificare oferă capacitatea de a proteja împotriva reutilizarii mesajelor transmise anterior, ceea ce este necesar în cazurile în care o amenințare poate duce la consecințe nedorite.
Succesul atacurilor pe Two-Track-MAC depinde de complexitatea tastei k, care ar trebui să aibă o lungime de 160 de biți, de lungimea codului de ieșire m, care poate fi de 32,64,.. și de 160 de biți și de lungimea l a starea internă, care este de 320 de biți.
Prima posibilitate este de a enumera toate cheile posibile. Dacă este posibil să ridicați cheia, atunci atacatorul are capacitatea de a falsifica orice mesaj. Pentru o cheie de lungime k și un cod de ieșire de lungime m, un astfel de atac necesită încercări și perechi cunoscute (text, MAC) pentru a testa. Deoarece dimensiunea stării interne TTMAC este de 360 de biți, probabilitatea de calculare a valorii codului de autenticitate este redusă la , în comparație cu pentru RIPEMD-160.
Căutarea așa-numitelor [coliziune|coliziune] necesită cunoașterea perechilor (text,MAC), unde l este lungimea stării interne. Într-adevăr, acest rezultat rezultă din paradoxul „zilelor de naștere”. Pentru a detecta coliziunile interne folosind investigarea coliziunilor externe, este necesară ordinea de setare text-MAC. În plus, riscul poate fi redus prin reducerea duratei de viață a cheii.
Rezultatele sunt prezentate în tabel:
Tipuri de atac | Încercări | Posibil Succes | cupluri celebre |
---|---|---|---|
Găsirea unei chei | |||
MAC ghicit | |||
Atacul bazat pe paradoxul zilei de naștere |
Numărul de operațiuni pentru TTMAC este doar cu câteva procente mai mare decât numărul de operațiuni necesare pentru calcularea RIPEMD-160. Să comparăm codul extrem de optimizat RIPEMD-160 și TTMAC. Primul necesită 1013 cicluri pe bloc, iar pentru același grad de optimizare TTMAC va avea nevoie de aproximativ 1044 cicluri pe bloc. Acest lucru se realizează prin proiectarea inițială a algoritmului pentru funcționare rapidă pe dispozitive de calcul.