2009-12-31 25 views
10

Quando si utilizza l'algoritmo blowfish dalla libreria openssl, è possibile crittografare e decrittografare qualsiasi dato.Come verificare se la decrittografia ha avuto successo?

Inoltre, qualsiasi dato può essere crittografato (decrittografato) con qualsiasi chiave \ iv. Non c'è modo in openssl di dire se la decifrazione ha avuto successo o meno. È solo una trasformazione matematica.

Quindi, cosa devo fare per essere sicuro che la crittografia abbia avuto successo: che alcuni dati sono stati decifrati con la stessa chiave/iv che è stata crittografata?

Devo aggiungere alcuni byte MAGIC ai dati che devono essere controllati dopo la decrittografia?

+0

I byte magici aiuterebbero. Molto meglio è aggiungere un hash sicuro ai dati crittografati come descritto di seguito dagli ingenui. –

risposta

8

È possibile aggiungere un checksum (ad esempio, MD5 del contenuto originale) alla fine del file. Dopo averlo decrittografato, gli ultimi 16 byte devono essere nuovamente uguali a md5 (contenuto-16 byte)

+3

checksum! = MD5 – jldupont

+0

MD5 può essere utilizzato come funzione di checksum, poiché ha un rapporto relativamente basso di collisioni.Certo, non è una tipica funzione di checksum, ma è facile da calcolare ed è abbastanza veloce (so che CRC è più veloce ;-) – naivists

+0

@naivists: il punto è che un "checksum" è una bestia diversa da un "algoritmo di hashing" . – jldupont

1

Tra le molte soluzioni possibili, è consigliabile utilizzare CRC.

+0

Secondo l'articolo di Wikipedia, "un CRC n bit, applicato a un blocco di dati di lunghezza arbitraria, rileverà ogni singolo burst di errore non più lungo di n bit". Ciò significa che dovrei usare CRC con una lunghezza uguale al mio messaggio crittografato? Perché, per quanto ho capito, "errore" nel messaggio decrittografato con la chiave sbagliata avrà probabilmente la lunghezza massima (lunghezza del messaggio). Questo non sembra efficiente in termini di memoria. –

+0

no, ad esempio un CRC a 32 bit rileva qualsiasi errore a singolo bit ** burst ** non più lungo di 32 bit ** indipendente ** di lunghezza del messaggio crittografato. In altre parole, è molto efficiente in termini di memoria. Spero che questo ti aiuti. – jldupont

+0

Attendi, attendi, attendi :-) Se il messaggio è stato decrittografato con una chiave errata, la lunghezza dell'errore sarà uguale alla lunghezza del messaggio, giusto? Perché molto probabilmente ogni cosa sarà sbagliata. Destra? Significa che l'errore nel messaggio più lungo di 32 bit non verrà rilevato? Scusa, forse, domande stupide. –

0

il metodo di checksum alla fine dei dati è il migliore penso, tuttavia è necessario decodificare l'intero contenuto fino a fine.

da questo punto di vista, i byte magici all'inizio sarebbe un vantaggio, perché è possibile decidere se la decrittografia ha avuto successo al primo blocco. tuttavia, si potrebbe obiettare che con l'ispezione del codice sorgente, un utente malintenzionato ha un possibile vantaggio (scenario in chiaro in parte conosciuto).

quindi quello che ho fatto (finalmente all'interno di un software produttivo) stava utilizzando la chiave stessa per il primo blocco (invece di utilizzare byte magici costanti o prevedibili). questo si traduce nelle seguenti conoscenze supplementari per un attaccante:

key = decrypt(ciphertext, key) 

non ho trovato una prova che questo sarebbe un suggerimento utile per un attaccante se si utilizza ad esempio AES. forse qualcuno ne sa di più.

0

I byte magici, il checksum e la chiave di crittografia crittografata rendono tutti gli attacchi di forza bruta molto più facili in quanto l'autore dell'attacco deve solo eseguire le 2256 possibilità di eseguire il messaggio tramite decrittografia e cercare quella magia o il checksum o la chiave all'interno dei dati decrittografati. È molto più difficile per lui romperlo se non ha nulla da cercare, il che significa che potrebbe romperlo e non realizzarlo mai.

Problemi correlati