Comprimere e quindi crittografare o viceversa?


88

Sto scrivendo un sistema VPN che crittografa (AES256) il suo traffico attraverso la rete (Perché scrivere il mio quando ce ne sono già altri 1.000.001? Bene, il mio è uno speciale per un compito specifico che nessuno degli altri si adatta).

Fondamentalmente voglio farti superare il mio pensiero per assicurarmi di farlo nel giusto ordine.

Al momento i pacchetti sono appena crittografati prima di essere inviati, ma voglio aggiungere un certo livello di compressione per ottimizzare un po 'il trasferimento dei dati. Compressione non pesante: non voglio massimizzare la CPU per tutto il tempo, ma voglio assicurarmi che la compressione sia il più efficiente possibile.

Quindi, il mio pensiero è che dovrei comprimere i pacchetti prima di crittografare come un pacchetto non crittografato comprimerà meglio di uno crittografato? O viceversa?

Probabilmente userò zlib per la compressione.

Maggiori informazioni sul blog di Super User .


4
Scrivere come "programmazione"? Sarebbe quindi più adatto per Stack Overflow.
Suma,

4
Se stavo chiedendo della sua programmazione, sì, ma non lo sono. Questo è un impacco generale quindi crittografare o crittografare quindi comprimere la domanda che potrebbe applicarsi al solo lavoro con file semplici se lo si desidera. Il lato della programmazione è solo il contesto per cui sto ponendo la domanda.
Majenko,


Probabilmente una domanda migliore per security.stackexchange.com
Jeff Ferland

1
Sanno della compressione, vero?
Majenko,

Risposte:


176

Se la crittografia viene eseguita correttamente, il risultato è fondamentalmente dati casuali. La maggior parte degli schemi di compressione funziona trovando modelli nei tuoi dati che possono essere in qualche modo presi in considerazione e grazie alla crittografia ora non ce ne sono; i dati sono completamente incomprimibili.

Comprimi prima di crittografare.


41
Ancora più importante: la compressione aggiunge entropia. L'aggiunta di entropia è utile per la crittografia (più difficile da interrompere con attacchi in chiaro).
Olli

8
Inoltre, la crittografia delle risorse dei costi, la crittografia di un file più piccolo richiederà meno risorse. Quindi comprimi prima di crittografare.
GAThrawn

9
@Olli - non necessariamente se lo schema di compressione aggiunge testo noto. Nel peggiore dei casi immagina se mettesse un'intestazione da 512byte nota nella parte anteriore dei dati e stavi usando una crittografia in modalità blocco.
Martin Beckett,

26
Non sono sicuro del motivo per cui il commento di @ Olli venga annullato, poiché non è corretto; non solo è significativamente meno importante, per qualsiasi crittografia decente non dovrebbe essere affatto importante . Cioè, la forza della crittografia dovrebbe essere completamente estranea all'entropia del messaggio.
BlueRaja - Danny Pflughoeft

8
Se comprimi del tutto, puoi davvero farlo solo prima di crittografare il messaggio, ma tieni presente, questo potrebbe perdere informazioni sulla "compressibilità" del messaggio originale, quindi dovresti considerare se ci sono conseguenze su questo lato canale. Si consideri un file di dimensioni fisse che è tutto 0 o un messaggio. Il file all 0 comporterà un payload più piccolo in qualsiasi schema di compressione ragionevole. Non è probabilmente un problema in questo caso d'uso particolare.
Edward KMETT,

22

Comprimi prima della crittografia. I dati compressi possono variare considerevolmente a causa di piccole modifiche ai dati di origine, rendendo quindi molto difficile eseguire la crittoanalisi differenziale.

Inoltre, come sottolinea Mr.Alpha, se si crittografa per primo, il risultato è molto difficile da comprimere.


12
Bene, questo è corretto, ma è stato pubblicato 2 ore prima della pubblicazione ... Entropy
Konerak

3

Anche se dipende dal caso d'uso specifico, consiglierei Encrypt-then-Compress. In caso contrario, un utente malintenzionato potrebbe perdere informazioni dal numero di blocchi crittografati.

Partiamo dal presupposto che un utente invii un messaggio al server e un utente malintenzionato con la possibilità di aggiungere un testo al messaggio dell'utente prima di inviarlo (tramite javascript, ad esempio). L'utente vuole inviare alcuni dati sensibili al server e l'attaccante vuole ottenere questi dati. Quindi può provare ad aggiungere diversi messaggi ai dati che l'utente invia al server. Quindi l'utente comprime il suo messaggio e il testo allegato dall'aggressore. Assumiamo una compressione DEFLATE LZ77, quindi la funzione sostituisce le stesse informazioni con un puntatore al primo aspetto. Pertanto, se l'attaccante è in grado di riprodurre il testo in chiaro del foro, la funzione di compressione riduce la dimensione del testo normale alla dimensione originale e a un puntatore. E dopo la crittografia, l'utente malintenzionato può contare il numero di blocchi di crittografia, in modo che possa vedere se i suoi dati aggiunti erano gli stessi dei dati inviati dall'utente al server. Anche se questo caso sembra un po 'costruito, è un grave problema di sicurezza in TLS. Questa idea viene utilizzata da un attacco chiamato CRIME per perdere i cookie in una connessione TLS per rubare sessioni.

fonte: http://www.ekoparty.org/archive/2012/CRIME_ekoparty2012.pdf


2

La mia opinione è che quando comprimi un messaggio lo proietti su una dimensione inferiore e quindi ci sono meno bit, il che significa che il messaggio compresso (supponendo un compressore senza perdita di dati) ha le stesse informazioni in meno bit (quelli che hai eliminato erano ridondanti! ) Quindi hai più informazioni per bit e di conseguenza più entropia per bit, ma la stessa entropia totale che avevi prima quando il messaggio non era compresso. Ora, la casualità è un'altra questione ed è qui che i modelli di compressione possono lanciare una chiave inglese.


1

La compressione deve essere eseguita prima della crittografia. un utente non vuole passare il tempo ad aspettare il trasferimento dei dati, ma ha bisogno che venga fatto immediatamente senza perdere tempo.


1

Compressione prima della crittografia, come è stato sottolineato in precedenza. La compressione cerca la struttura che può comprimere. La crittografia codifica i dati in modo da evitare il rilevamento della struttura. Comprimendo prima hai molte più probabilità di avere un file più piccolo e quindi meno carico utile da trasferire. La crittografia farà il suo lavoro indipendentemente dal fatto che sia compressa o meno e, come sottolineato in precedenza, è probabile che sia più difficile eseguire la crittoanalisi differenziale su un file compresso.


Questa sembra essere una ripetizione delle risposte accettate e seconde. Ogni risposta dovrebbe contribuire a una soluzione sostanzialmente nuova alla domanda.
fixer1234

0

La compressione riduce l'entropia delle informazioni. La massima compressione rende minima l'entropia. Per un dato perfettamente criptato (rumore) l'entropia massima e minima è la stessa.


2
Aspetta, non ce l'hai al contrario? Pensavo che l'entropia aumentasse con la riduzione della ridondanza. Pertanto la compressione dovrebbe aumentare l'entropia.
Zan Lynx,

No, meno entropia = più schemi. La casualità ha più entropia.
AbiusX

1
Ma si tratta di entropia dell'informazione, quindi è tutto sul significato. La casualità non significa nulla, quindi non si applica. Una frase inglese può avere lettere cambiate e significa ancora la stessa cosa, quindi ha una bassa entropia. Una frase inglese compressa potrebbe essere illeggibile se un singolo bit cambia, quindi ha il massimo. O almeno così penso.
Zan Lynx,

L'entropia non riguarda il senso e la capacità di leggere o comprendere, si tratta solo di schemi. I file compressi sono pieni di schemi.
AbiusX

1
@AbiusX: giusto. Patterns. E meno schemi, più entropia. Ciò significa che la compressione che sostituisce tutti i motivi ripetuti con una singola copia aumenta l'entropia.
Zan Lynx,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.