Crittografia di un file con codifica huffman

1

Ho scritto un programma di codifica huffman in grado di comprimere e decomprimere i file. Il file contiene un'intestazione che contiene informazioni che mi consentono di recuperare l'albero di huffman.
Volevo aggiungere una semplice funzione di crittografia / decrittografia al mio programma. Mi stavo chiedendo in che modo è meglio:
1. Criptare l'intero file. Il problema è che le persone possono capire il mio header abbastanza velocemente (relativamente al 2o modo), dato che è un massimo di circa 1KB.
2. Cripta tutto tranne l'intestazione. In questo modo, l'attaccante ha l'albero huffman, ma è inutile a meno che non riesca a trovare la chiave giusta per decodificare il contenuto. E come lo farà, non può semplicemente vedere se è semplice o binario (semplificato), deve decomprimerlo con l'albero di huffman, che richiederà più tempo.

Penso che la seconda via sia migliore.
C'è qualcosa che mi manca qui?
(Per favore non dirmi di usare un algoritmo moderno o qualcosa del genere, questo è un progetto per hobby e voglio codificarlo da solo)

Grazie.

    
posta shoham 01.09.2014 - 21:35
fonte

3 risposte

5

A giudicare dalla domanda e dai commenti, parafrasò la tua domanda come:

I'd like to encrypt a file, but part of my file has a predictable format. Will this make it easier to crack the encryption? Should I leave the structured parts out and encrypt only the minimum?

Prima di tutto: non è una domanda sciocca. Intuitivamente, penseresti che conoscere la struttura del messaggio ti aiuterà a decifrarlo, e questo è vero, ad un certo punto.

Fortunatamente, questo problema è stato a lungo anticipato dalla crittografia. Gli algoritmi di crittografia "moderni" hanno un alto fattore di ramificazione : un piccolo tweak nell'input, un singolo bit modificato, creerà un output irriconoscibilmente diverso. Per questo motivo, conoscere la struttura di una parte del tuo file non mi aiuterà molto, perché qualsiasi variazione nel contenuto porterà a un risultato molto diverso.

Alti fattori di ramificazione sono essenziali per una crittografia strong. Ecco un breve esempio di (1) in azione:

> echo HELO1 | openssl aes-128-cbc -k meep -S 0
∙╞X╟ε╜i§B÷FÄ│Γat

> echo HELO2 | openssl aes-128-cbc -k meep -S 0
╩ ëhnw²╜╗ç1L▀≡☼·

(1) Sintassi: openssl <algorithm> -k <passphrase> -S <salt>

Si noti che HELO1 e HELO2 hanno una struttura simile, differiscono solo di due bit, ma producono un output molto diverso. Questo fa sì che, se inizio a indovinare per la tua chiave di crittografia, non avrò idea di quanto io sia 'vicino'. Fondamentalmente, a meno che non ottenga un hit esatto e indovino la tua passphrase, avrò difficoltà a decifrare qualsiasi cosa dal tuo file.

A meno che, naturalmente, tu non mi dia informazioni lasciando le tue intestazioni scoperte. Non solo ora conosco il tipo di file, ma ho anche accesso all'albero di Huffman, che è stato creato da, e quindi contiene informazioni su, il messaggio che ha codificato. Potrei essere in grado di formulare un'ipotesi sul contenuto senza mai tentare di decrittografarlo.

Analogia: HTTP (S)

Anche l'HTTP è un protocollo strutturato: ogni richiesta inizia con un "metodo" (GET, POST, PUT ...) e termina con HTTP/1.X con X un certo numero. Ancor più: ogni linea che segue ha una struttura prevedibile, così come alcune linee che potrebbero essere indovinate con precisione ( Host: ). Mi sembra un sacco di informazioni da usare.

Tuttavia HTTPS crittografa l'intera conversazione, perché non farlo mi darebbe molte più informazioni. Diamine, con tutte le intestazioni, non potrei nemmeno ho bisogno di decifrare il carico utile: posso ricattarti con i soli dati dell'intestazione.

    
risposta data 02.09.2014 - 15:37
fonte
2

Cripta l'intero file. In questo modo le persone non saranno in grado di capire l'intestazione a meno che non decodifichino il file. Lasciare l'intestazione in chiaro renderà più facile per le persone capire quali dati si trovano sul blob crittografato.

La prima è molto meglio, poiché creerà un file che gli utenti malintenzionati non avranno idea dei contenuti.

    
risposta data 01.09.2014 - 21:55
fonte
1

Procedi con estrema cautela

Ci sono stati diversi attacchi sofisticati che usano cambiamenti nella dimensione dei dati compressi per rivelare il contenuto. CRIME e BREACH hanno funzionato entrambi perché i dati sensibili sono stati compressi e inviando più richieste che differivano solo da un singolo carattere alla volta e confrontando la dimensione degli output, sono stati in grado di recuperare i dati. Questo è sempre un rischio quando crittografate i dati compressi.

    
risposta data 02.09.2014 - 21:42
fonte

Leggi altre domande sui tag