Differenza tra cifratura a flusso e cifratura a blocchi

Ho letto che

Un flusso tipico cipher crittografa il testo in chiaro un byte alla volta, sebbene un cifrario a flusso possa essere progettato per funzionare su un bit alla volta o su unità più grandi di un byte alla volta.

(Fonte: Cryptography and Network Security , William Stallings.)

Un cifrario a blocchi crittografa un blocco alla volta. Il blocco può essere di dimensione un byte o più o meno. Ciò significa che possiamo anche crittografare un blocco di un byte con laiuto di un codice a flusso come flusso.

Allora, qual è esattamente la differenza tra un codice a flusso e un codice a blocchi?

Commenti

  • IMHO molti concetti / definizioni non sono esattamente netti ma hanno confini in un certo senso piuttosto fluidi. Sono usati nei modi in quanto tali perché sono convenienti nel discorso dove comunemente ci sono contesti appropriati per aiutare una comprensione più precisa. Quindi ci sono licenziamenti. Suppongo che una buona analogia con il problema qui sia ” un uomo ricco ” e ” un uomo povero “.
  • Il primo paragrafo della domanda sembra essere stato copiato parola per parola da Crittografia e sicurezza di rete (William Stallings, Sezione 6.3). Devi sempre attribuire la fonte di qualsiasi materiale che copi da fonti esterne; vedi crypto.stackexchange.com/help/referencing .
  • Un cifrario a flusso può utilizzare o ‘ racchiude ‘ un codice a blocchi. Ad esempio, AES SIC può essere utilizzato per generare il keystream. Il fatto che il flusso di chiavi abbia una lunghezza pari a N volte la dimensione del blocco non ha alcuna relazione con la lunghezza dei testi cifrati / normali

Risposta

A cifratura a blocchi è una funzione deterministica e calcolabile di $ k $ -bit chiavi e $ n $ -bit (testo normale) blocchi a $ n $ -bit (testo cifrato). (Più in generale, i blocchi non devono essere di dimensioni bit, $ n $ -character-blocks si adatterebbero anche qui). Ciò significa che quando si crittografa lo stesso blocco di testo in chiaro con la stessa chiave, otterrai lo stesso risultato. (Normalmente vogliamo anche che la funzione sia invertibile, cioè che data la chiave e il blocco di testo cifrato possiamo calcolare il testo in chiaro.)

Per crittografare o decrittografare effettivamente un messaggio (di qualsiasi dimensione), non devi ” t utilizzare direttamente la crittografia a blocchi, ma inserirla in una modalità operativa . La modalità più semplice sarebbe la modalità libro elettronico dei codici (ECB) , che taglia semplicemente il messaggio in blocchi, applica la crittografia a ciascun blocco e restituisce i blocchi risultanti. (Questa generalmente non è una modalità sicura, però.)

Alcuni schemi di crittografia iniziali come quello usato da Caesar potevano essere classificati come “cifrario a blocchi con blocchi di 1 carattere in ECB -mode “. O in generale, tutto ciò che ha un libro di codici .

Di solito usiamo altre modalità di funzionamento, che includono un vettore di inizializzazione e una sorta di feedback, in modo che ogni blocco di ogni messaggio viene crittografato in modo diverso.

Un stream cipher è una funzione che mappa direttamente $ k $ -bit chiavi e testi in chiaro di lunghezza arbitraria al testo cifrato (stessa lunghezza arbitraria), in tale modo il modo in cui i prefissi del testo in chiaro si associano ai prefissi del testo cifrato, cioè possiamo calcolare la parte iniziale del testo cifrato prima che la parte finale del testo in chiaro sia nota. (Spesso anche le dimensioni dei messaggi potrebbero essere limitate a multipli di qualche “dimensione di blocco”, ma di solito con blocchi più piccoli come byte interi o simili.)

Se una parte del testo in chiaro si ripete, il testo cifrato corrispondente di solito non è la stessa: parti diverse del messaggio verranno crittografate in modi diversi.

Spesso tali cifrari a flusso funzionano producendo un keystream dalla chiave effettiva (e forse un vettore di inizializzazione ) e poi semplicemente XOR-ing con il messaggio – questi sono chiamati cifrari a flusso sincrono . Altre cifrature a flusso potrebbero variare la crittografia di parti future del messaggio a seconda delle parti precedenti.

Alcune modalità operative di cifratura a blocchi creano effettivamente una cifratura a flusso sincrona, come CTR e modalità OFB .

Non dovresti mai riutilizzare una chiave (e IV, se applicabile) di un cifrario a flusso sincrono (che include cifrature a blocchi nelle modalità di streaming) per messaggi diversi, poiché ciò può portare a compromessi. (E anche per lo stesso messaggio mostrerà che hai ripetuto un messaggio.)

Nota che nelluso effettivo vorrai anche un MAC, ad es. protezione dellintegrità, per il tuo messaggio. (Alcuni schemi sono interrotti in caso di un attacco con testo cifrato scelto, ad esempio, e un tale MAC lo impedirà (se si passa il messaggio al decryptor solo dopo aver controllato il MAC).

Commenti

  • Quando sceglieresti tra flusso e blocco? Cè una differenza nella sicurezza? O la velocità della crittografia?
  • @anoopelias I cifrari a blocchi sono generalmente lenti rispetto ai cifrari Stream. Inoltre, non sono sicuro, ma penso che i cifrari a flusso siano bravi a fornire sicurezza delle informazioni mentre i cifrari a blocchi sono bravi a fornire sicurezza informatica
  • Per quanto riguarda lultimo paragrafo, potresti fornire un collegamento per un esempio in cui laggiunta di un MAC protegge da un attacco con testo cifrato scelto?

Risposta

Matematicamente, un cifrario a blocchi è solo un famiglia di permutazione pseudocasuale con chiave sullinsieme $ \ {0,1 \} ^ n $ di $ n $ blocchi di bit. (In pratica, di solito richiediamo anche un modo efficiente per calcolare la permutazione inversa.) Un cifrario a blocchi da solo non è molto utile per la crittografia pratica, almeno a meno che tu non abbia bisogno di cifrare piccoli messaggi che rientrano ciascuno in un singolo blocco.

Tuttavia, risulta che i codici a blocchi sono estremamente blocchi di costruzione versatili per la costruzione di altri strumenti crittografici: una volta che hai un buon codice a blocchi, puoi facilmente costruire qualsiasi cosa, da cifrari a flusso a funzioni hash, codici di autenticazione dei messaggi, funzioni di derivazione chiave, generatori di numeri pseudocasuali, pool di entropia, ecc. basati su un solo cifrario a blocchi.

Non tutte queste applicazioni necessariamente necessita di un cifrario a blocchi; ad esempio, molti di essi potrebbero essere basati su qualsiasi funzione pseudocasuale che non necessita di una permutazione (ma, convenientemente, “sa lemma che dice che una permutazione pseudocasuale funzionerà comunque). Inoltre, molte delle costruzioni sono indirette; ad esempio, puoi costruire una funzione di derivazione della chiave da un codice di autenticazione del messaggio, che puoi costruire da una funzione hash, che puoi — ma non avere per — costruire da un blocco cifra. Tuttavia, se hai un codice a blocchi, puoi costruire tutto il resto da esso.

Inoltre, queste costruzioni tipicamente vengono fornite con prove di sicurezza (condizionali) che riducono la sicurezza delle funzioni costruite a quella del codice a blocchi sottostante. Quindi, non è necessario svolgere il compito laborioso e inaffidabile di crittografare ciascuna di queste funzioni separatamente —, invece, sei “libero di concentrare tutti i tuoi sforzi sul cifrario a blocchi, sapendo che qualsiasi confidenza che avrai sulla sicurezza del cifrario a blocchi si traduce direttamente in sicurezza su tutte le funzioni basate su di esso.

Ovviamente, tutto ciò è molto conveniente se, diciamo, stai lavorando su una piccola piattaforma incorporata in cui includere codice efficiente e sicuro per molte primitive crittografiche separate potrebbe essere difficile e costoso. Ma anche se non ti trovi su una piattaforma così vincolata, scrivere e analizzare codice crittografico di basso livello può essere laborioso a causa della necessità di prestare attenzione a cose come attacchi di canale laterale . È più facile limitarti a un numero limitato di elementi costitutivi di basso livello e creare tutto ciò di cui hai bisogno da questi.

Inoltre, anche su piattaforme veloci con molta memoria, come le CPU desktop, limplementazione di operazioni crittografiche di basso livello direttamente nellhardware può essere molto più veloce che eseguirle nel software — ma non è pratico farlo per più di alcuni di loro . Grazie alla loro versatilità, i cifrari a blocchi sono ottimi candidati per limplementazione hardware (come nel set di istruzioni AES per le moderne CPU x86).


E i cifrari a flusso, quindi?

Matematicamente, un cifrario a flusso — nel senso più generale del termine — è anche una famiglia di funzioni pseudocasuali invertibili con chiave, ma sullinsieme $ \ {0,1 \} ^ * $ di stringhe di bit di lunghezza arbitraria piuttosto che su blocchi di lunghezza limitata.

(Ci sono alcune sottigliezze qui; ad esempio, la maggior parte delle costruzioni di cifratura a flusso richiede che linput includa un valore nonce univoco e non garantire la sicurezza — nel senso di indistinguibilità da una funzione veramente casuale — se lo stesso nonce viene utilizzato per due diversi input. Inoltre, come non esiste una distribuzione uniforme sulle funzioni invertibili da $ \ {0,1 \} ^ * $ a se stesso da cui scegliere funzioni casuali, dobbiamo definire attentamente cosa significhi per un cifrario a flusso sembrare “indistinguibile da casuale”, e questa definizione ha implicazioni pratiche per la sicurezza —, ad esempio, la maggior parte dei cifrari a flusso perde la lunghezza del messaggio. In pratica, di solito richiediamo anche che cifrari a flusso, in essere “streaming”, nel senso che flussi di bit di input arbitrariamente lunghi possono essere crittografati — e decrittografati — utilizzando o solo memoria costante e tempo lineare nella lunghezza del messaggio.)

Naturalmente, i cifrari a flusso sono molto più immediatamente utili dei cifrari a blocchi: puoi usarli direttamente per cifrare messaggi di qualsiasi lunghezza. Tuttavia, risulta che “sono anche molto meno utili come elementi costitutivi di altri strumenti crittografici: se hai un codice a blocchi, puoi facilmente trasformarlo in un codice a flusso , mentre trasformare un codice a flusso arbitrario in un codice a blocchi è difficile se non impossibile .

Allora perché le persone si preoccupano di progettare cifrari a flusso dedicati, quindi, se i cifrari a blocchi possono fare altrettanto bene? Per lo più, il motivo è la velocità: a volte, è necessario un cifrario veloce per crittografare molti dati, e ce ne sono alcuni progetti di cifratura a flusso dedicati veramente veloci là fuori. Alcuni di questi progetti sono anche progettati per essere molto compatti da implementare, sia nel software che nellhardware o in entrambi, in modo che se hai davvero solo bisogno di un cifrario a flusso, puoi risparmia sulla dimensione del codice / circuito utilizzando uno di questi cifrari invece di uno basato sul cifrario a blocchi generale.

Tuttavia, ciò che guadagni in velocità e compattezza, perdi in versatilità. xample, non sembra esserci un modo semplice per creare una funzione hash da un cifrario a flusso , quindi se ti serve uno di questi (e spesso perché le funzioni hash, oltre ad essere utili da sole, sono anche elementi costitutivi comuni per altri strumenti crittografici), dovrai implementarle separatamente. E, indovina un po , la maggior parte delle funzioni hash sono basate su cifrari a blocchi, quindi se ne hai uno, potresti anche riutilizzare lo stesso cifrario a blocchi per la crittografia (a meno che tu non abbia davvero bisogno della velocità grezza del cifrario a flusso dedicato).

Commenti

  • Mi sono chiesto se sia necessario avere due termini diversi. Secondo quanto hai spiegato, un cifrario a flusso è semplicemente un caso speciale di un cifrario a blocchi, cioè uno per il caso limite in cui n nellinsieme {0,1} ^ n è 1. Quindi direi di non mantenere la corrente distinzione di terminologie.
  • @ Mok-KongShen In realtà, un cifrario a flusso non è semplicemente un cifrario a blocchi con dimensione di blocco 1 (diverso dai classici cifrari monoalfabetici, che si possono presumere essere entrambi). Un cifrario a flusso di solito traduce i bit / byte / … del flusso in modo diverso, a seconda dello stato interno corrente del codice, mentre un cifrario a blocchi per lo stesso input ha lo stesso output (e quindi è solitamente usato in un ” modalità di funzionamento ” per creare un cifrario a flusso).
  • @PauloEbermann. IMHO hai risposto per me a una domanda su CodesinChaos riguardante ” dinamica e variabilità “.
  • @ Mok-KongShen No non ‘ t. Lunico vantaggio che un cifrario a flusso dedicato ha rispetto a un cifrario a blocchi in una modalità appropriata sono le prestazioni. Non puoi ‘ ignorare le modalità di concatenamento, poiché nessuno sano di mente usa cifrari a blocchi senza il concatenamento appropriato.
  • @CodesInChaos. Applicazioni diverse hanno requisiti di prestazioni diversi. Per crittografare ad es. une-mail, ‘ non necessita delle prestazioni che sarebbero desiderabili per la crittografia, ad esempio, di un file video.

Risposta

Un codice a blocchi da solo mappa n bit su n bit utilizzando una chiave. vale a dire “una permutazione pseudo-casuale con chiave. Non può accettare testi più lunghi o più brevi.

Per crittografare effettivamente un messaggio è sempre necessaria una modalità di concatenamento. ECB è una di queste modalità di concatenamento (e davvero pessimo), e non è il puro cifrario a blocchi. Anche la BCE consiste in “operazioni di elaborazione aggiuntiva”. Queste modalità di concatenamento possono avere proprietà abbastanza diverse.

Una delle modalità di concatenamento più popolari, la modalità Counter (CTR) costruisce un cifrario a flusso sincrono da un cifrario a blocchi.Unaltra modalità, CFB, costruisce un cifrario a flusso auto-sincronizzante, con proprietà da qualche parte tra quelle di CBC e un cifrario a flusso sincrono.

Quindi la tua supposizione che non ci siano cifrature tra flusso e blockciphers non è proprio vera. Cryptographers preferisco semplicemente costruirli dalla ben nota primitiva del cifrario a blocchi, invece di creare un sistema completamente nuovo.

Chiamerei Vigenère un cifrario a flusso, anche se con un periodo troppo breve. Usa una codifica a 26 simboli invece di una codifica a 2 simboli, ma questo non significa che non sia un cifrario a flusso. Guarda Solitaire / Pontifex per una costruzione moderna di un cifrario a flusso con 26 simboli.

Commenti

  • Se non ‘ t err, ” concatenamento ” in la crittografia a blocchi viene normalmente impiegata nel contesto del ” concatenamento di blocchi “, ovvero rendendo i blocchi successivi dipendenti luno dallaltro in modo da rendere analisi più difficile. Quindi IMHO ECB non avrebbe per definizione alcun effetto di concatenamento in quanto tale.
  • Sbagli. Una buona modalità di concatenamento avrà queste proprietà, ma esistono ancora modalità non valide!

Risposta

Esistono due tipi fondamentali di crittografia

  1. Simmetrica. Utilizza la stessa chiave per la crittografia e la decrittografia.
  2. Asimmetrico. Utilizza due chiavi diverse (pubblica e privata) per crittografare e decrittografare.

Block Cipher e Stream Cipher fanno parte di Symmetric Encryption. Stream Cipher genera un keystream esteso dalla chiave fornita dallutente e quindi XoR con testo normale (per crittografia) / testo cifrato (per decrittografia).

Mentre Block Cipher prende un blocco di dati come input, esegui più round su di esso insieme alla miscelazione dei tasti e alla produzione di testo cifrato. I cifrari a blocchi hanno varie modalità operative di cui la modalità contatore (CTR) funziona in modo simile alla cifratura a flusso. Un numero sequenziale viene immesso nel cifrario a blocchi e il suo output è Xored con Plaintext per rendere Ciphertext. In questa modalità di funzionamento è richiesto solo il codice di crittografia del cifrario a blocchi. Non è necessario il codice di decrittografia, per la decrittografia è sufficiente inserire lo stesso numero sequenziale per bloccare il cifrario e Xored il suo output con Ciphertext per ottenere il testo normale. A volte un nome viene utilizzato insieme al contatore, quindi linput del codice a blocchi viene diviso in due, ovvero un nome fisso e un contatore incrementale.

inserisci qui la descrizione dellimmagine

Altra modalità di funzionamento sono: –

  1. ECB (fornisce Riservatezza)
  2. CBC e CTR (fornisce Riservatezza e Sementically Secure contro Chosen Plain Text Attack)
  3. EAX, CCM e GCM (fornisce crittografia autenticata)

Ulteriori dettagli possono essere trovati QUI

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *