Mod de criptare - o metodă de aplicare a unui cifr de bloc (algoritm) care vă permite să convertiți o secvență de blocuri de date deschise într-o secvență de blocuri de date criptate . În acest caz, datele dintr-un alt bloc pot fi folosite pentru a cripta un bloc.
În mod obișnuit, modurile de criptare sunt folosite pentru a modifica procesul de criptare, astfel încât rezultatul criptării fiecărui bloc să fie unic, indiferent de datele care sunt criptate și să nu permită concluzii despre structura acestora. Acest lucru se datorează în primul rând faptului că cifrurile bloc criptează datele în blocuri de dimensiune fixă și, prin urmare, există potențialul de scurgere de informații despre părți repetate ale datelor criptate cu aceeași cheie .
În 1981, a fost adoptat standardul FIPS 81 . Standardul a descris primele moduri de criptare bloc: ECB, CBC, OFB și CFB. În 2001, Institutul NIST (Institutul Național de Standarde și Tehnologie din SUA ) a revizuit lista de moduri și a adăugat o descriere a funcționării cifrului bloc AES în modul CTR ( SP800-38A ). În ianuarie 2010, NIST a adăugat standardului o descriere a funcționării cifrului AES în modul XTS (SP800-38E).
Standardul nu descrie toate modurile, ci doar modurile aprobate de institutul NIST . De exemplu, modul CTS ( furtul de text cifrat ) nu este descris în standard, dar este implementat în multe biblioteci criptografice populare .
Modurile de criptare sunt definite de un număr de organizații recunoscute la nivel național și internațional. Cel mai influent dintre acestea este NIST .
Mai jos este o descriere a mai multor moduri de criptare folosind cifrurile bloc [1] .
În GOST 28147-89 , acest mod este numit modul de înlocuire simplă .
Criptare:
Să fie dat un mesaj ( text simplu , secvență de biți, date).
În timpul criptării, sunt efectuate următoarele acțiuni:
Decriptare:
este executat de funcția folosind aceeași tastă k :
Particularitati:
Dezavantajele BCE:
Text simplu ca imagine | Criptogramă obținută prin criptare în modul ECB. Imaginea prezintă caracteristicile imaginii originale | Criptogramă obținută prin criptare non-ECB. Imaginea este o secvență pseudo-aleatorie de pixeli |
Avantajele BCE:
Acest mod se numește modul carte electronică de coduri, deoarece este posibil să se creeze o carte în care fiecare bloc de text simplu va fi asociat cu un bloc de text cifrat. Cu toate acestea, crearea unei cărți nu este o sarcină banală. Dacă dimensiunea blocului este de x biți, atunci cartea va conține 2 x intrări și fiecare carte va corespunde unei chei.
Pentru a cripta un mesaj se parcurg următorii pași [4] .
Decriptarea este realizată de funcția folosind aceeași cheie k și vectorul de inițializare IV :
Dezavantajele CBC:
Avantajele CBC:
Deficiențele modului CBC au condus la crearea unui mod îmbunătățit de propagare a înlănțuirii blocurilor de cifrat (Propagating Cipher Block Chaining, PCBC) [4] . Desigur, acest mod este similar cu CBC, cu excepția faptului că blocul de text simplu anterior și blocul de text cifrat anterior sunt XOR cu blocul de text simplu curent înainte sau după criptare. [1]
În consecință, decriptare: unde este vectorul de inițializare
Modul de criptare RSVS este utilizat în versiunea de protocol Kerberos 4 și vă permite să detectați erori. Acest mod de criptare nu este un standard federal sau internațional. Modul PCBC este o variantă a modului CBC, care are o proprietate specifică - o eroare de text cifrat duce la decriptarea incorectă a tuturor blocurilor ulterioare. Acest lucru înseamnă, în consecință, că verificarea blocului de construcție la sfârșitul mesajului asigură integritatea întregului mesaj.
Desigur, acest mod nu este lipsit de defecte, deoarece schimbarea a două blocuri de text cifrat face ca cele două blocuri corespunzătoare de text simplu să fie decriptate incorect, dar datorită XOR peste textul simplu și textul cifrat, erorile suplimentare sunt compensate. Prin urmare, dacă verificarea integrității verifică doar ultimele blocuri ale textului decriptat, este posibil să ajungeți cu un mesaj parțial corupt. Deși nimeni nu a exploatat încă această vulnerabilitate în Kerberos, versiunea 5 a trecut deja în modul CBC.
Modul de feedback al textului cifrat , modul de feedback al cifrului , CFB [ 4 ] . În timpul criptării, fiecare bloc de text simplu este adăugat modulo 2 la blocul criptat în pasul anterior.
Puterea CFB este determinată de puterea cifrului utilizat. Blocurile de text simplu sunt „amestecate” („mascate”) cu blocurile de text cifrat . Dacă există două blocuri identice de text cifrat în modul CFB cu feedback de bloc complet, rezultatul, de exemplu, al criptării DES în pasul următor va fi același. Viteza de criptare a modului CFB cu feedback full block este aceeași cu cea a cifrului bloc, iar posibilitatea de paralelizare a procedurii de criptare este limitată [1] .
Modul de feedback de ieșire (OFB) [4] transformă cifrul bloc într-un cifr de flux sincron: generează blocuri cheie care sunt rezultatul adunării cu blocuri de text simplu pentru a obține textul cifrat. La fel ca și în cazul altor coduri de flux, oglindirea în textul cifrat produce un bit oglindit în textul simplu în aceeași locație. Această proprietate permite multor coduri de corectare a erorilor să funcționeze în mod normal chiar și atunci când corectarea erorilor este aplicată înainte de codificare.
Datorită simetriei operațiunii de adăugare, criptarea și decriptarea sunt similare:
Fiecare operație a cifrului blocului de feedback de ieșire depinde de toate cele anterioare și, prin urmare, nu poate fi efectuată în paralel. Cu toate acestea, deoarece textul simplu sau textul cifrat este folosit doar pentru adăugarea finală, operațiunile de cifrare bloc pot fi efectuate din timp, permițând criptarea finală să fie efectuată în paralel cu textul simplu.
Feedback-ul la ieșire la k biți nu este recomandat din motive de securitate . Modul OFB are următorul avantaj față de modul CFB: erorile care rezultă din transmisia pe un canal zgomotos nu sunt „unse” pe întregul text cifrat în timpul decriptării, ci sunt localizate într-un singur bloc. Cu toate acestea, textul simplu poate fi modificat prin anumite manipulări ale blocurilor de text cifrat. În ciuda faptului că criptarea OFB nu este paralelizabilă, eficiența procedurii poate fi îmbunătățită prin pre-generarea unei secvențe independente de blocuri. [unu]
Această metodă se mai numește și „ modul de feedback de ieșire ”.
OFB sugerează, de asemenea, unele îmbunătățiri în ceea ce privește metoda de generare a unei secvențe independente de blocuri: pentru a obține următorul bloc, se propune criptarea nu cu , ci cu c , unde este un vector de inițializare.
Modul de contor (CTR) [4] implică returnarea la intrarea algoritmului de cifrare bloc corespunzător a valorii unui contor acumulat de la început. Modul realizează un flux de criptare bloc, adică generează o secvență la care se aplică operația XOR cu textul mesajului. Textul simplu și blocul de text cifrat au aceeași dimensiune a blocului ca și cifra de bază (cum ar fi DES sau AES ). [5] Modul CTR oferă următoarele operații.
Criptare în modul CTRDecriptare în modul CTR
— valoarea contorului pentru al-lea bloc.
Evident, valorile contorului trebuie să fie unice pentru fiecare bloc de text simplu codificat de un cifr dat cu o cheie dată (în caz contrar, blocurile de text cifrat criptate cu valori identice ale contorului sunt în pericol). Această cerință este îndeplinită în două etape.
În primul rând, valorile contorului pentru criptarea blocurilor într-un singur mesaj sunt obținute din valoarea inițială a contorului folosind funcția de creștere. Pentru a asigura aleatorie, cantitatea de increment poate depinde de numărul blocului. Funcția de creștere standard poate fi aplicată întregului bloc de contor sau unei părți din acesta. Fie ca valoarea contorului să reprezinte un bloc de b biți și să fie aplicată funcția de increment celor m biți cei mai puțin semnificativi.
este funcția de concatenare ; - biți inferiori ; — biți seniori . Unicitatea valorilor contorului este asigurată pentru toate blocurile mesajului, cu condiția ca . Unde este numărul de blocuri în care este împărțit mesajul.
În al doilea rând, valorile inițiale ale contorului pentru fiecare mesaj sunt alese pentru a se asigura că toate valorile contorului utilizate sunt unice. Acest lucru poate fi realizat în mai multe moduri. De exemplu, dacă mesajele sunt criptate secvenţial, atunci rezultatul aplicării funcţiei de creştere la ultima valoare a contorului de mesaje anterior poate fi utilizat ca valoare iniţială a contorului pentru acest mesaj. Mai mult, dacă funcția de incrementare folosește m biți, numărul total de blocuri de text simplu nu trebuie să depășească . O altă abordare propune împărțirea reprezentării binare a contorului în două părți. Cifrelor cele mai semnificative li se atribuie nonce al mesajului, iar cifrelor rămase li se va aplica funcția de creștere [6] .
În absența feedback-ului, algoritmii de criptare și decriptare în modul CTR pot fi executați în paralel. Mai mult, cantitatea mare de calcul implicată în criptarea valorilor contorului poate fi făcută din timp, înainte ca textul simplu sau cifrat să fie disponibil. Acest lucru oferă modului CTR un avantaj față de modurile CFB și OFB.
Modul Random Delta este folosit pentru a elimina predictibilitatea modificărilor contorului în modul CTR. De exemplu, acesta este AES, iar dimensiunea blocului este de 16 octeți. Este luat un vector de inițializare aleatoriu (de exemplu, folosind RdRand ). Cei 8 octeți mai mici ai săi sunt considerați delta aleatoare - Random Delta (RD):
Inițial (Initialization Vector) este criptat și trimis la începutul mesajului. Blocul 0 este XOR cu inițial înainte de criptare. Pentru fiecare bloc următor, valoarea Initial crește cu Delta (în reprezentarea întregului fără semn - uint128 += uint64):
Acest lucru elimină predictibilitatea schimbării contorului în modul CTR. Dacă delta este întotdeauna unul, aici delta este un număr aleatoriu, unul din 2^64. Acesta, ca și Initial, este necunoscut atacatorului.
De asemenea, CTR este alarmant prin apropierea directă a textului simplu de textul cifrat prin XOR. În Random Delta, AES se află între textul simplu și textul cifrat.
Deschiderea transmisiei inițiale ridică, de asemenea, întrebări. Cu cât atacatorul vede mai puțin, cu atât mai bine. Cu cât textul simplu este mai departe de textul cifrat, cu atât mai bine. Toate modurile cunoscute - ECB, CBC, OFB, CTR - au unele dintre aceste neajunsuri. În Random Delta, totul se află în spatele AES, iar Initial și Delta sunt variabile aleatorii necunoscute atacatorului.
Cu toate acestea, unul dintre dezavantajele CTR în RD este prezent. Cunoașterea formatului datelor transmise permite să fie aruncate distorsiuni aleatorii în anumite locuri ale acestor date, care pot fi folosite pentru un atac. Se poate adăuga un hash la secvența de bloc pentru a verifica integritatea:
Se pare că Random Delta + Hash nu are aceste dezavantaje. Transferat în domeniul public.
Un punct important: trebuie să existe o mulțime de permutări AES între textul închis și textul deschis, altfel slăbește profunzimea criptării. Textul închis în funcție de textul deschis, numai prin XOR , anulează adâncimea de criptare pe care o oferă AES (și anume, aceasta este metoda folosită de modurile OFB, CFB, CTR).
Securitatea Random Delta nu este cu mult mai mică decât cea a AES în sine.
Dacă este necesar un grad mai mare de aleatorie delta (de exemplu, 128 de biți), acesta poate fi generat separat și trimis la începutul mesajului împreună cu Initial.
La fel ca CTR, Random Delta vă permite să criptați/decriptați blocuri în paralel, cu performanțe mai mari , fără a aștepta criptarea/decriptarea blocului anterior (ceea ce este o necesitate în CBC, PCBC, CFB, OFB).
Modul „Random Delta 128” se distinge prin utilizarea separată a inițialei și a Delta pe 128 de biți. Oferă mai multă aleatorie umbrei.
Modul Galois/Counter (contor cu autentificare Galois ) este o modificare mai sigură a CTR care oferă criptare autentificată cu date atașate ( modul de cifrare bloc AEAD ).
În criptografie , vectorul de inițializare ( ) reprezintă un număr, de regulă, acesta ar trebui să fie aleatoriu sau pseudo-aleatoriu . Aleatoritatea este esențială pentru obținerea securității semantice, care, atunci când reutilizați o schemă sub aceeași cheie, va împiedica atacatorul să deducă relații între segmentele de mesaj criptate. Pentru cifrurile bloc, utilizarea este descrisă prin moduri de operare. Randomizarea este necesară și pentru alte primitive, cum ar fi funcțiile hash universale și codurile de autentificare a mesajelor bazate pe acestea.
În astfel de moduri de criptare precum CBC, CFB și OFB, vectorul de inițializare ( ) este alimentat ca intrare. Mai mult, atât expeditorul cât și destinatarul la începutul sesiunii de comunicare trebuie să aibă același . Valoarea nu trebuie să fie deloc secretă și poate fi transmisă împreună cu primul bloc al textului cifrat. Ceea ce este cu adevărat important este că în modurile CBC și CFB această valoare trebuie să fie imprevizibilă, iar în modul OFB trebuie să fie unică [2] .
Imprevizibilitatea în modurile CBC și CFB poate fi obținută în mai multe moduri. De exemplu, este posibil să se transforme valoarea unui numărător (de exemplu, contorul de mesaje) cu aceeași funcție. Sau utilizați GPC pentru a genera o secvență pseudo-aleatorie de lungimea dorită.
În modul OFB, vectorul de inițializare nu trebuie să fie imprevizibil, dar trebuie să fie unic pentru toate sesiunile de comunicații în care se folosește aceeași cheie secretă de criptare în OFB . Acest lucru poate fi realizat, din nou folosind un contor de mesaje. Dacă această cerință nu este respectată, atunci secretul mesajului în modul OFB poate fi ușor compromisă. O consecință a acestei cerințe este că următorul vector de inițializare pentru modul OFB nu poate fi generat prin aplicarea unei funcții cu aceeași cheie .
Modurile ECB, CBC și PCBC funcționează cu mesaje text clar care trebuie să fie un multiplu al lungimii unui bloc. Dacă această proprietate nu este îndeplinită, atunci numărul necesar de biți, numit padding, trebuie adăugat la mesaj . De exemplu, „metoda de umplutură 2” ISO/IEC 9797-1 propune adăugarea unui singur bit la sfârșitul mesajului și completarea restului cu zerouri [7] .
Cu această metodă, destinatarul textului cifrat trebuie să știe sigur că mesajul conține o umplutură. Acest lucru se poate realiza prin atașarea de umplutură la fiecare mesaj, chiar dacă nu este necesar (caz în care este trimis ca un bloc separat). Aceasta nu este singura soluție - puteți, de exemplu, să trimiteți informații despre lungimea acestuia cu fiecare mesaj [6] .
Pentru orice mod, un bit de eroare dintr-un bloc de text cifrat face ca rezultatul decriptării acestuia să fie corupt. În modurile CFB, OFB și CTR, bitul corupt va avea aceeași poziție în blocul decriptat ca bitul de eroare din blocul de text cifrat, iar eroarea nu se va propaga la biții rămași ai blocului. În modurile ECB și CBC, orice bit al blocului poate fi corupt, cu o probabilitate de aproximativ 50% (în funcție de puterea cifrului în sine). Totodată, în modurile ECB, OFB și CTR este corupt doar blocul rezultat din decriptarea blocului corupt. În modul CBC, următorul bloc este, de asemenea, supus unei decriptări eronate, iar biții corupti vor corespunde biților de eroare din textul cifrat al blocului anterior. În modul CFB, un bit de eroare dintr-un segment de text cifrat afectează următorul b/s (rotunjit la cel mai apropiat număr întreg, b este lungimea blocului, s este lungimea segmentului) ale segmentelor și oricare dintre biții textului decriptat poate fi eronat [6] .
Prezența biților de eroare în vectorul de inițializare este, de asemenea, dăunătoare procesului de decriptare. În modul OFB, bitul de eroare din IV lovește fiecare bloc de text cifrat din mesajul corespunzător. În modul CFB, erorile din vectorul de inițializare vor deteriora cel puțin primul segment al textului cifrat. Dacă restul segmentelor sunt corupte depinde de poziția bitului din dreapta în IV (în cel mai rău caz, b/s-ul segmentelor de text cifrat va fi afectat). Când utilizați modurile OFB și CFB, orice bit al textului cifrat corupt poate fi corupt ca urmare a unui bit de eroare din IV. În modul CBC, vor fi corupți doar biții primului bloc de text cifrat care se află în pozițiile corespunzătoare biților de eroare din vectorul de inițializare.
Pentru modul CTR, un bit de eroare din valoarea contorului face ca orice bit din decriptarea textului cifrat corespunzător să fie corupt cu o probabilitate de aproximativ 50%.
Pe lângă apariția unui bit de eroare într-un bloc de text cifrat, poate apărea și ștergerea sau inserarea de biți. Acest lucru duce la încălcarea limitelor tuturor blocurilor ulterioare ale textului cifrat, iar rezultatele decriptării vor fi complet greșite până când limitele sunt sincronizate. Când utilizați modul CFB pe 1 bit, sincronizarea este restabilită automat în pozițiile b+1 după ce un bit apare sau dispare. În alte moduri, recuperarea automată a sincronizării nu are loc [6] .
Alegerea modului de criptare depinde de obiectivul dvs.
Pentru text simplu, puteți utiliza CBC, CFB sau OFB. Pentru a cripta fișierele, este mai bine să utilizați CBC: securitatea este mult crescută, atunci când apar erori în datele stocate, sincronizarea nu eșuează aproape niciodată. Modul specific depinde de cerințele dvs. În general, alegerea metodei de criptare este o căutare a unui compromis între eficiență și performanță [8] .