Posso utilizzare la decodifica streaming da ogni algoritmo?

-1

Mi piacerebbe trasmettere file crittografati da un server. So che ad esempio RSA supporta la decrittografia streaming. Non sono sicuro che sia Twofish o Rijndael lo supportino.

Suppongo che se non supportano, può essere implementato suddividendo i dati in blocchi con dimensioni note e crittografando il blocco effettivo anziché tutti i dati. Quindi il risultato sarà qualcosa del tipo:

[enc(chunk(data, 0)), enc(chunk(data, 1)), ... enc(chunk(data, index))]

invece di

[chunk(enc(data), 0)), chunk(enc(data), 1)), ... chunk(enc(data), index))]

Ho ragione, o questi algoritmi sono stati progettati pensando al supporto dello streaming?

Per chiarire cosa intendevo per "streaming decryption":

Lo streaming è descritto molto bene nel node.js manual , ma è un concetto generale e un ben noto Linux funzionalità, quindi non dovrebbe essere nuovo per qualsiasi programmatore. Si tratta approssimativamente di inviare un grosso file in piccoli blocchi, quindi è possibile iniziare a lavorare con esso (visualizzazione, trasformazione, ecc.) Prima che arrivi l'intero file e non sia necessario conservare l'intero file nella memoria, il che riduce la memoria consumo.

La decrittografia streaming utilizza un stream di trasformazione per decrittografare i dati. Quindi leggi una piccola parte del testo cifrato, decrittalo e scrivi il blocco di dati risultante in un altro stream. Ci possono essere diversi problemi qui, ad esempio il testo cifrato ha dimensioni diverse rispetto ai dati effettivi, quindi se si desidera cercare i dati è necessario convertire l'indice dei dati in indice del testo cifrato. Un altro problema che decifrare un chunk di dimensioni arbitrarie potrebbe non dare gli stessi dati che avresti decifrando l'intero testo cifrato e dividerlo in blocchi dopo.

    
posta inf3rno 18.11.2017 - 04:34
fonte

2 risposte

6

Non sono sicuro di cosa intendi con "streaming decryption". Nella crittografia, un codice simmetrico è un codice a blocchi o un codice di flusso. Non ha nulla a che fare con i "dati di streaming", ma piuttosto con quanto viene elaborato contemporaneamente.

RSA e crittografia asimmetrica

RSA è un codice asimmetrico. In realtà non è progettato per crittografare i dati, ma piuttosto per crittografare un piccolo valore casuale che deve essere usato come segreto condiviso per un codice simmetrico più tradizionale. Questa è talvolta definita crittografia ibrida. RSA è molto lento e molto poco efficiente in termini di spazio.

Codici a blocchi

Un codice a blocchi può crittografare i dati in blocchi della dimensione del blocco del codice (128 bit per AES, ad esempio). Se la dimensione del testo in chiaro da crittografare non è esattamente divisibile in base alla dimensione del blocco, deve essere riempita. Un cifrario a blocchi viene in genere utilizzato con una "modalità di funzionamento", che fornisce ulteriore sicurezza a seconda di come viene utilizzata, e talvolta anche dell'autenticazione. Ogni modalità dovrebbe essere utilizzata solo per uno scopo specifico. Utilizzare una modalità per lo scopo sbagliato può essere pericoloso.

Questi codici funzionano applicando più cicli di crittografia a un singolo blocco di dati con una determinata chiave. La modifica di qualsiasi bit nel blocco di testo in chiaro comporta la randomizzazione di ogni bit nel blocco di testo cifrato. Tutti i codici a blocchi funzionano come descrivi, cioè agendo su singoli blocchi, uno alla volta.

Un esempio di codice a blocchi è AES. Come affermi, non è un codice di flusso.

Codici di flusso

Un codice stream può invece cifrare singoli bit, uno alla volta. Spesso sono anche molto veloci. Questi algoritmi funzionano crittografando ogni bit, uno alla volta. Cambiando un bit nel testo normale si ottiene in genere il bit corrispondente nel testo cifrato che viene capovolto.

Un esempio di un codice di flusso è ChaCha20.

Codici a blocchi trasformati usati come cifre del flusso

Alcune modalità operative possono far sì che i cifrari a blocchi agiscano come cifrari di flusso. In genere ciò avviene mediante una modalità operativa che crea un flusso di dati casuali deterministici (con un flusso di blocchi di testo in chiaro, ciascuno con numeri incrementali) che viene poi sottoposto a XOR con i dati da crittografare.

Un esempio di codice a blocchi in una modalità di streaming è AES in modalità CTR.

    
risposta data 18.11.2017 - 07:07
fonte
3

Sono abbastanza sicuro che non stai parlando di stream ciphers (un metodo per generare deterministicamente un flusso di bit pseudocasuali che ha lunghezza arbitraria). Questo è il motivo per cui non sto esaminando le differenze tra i codici a blocchi, i codici di flusso e il modo in cui uno può costruire l'uno dall'altro.

Il mio ragionamento è che in effetti dici RSA

support for streaming decryption

(che è sbagliato)

Quello su cui mi concentrerò invece è una vista di alto livello sulla dimensione del blocco / blocco e il risultato, perché sembra che questo sia il punto qui.

RSA

RSA ha una dimensione del blocco pari al massimo alla lunghezza della chiave. Questo è dovuto al modo in cui RSA è costruito. Ad un livello elevato, c'è una moltiplicazione in atto e quindi il resto di una divisione è il testo cifrato; se metti troppe informazioni in questo, il resto di quella divisione sarà - quando decodificato - non lo stesso (cioè perché lasci il modulo RSA Ring e usi un testo in chiaro non valido).

Per risolvere questo problema e rendere RSA in grado di crittografare le lunghezze arbitrarie dei dati, vengono utilizzate regole standardizzate per strutturare il testo semplice in blocchi che passano ciascuno attraverso RSA e quindi combinarli in un testo cifrato.

Questo è il motivo per cui è possibile decrittografare parzialmente un testo cifrato RSA: ognuno di questi blocchi può essere decodificato con (solo) la conoscenza dei precedenti.

Questo non ha nulla a che fare con un codice di streaming (dove ogni bit può essere decodificato così com'è), ma uno può sembrare come lo streaming perché 4096 bit non sono molto utili per una macchina o una rete oggi da bufferare o ricevere.

Crittografi

Da questa prospettiva di alto livello, i cifrari a blocchi sono paragonabili a RSA in questo modo perché - come suggerisce il nome - crittografano blocchi di dati. Ad esempio lo fa in blocchi a 128 bit.

Per consentire ai cifrari a blocchi di crittografare grandi quantità di dati, la cosiddetta "modalità operativa" viene utilizzata per standardizzare la modalità di raggruppamento dei blocchi.

Per tutti i modi che conosco in cima alla mia testa, hai bisogno solo dei testi in chiaro dei blocchi prima del blocco corrente nel testo cifrato per decifrare un blocco in questione.

Quindi, con il modo in cui interpreto la tua domanda per le possibilità di streaming, dovrebbe essere teoricamente possibile trasmettere in streaming i blocchi di testo di input tramite la funzione di decrittografia e far sì che emetta il testo in chiaro quando vengono ricevuti nuovi blocchi di testo.

Conclusione

Quindi, per essere chiari: quello che stai cercando di fare è già de-facto-standardizzato, dipende dalla modalità di operazione utilizzata per il codice a blocchi.

Inoltre, né RSA né AES né alcun altro (blocco) o cifrario asimmetrico sono progettati per lo streaming, e non è necessario, poiché sono solo elementi costitutivi per uno schema più grande, come puoi vedere dalla spiegazione sopra.

Tuttavia, non generalizzerei questo a "questo può essere fatto con tutte le cifre".

È banale costruire da tre opzioni (codifica stream, cifrario a blocchi, cifratura asimmetrica) una modalità che mette le informazioni necessarie necessarie per decrittografare il testo cifrato alla fine del testo cifrato, rendendo quindi impossibile decifrare qualsiasi cosa prima che siano disponibili gli ultimi bit del testo cifrato.

    
risposta data 18.11.2017 - 07:56
fonte

Leggi altre domande sui tag