Come posso utilizzare openssl per decrittografare i dati crittografati con AES utilizzando il vettore di chiave e di inizializzazione?

1

Sto tentando di seguire l'esempio in questa domanda: dove è il sale sulla crittografia OpenSSL AES? ma sto avendo qualche problema a decifrare usando il tasto e il vettore di inizializzazione.

Quando cifro come segue, usando "abc" come passphrase:

$ echo -n Polaco | openssl enc -aes-256-cbc -a -p
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
salt=0EEC20170C1B2A76
key=33945888AB044FE34F69289E3186FEA7DB914BF2ED37C2DE123117FB494ACDD8
iv =0C4CAA4A27FE3BFB05399AF217D24357
U2FsdGVkX18O7CAXDBsqdsqiOcaoPpa2OcFAtk2jQGY=

Posso decifrare il testo risultante usando la stessa passphrase:

$ echo U2FsdGVkX18O7CAXDBsqdsqiOcaoPpa2OcFAtk2jQGY= |  openssl enc -d -a -aes-256-cbc -p
enter aes-256-cbc decryption password:
salt=0EEC20170C1B2A76
key=33945888AB044FE34F69289E3186FEA7DB914BF2ED37C2DE123117FB494ACDD8
iv =0C4CAA4A27FE3BFB05399AF217D24357
Polaco

Ma quando provo a decifrare usando la chiave e il vettore di inizializzazione invece della passphrase, fallisce:

$ echo U2FsdGVkX18O7CAXDBsqdsqiOcaoPpa2OcFAtk2jQGY= |  openssl enc -d -a -aes-256-cbc -p -K 33945888AB044FE34F69289E3186FEA7DB914BF2ED37C2DE123117FB494ACDD8 -iv 0C4CAA4A27FE3BFB05399AF217D24357
salt=1250FC9CF97F0000
key=33945888AB044FE34F69289E3186FEA7DB914BF2ED37C2DE123117FB494ACDD8
iv =0C4CAA4A27FE3BFB05399AF217D24357
bad decrypt
4294956672:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:531:

Si noti che il sale estratto dal testo crittografato è sbagliato.

Sto usando una macchina x86_64, con Cygwin su Windows 10, se è importante.

$ openssl version
OpenSSL 1.0.2n  7 Dec 2017

Mi sento come se mi dovessi perdere qualcosa di base.

RISOLTO di @mvy Il problema era che un salt viene generato casualmente per impostazione predefinita, ma quando si specifica la chiave e iv per la decrittografia, non dovrebbe esserci un salt. Ho bisogno di sopprimere il sale usando l'opzione -nosalt.

$ echo -n Polaco | openssl enc -aes-256-cbc -nosalt -p -out /tmp/pol1
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
key=900150983CD24FB0D6963F7D28E17F72EA0B31E1087A22BC5394A6636E6ED34B
iv =2EFFA65AF1C5EB20572E2F9896B90FEB

$ openssl enc -d -aes-256-cbc -nosalt -p -in /tmp/pol1 -K 900150983CD24FB0D6963F7D28E17F72EA0B31E1087A22BC5394A6636E6ED34B -iv 2EFFA65AF1C5EB20572E2F9896B90FEB
key=900150983CD24FB0D6963F7D28E17F72EA0B31E1087A22BC5394A6636E6ED34B
iv =2EFFA65AF1C5EB20572E2F9896B90FEB
Polaco
    
posta echawkes 26.06.2018 - 04:11
fonte

1 risposta

2

Quando si utilizza il modulo password del comando, il sale viene emesso all'inizio del flusso di dati. Quando si utilizza -a si codifica il sale nei dati base64.

Il metodo Key + IV non ha bisogno di sale, e openssl non lo rimuove dalla stringa decodificata base64.

Dovresti riprovare codificando con -nosalt all'inizio del comando di codifica.

Modifica: come @forest detto nei commenti, non usare l'opzione password con -nosalt , non è sicuro e il metodo Key / IV suppone che la coppia sia stata protetta in modo sicuro.

Se è necessario utilizzare prima il metodo della password, suggerisco di leggere come vengono inseriti i dati salati all'inizio del flusso di dati e di rimuoverli. Potrebbe non essere compatibile con l'output di base64.

    
risposta data 26.06.2018 - 14:27
fonte

Leggi altre domande sui tag