Diferența dintre cifrarea fluxului și cifrarea blocului

Am citit că

Un flux tipic criptarea criptează textul clar un octet la un moment dat, deși un flux de cifrare poate fi proiectat să funcționeze pe un bit la un moment dat sau pe unități mai mari decât un octet la un moment dat.

(Sursă: Criptografie și securitate rețea , William Stallings.)

Un cifru de bloc criptează câte un bloc odată. Blocul poate avea o dimensiune de un octet sau mai mult sau mai puțin. Asta înseamnă că putem cripta și un bloc de un octet cu ajutorul unui flux de cifrare ca flux.

Deci, care este exact diferența dintre un flux de cifrare și un bloc de cifrare?

Comentarii

  • IMHO multe concepte / definiții nu sunt chiar clare, dar au limite într-un sens destul de fluid. Acestea sunt folosite ca atare, deoarece sunt convenabile în discurs în care de obicei există contexte adecvate pentru a ajuta la înțelegerea mai exactă. Prin urmare, există concedieri. Presupun că o analogie bună cu problema de aici este ” un om bogat ” vs. ” un om sărac „.
  • Primul paragraf al întrebării pare să fie copiat cuvânt cu cuvânt din Criptografie și securitate rețea (William Stallings, Secțiunea 6.3). Trebuie să atribuiți întotdeauna sursa oricărui material pe care îl copiați din surse externe; consultați crypto.stackexchange.com/help/referencing .
  • Un cod de flux poate utiliza sau ‘ wrap ‘ un cifru bloc. De exemplu, AES SIC poate fi folosit pentru a genera fluxul de chei. Faptul că fluxul cheie are o lungime de N de dimensiunea blocului nu are nicio influență asupra lungimii textelor cifrate / simple

Răspuns

A cifrare bloc este o funcție deterministă și calculabilă a $ k $ -bit chei și $ n $ -bit (text clar) blocuri la blocuri $ n $ -bit (text cifrat). (Mai general, blocurile nu trebuie să aibă dimensiunea de biți, $ n $ -character-blocks s-ar potrivi și aici). Aceasta înseamnă, atunci când criptați același bloc cu text simplu cu aceeași cheie, veți obține același rezultat. (De obicei, dorim ca funcția să fie inversabilă, adică, având în vedere cheia și blocul de text cifrat, putem calcula textul în clar.)

Pentru a cripta sau decripta un mesaj (de orice dimensiune), nu trebuie ” nu folosiți direct cifrul blocului, dar puneți-l într-un mod de funcționare . Cel mai simplu astfel de mod ar fi modul de carte electronică a codului (BCE) , care pur și simplu taie mesajul în blocuri, aplică cifrul fiecărui bloc și scoate blocurile rezultate. (În general, acesta nu este un mod sigur.)

Unele scheme de criptare timpurii, precum cea folosită de Caesar, ar putea fi clasificate ca „cifrare bloc cu blocuri de 1 caracter în BCE -mode „. Sau, în general, tot ce are o carte de coduri .

De obicei, folosim alte moduri de operare, care includ un vector de inițializare și un fel de feedback, astfel încât fiecare bloc a fiecărui mesaj este criptat într-un mod diferit.

A flux de cifrare este o funcție care mapează direct $ k $ -bit chei și texte cu lungime arbitrară la text cifrat (aceeași lungime arbitrară), într-un astfel de mod în care prefixele textului simplu se mapează cu prefixele textului cifrat, adică putem calcula partea de pornire a textului cifrat înainte ca partea finală a textului clar să fie cunoscută. (Adesea, dimensiunile mesajelor pot fi limitate la multipli ai unor „dimensiuni de bloc”, de asemenea, dar de obicei cu blocuri mai mici, cum ar fi octeți întregi sau altele.)

Dacă o parte a textului simplu se repetă, textul cifrat corespunzător de obicei nu este același – diferite părți ale mesajului vor fi criptate în moduri diferite.

Adesea, astfel de cifre de flux funcționează producând un keystream din cheia reală (și poate un vector de inițializare ) și apoi pur și simplu XOR-ing cu mesajul – acestea se numesc cifrări de flux sincron . Alte cifre de flux pot varia criptarea părților viitoare ale mesajului în funcție de părțile anterioare.

Unele moduri de operare a cifrării de blocuri creează de fapt un cifrare de flux sincron, cum ar fi CTR și modul OFB .

Nu ar trebui să refolosiți niciodată o cheie (și IV, dacă este cazul) dintr-un flux de cifrare sincron (care include cifrări bloc în moduri de streaming) pentru mesaje diferite, deoarece acest lucru poate duce la compromisuri. (Și chiar și pentru același mesaj va arăta că ați repetat un mesaj.)

Rețineți că în utilizarea reală veți dori și un MAC, de ex. protecție a integrității, pentru mesajul dvs. (Unele scheme sunt întrerupte în cazul unui atac text-cifrat ales, de exemplu, și un astfel de MAC va împiedica acest lucru (dacă treceți mesajul decriptorului numai după verificarea MAC-ului).)

Comentarii

  • Când ați alege între un flux și un bloc? Există vreo diferență în materie de securitate? Sau viteza de criptare?
  • @anoopelias Cifrele de bloc sunt, în general, lente în comparație cu cifrele de flux. De asemenea, nu sunt sigur, dar cred că cifrele de flux sunt bune în asigurarea securității informațiilor, în timp ce cifrele de blocuri sunt bune în asigurarea securității computerizate
  • În ceea ce privește ultimul paragraf – ați putea furniza un link pentru un exemplu în care adăugarea unui MAC protejează împotriva unui atac text-cifrat ales?

Răspuns

Matematic, un cifru bloc este doar un permutare pseudorandom cu cheie pe setul $ \ {0,1 \} ^ n $ din blocurile $ n $ -bit. (În practică, de obicei, avem nevoie și de o modalitate eficientă de a calcula permutarea inversă.) Un cifru bloc pe cont propriu nu este foarte util pentru criptografie practică, cel puțin cu excepția cazului în care trebuie doar să criptați mici mesaje care se încadrează fiecare într-un singur bloc.

Cu toate acestea, rezultă că cifrele de blocuri sunt blocuri de construcție extrem de versatile pentru construirea altor instrumente criptografice: odată ce ai un cod de bloc bun, puteți construi cu ușurință orice, de la cifrări de flux până la funcții hash, coduri de autentificare a mesajelor, funcții de derivare a cheilor, generatoare de numere pseudorandom, pool-uri de entropie etc., pe baza unui singur cifru de bloc.

em> need un bloc cifrat; de exemplu, multe dintre ele s-ar putea baza pe orice funcție pseudorandom care nu trebuie să fie o permutare (dar, în mod convenabil, există „sa lema care spune că o permutare pseudorandomă va funcționa, totuși). De asemenea, multe dintre construcții sunt indirecte; de exemplu, puteți construi o funcție de derivare a cheii dintr-un cod de autentificare a mesajului, pe care îl puteți construiți dintr-o funcție hash, pe care o puteți —, dar nu „aveți să — construiți dintr-un bloc cifru. Dar totuși, dacă aveți un cifru bloc, puteți puteți construi tot restul din acesta.

Mai mult, aceste construcții vin de obicei cu dovezi de securitate (condiționate) care reduc securitatea a funcțiilor construite la cea a cifrului de bloc subiacent. Astfel, nu este necesar să efectuați sarcina laborioasă și nesigură de a cripta analiza fiecare dintre aceste funcții separat —, în schimb, sunteți liber să vă concentrați toate eforturile asupra cifrului bloc, știind că orice încredere pe care o veți avea în securitatea cifrului de bloc se traduce direct în încredere în toate funcțiile bazate pe acesta.

Evident, toate acestea sunt foarte convenabile dacă lucrați, să zicem, la o mică platformă încorporată în care includerea unui cod eficient și sigur pentru o mulțime de primitive crypto separate ar putea fi dificilă și costisitoare. Dar chiar dacă nu vă aflați pe o astfel de platformă constrânsă, scrierea și analiza codului criptografic de nivel scăzut poate fi laborioasă din cauza necesității de a acorda atenție unor lucruri precum atacuri pe canal lateral . Este mai ușor să vă restrângeți la un număr limitat de elemente de construcție de nivel scăzut și să construiți tot ce aveți nevoie din acestea.

De asemenea, chiar și pe platforme rapide cu multă memorie, la fel ca procesoarele desktop, implementarea operațiunilor de criptare la nivel scăzut direct în hardware poate fi mult mai rapidă decât efectuarea lor în software —, dar nu este practic să faceți acest lucru pentru mai mult de câteva dintre ele . Datorită versatilității lor, cifrele de blocuri sunt candidați excelenți pentru implementarea hardware (ca în setul de instrucțiuni AES pentru procesoarele moderne x86).


Ce se întâmplă atunci cu cifrele de flux?

Matematic, un cifru de flux — în sensul cel mai general al termenului — este, de asemenea, o familie de funcții pseudorandom aleatorii inversate, dar pe setul $ \ {0,1 \} ^ * $ de șiruri de biți de lungime arbitrară, mai degrabă decât pe blocuri de lungime limitată.

(Există câteva subtilități aici; de exemplu, majoritatea construcțiilor de cifrare a fluxului necesită ca intrarea să includă o valoare nonce unică și nu garantează securitatea — în sensul de indistinguibilitate de o funcție cu adevărat aleatorie — dacă se utilizează aceeași nonce pentru două intrări diferite. De asemenea, ca nu există o distribuție uniformă a funcțiilor inversabile de la $ \ {0,1 \} ^ * $ la sine pentru a alege funcțiile aleatorii, trebuie să definim cu atenție exact ce înseamnă pentru un cifru de flux să arate „nedistinguibil de aleatoriu” și această definiție are implicații practice de securitate — de exemplu, majoritatea cifrelor de flux scurg lungimea mesajului. Practic, de obicei, de asemenea, avem nevoie de respectivele cifre de flux, în de fapt, fiți „streaming”, în sensul că fluxurile de biți de intrare arbitrare pot fi criptate — și decriptate — folosind o numai stocarea constantă și timpul liniar în lungimea mesajului.)

Desigur, cifrele de flux sunt mult mai utile imediat decât cifrele de bloc: le puteți folosi direct pentru a cripta mesajele de orice lungime. Cu toate acestea, se dovedește că „sunt, de asemenea, mult mai puțin utile ca elemente de construcție pentru alte instrumente criptografice: dacă aveți un cifru bloc, puteți cu ușurință transformați-l într-un cod de flux , în timp ce transformarea unui cod de flux arbitrar într-un cod de bloc este dificil dacă nu imposibil .

Deci, de ce se deranjează oamenii să proiecteze cifre de flux dedicate, atunci, dacă cifrele bloc pot face treaba la fel de bine? În principal, motivul este viteza: uneori, aveți nevoie de un cifru rapid pentru a cripta o mulțime de date și există unele într-adevăr programe de cifrare a fluxurilor dedicate rapide de acolo. Unele dintre aceste modele sunt, de asemenea, concepute pentru a fi foarte compacte de implementat, fie în software, fie în hardware sau ambele, astfel încât, dacă într-adevăr aveți nevoie doar de un cod de flux, puteți economisiți dimensiunea codului / circuitului utilizând unul dintre aceste cifre în loc de un cod general bazat pe cifrare.

Cu toate acestea, ceea ce câștigați în viteză și compacitate, pierdeți în versatilitate. xample, nu pare să existe un mod simplu de a face o funcție hash dintr-un cifru de flux , deci dacă aveți nevoie de unul dintre acestea (și de multe ori da, deoarece funcțiile hash, pe lângă faptul că sunt utile pe cont propriu, sunt și elemente obișnuite pentru alte instrumente de criptare), va trebui să le implementați separat. Și, ghiciți ce, majoritatea funcțiilor hash se bazează pe cifrele bloc, deci, dacă aveți unul, s-ar putea să reutilizați același cifru bloc pentru criptare (cu excepția cazului în care aveți cu adevărat nevoie de viteza brută a cifrului fluxului dedicat).

Comentarii

  • M-am întrebat dacă este necesar să aveți doi termeni diferiți. Conform celor explicate de dvs., un cifru de flux este pur și simplu un caz special al unui cifru de bloc, adică unul pentru cazul limitativ în care n din setul {0,1} ^ n este 1. Deci aș argumenta că nu mențin curentul distincție de terminologii.
  • @ Mok-KongShen De fapt, un cifru de flux nu este pur și simplu un cifru de bloc cu dimensiunea blocului 1 (altele decât cifrele clasice monoalfabetice, care se poate presupune că sunt ambele). Un cifru de flux traduce de obicei biții / octeții / … fluxului în mod diferit, în funcție de starea internă curentă a cifrului, în timp ce un cifru de bloc pentru aceeași intrare are aceeași ieșire (și astfel este de obicei utilizat într-un ” mod de operare ” pentru a crea un cifru de flux).
  • @PauloEbermann. IMHO, mi-ați răspuns la o întrebare referitoare la CodesinChaos în ceea ce privește dinamica și variabilitatea ” „.
  • @ Mok-KongShen Nu el nu ‘ t. Singurul avantaj pe care îl are un cifru de flux dedicat față de un cifru bloc într-un mod adecvat este performanța. Nu puteți ‘ nu ignora modurile de înlănțuire, deoarece nimeni sănătos nu folosește cifrele de blocuri fără înlănțuirea corespunzătoare.
  • @CodesInChaos. Aplicații diferite au cerințe de performanță diferite. Pentru a cripta de ex. un e-mail, nu ‘ nu are nevoie de performanța care ar fi de dorit pentru criptarea, de exemplu, a unui fișier video.

Răspuns

Un cifru bloc mapează singur n biți la n biți folosind o cheie. adică este o permutare pseudo-aleatorie cu cheie. Nu poate accepta texte mai lungi sau mai scurte.

Pentru a cripta de fapt un mesaj, întotdeauna aveți nevoie de un mod de înlănțuire. BCE este un astfel de mod de înlănțuire. (și unul foarte rău) și nu este cifrul de bloc pur. Chiar și BCE constă din „operațiuni de procesare suplimentare”. Aceste moduri de înlănțuire pot avea proprietăți destul de diferite.

Unul dintre cele mai populare moduri de înlănțuire, modul Contor (CTR) construiește un cod de flux sincron dintr-un cod de bloc.Un alt mod, CFB construiește un cod de flux de sincronizare automată, cu proprietăți undeva între cele ale CBC și un cifrat de flux sincron.

Deci, presupunerea dvs. că nu există cifre între flux și cifre de bloc nu este cu adevărat adevărată. Criptografii preferați doar să le construiți din primitivul de cifrare bloc bine înțeles, în loc să creez un sistem complet nou.

Aș numi Vigenère un flux de cifrare, deși unul cu o perioadă mult prea scurtă. Folosește o codificare de 26 de simboluri în loc de o codificare de 2 simboluri, dar asta nu înseamnă că nu este un cod de flux. Uitați-vă la Solitaire / Pontifex pentru o construcție modernă a unui flux de cifre cu 26 de simboluri.

Comentarii

  • Dacă nu greșesc ‘, ” înlănțuie ” criptarea blocurilor este utilizată în mod normal în contextul ” înlănțuirea blocurilor „, adică făcând blocurile succesive dependente unul de celălalt astfel încât să facă analiza mai dificilă. Deci, IMHO BCE nu ar avea, prin definiție, niciun efect de înlănțuire ca atare.
  • Greșești. Un mod de înlănțuire bun va avea aceste proprietăți, dar există încă moduri rele!

Răspuns

Există două tipuri de bază de criptare

  1. Simetrică. Folosește aceeași cheie pentru criptare și decriptare.
  2. Asimetric. Folosește două chei diferite (publice și private) pentru a cripta și decripta.

Cifrarea blocului și Cifrarea fluxului fac parte din Criptarea simetrică. Stream Cipher generează un flux de chei extins din cheia dată de utilizator și apoi XoR-ul cu text simplu (pentru criptare) / text cifrat (pentru decriptare).

În timp ce Block Cipher ia un bloc de date ca intrare, rulați mai multe runde pe el împreună cu amestecarea cheilor și producerea textului cifrat. Cifrele de blocuri au diferite moduri de funcționare, dintre care modul Contor (CTR) funcționează similar cu cifrarea fluxului. Un număr secvențial este introdus în cifrul blocului, iar ieșirea acestuia este Xored cu Plaintext pentru a face text cifrat. În acest mod de operare este necesar doar codul de criptare a cifrului bloc. Nu este nevoie de cod de decriptare, pentru decriptare pur și simplu introducem același număr secvențial pentru a bloca cifrarea, iar Xored a ieșit cu Ciphertext pentru a obține text simplu. Uneori se folosește un nounce împreună cu Counter, așa că intrarea cifrului blocului este împărțită în două, adică Un nounce fix și Counter incremental.

introduceți descrierea imaginii aici

Alt mod de operații sunt: –

  1. BCE (oferă confidențialitate)
  2. CBC și CTR (oferă confidențialitate și siguranță Sementică împotriva atacului ales cu text clar)
  3. EAX, CCM și GCM (oferă criptare autentificată)

Mai multe detalii pot fi găsite AICI

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *