¿Cómo puedo usar openssl para descifrar datos encriptados AES usando la clave y el vector de inicialización?

1

Estoy intentando seguir el ejemplo en esta pregunta: ¿Dónde está la sal en el cifrado OpenSSL AES? pero estoy teniendo algunos problemas para descifrar usando la clave y el vector de inicialización.

Cuando encripto de la siguiente manera, uso "abc" como frase de contraseña:

$ 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=

Puedo descifrar el texto resultante usando la misma frase de contraseña:

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

Pero cuando intento descifrar usando la clave y el vector de inicialización en lugar de la frase de contraseña, falla:

$ 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:

Tenga en cuenta que la sal extraída del texto cifrado es incorrecta.

Estoy usando una máquina x86_64, ejecutando Cygwin en Windows 10, si es importante.

$ openssl version
OpenSSL 1.0.2n  7 Dec 2017

Siento que debo faltar algo básico.

SOLUCIONADO por @mvy El problema era que una sal se genera de forma aleatoria de forma predeterminada, pero cuando se especifican la clave y el iv para el descifrado, no debería haber una sal. Necesito suprimir la sal usando la opción -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
    
pregunta echawkes 26.06.2018 - 04:11
fuente

1 respuesta

2

Cuando se utiliza el formulario de contraseña del comando, la sal se envía al inicio de la secuencia de datos. Cuando utiliza -a , está codificando el salt en los datos base64.

El método Key + IV no necesita sal, y openssl no lo elimina de la cadena base64 decodificada.

Debes intentarlo de nuevo codificando con -nosalt al inicio de tu comando de codificación.

Edite: como dijo @forest en los comentarios, no use la opción de contraseña con -nosalt , no es seguro y el método Clave / IV supone que el par se ha asegurado de manera segura.

Si necesita usar primero el método de contraseña, le sugiero que lea acerca de cómo se insertan los datos salados al inicio del flujo de datos, y elimínelos. Puede que sea incompatible con la salida base64.

    
respondido por el M'vy 26.06.2018 - 14:27
fuente

Lea otras preguntas en las etiquetas