Función hash de OpenSSL para generar clave AES

8

¿Qué función hash utiliza OpenSSL para generar una clave para AES-256? No puedo encontrarlo en ninguna parte de su documentación.

$ touch file
$ openssl aes-256-cbc -nosalt -P -in file

enter aes-256-cbc encryption password: (I type "a" and hit enter)
Verifying - enter aes-256-cbc encryption password: (I type "a" and hit enter)

key=0CC175B9C0F1B6A831C399E269772661CEC520EA51EA0A47E87295FA3245A605
iv =4FA92C5873672E20FB163A0BCB2BB4A4

¿Qué algoritmo hash genera el hash sin sal después key=de la segunda última línea, para la entrada "a"?

mk12
fuente

Respuestas:

9

Bastante seguro de que es un algoritmo de resumen SHA1, pero honestamente, no puedo decir con 100% de certeza.

¿Y quién hubiera pensado que algo diseñado para aumentar la obtusidad tendría instrucciones obtusas;)

EDITAR: Esto puede no ser útil en sus circunstancias, pero supongo que siempre podría saberlo haciendo

openssl enc -d -a -md sha1 -aes-256-cbc -nosalt -p 
La esnestícula
fuente
He determinado que usa MD5 de forma predeterminada, como cuando uso su comando (nota al margen: ninguna de esas opciones está documentada en la página de mago ...) en md5lugar de sha1, obtengo los mismos resultados que publiqué originalmente. La pregunta es, ¿cómo obtiene 256 bits de MD5 (un algoritmo de hash de 128 bits)?
mk12
Una forma de hacerlo es concatenando dos MD5 dispares en forma binaria, lo que da como resultado una verdadera clave de 256 bits. Hay algunos otros métodos para esto también. Puede consultar el paquete php "md5_base64". Incluso si no eres un php, los documentos son bastante informativos.
Snesticle
4

Es una concatenación de dos hash MD5.

Se deriva así:

128bit_Key = MD5(Passphrase + Salt)
256bit_Key = 128bit_Key + MD5(128bit_Key + Passphrase + Salt)

Puede verificar esto haciendo:

$ echo Testing > file
$ openssl enc -aes-256-cbc -p -in file -out file.aes -salt
: enter aes-256-cbc encryption password: abc
: Verifying - enter aes-256-cbc encryption password: abc
: salt=3025373CA0530C93
: key=E165475C6D8B9DD0B696EE2A37D7176DFDF4D7B510406648E70BAE8E80493E5E
: iv =B030394C16C76C7A94DC22FDDB6B0744
$ perl -e 'print pack "H*", "3025373CA0530C93"' > salt
$ echo -n abc > passphrase
$ cat passphrase > key.128.tmp
$ cat salt >> key.128.tmp
$ md5sum key.128.tmp 
: e165475c6d8b9dd0b696ee2a37d7176d  key.128.tmp
$ perl -e 'print pack "H*", "e165475c6d8b9dd0b696ee2a37d7176d"' > key.128
$ cat key.128 > key.256.tmp
$ cat passphrase >> key.256.tmp
$ cat salt >> key.256.tmp
$ md5sum key.256.tmp 
: fdf4d7b510406648e70bae8e80493e5e  key.256.tmp

Observe cómo ambos MD5 de 'key.128.tmp' y 'key.256.tmp' concatenados juntos forman la misma clave que la salida en el comando inicial.

usuario3281907
fuente
Y si haces una tercera iteración obtendrás el IV. Este caso es conveniente porque la clave y los datos = tamaños IV (256 y 128 bits) son múltiplos exactos de la salida hash; en general, concatena las salidas hash y toma los primeros K bits para la clave y los siguientes D bits para el IV.
dave_thompson_085
actualización: el valor predeterminado solía ser md5, pero a partir de 1.1.0 en 2016 es sha256. Detalles completos en crypto.stackexchange.com/questions/3298/…
dave_thompson_085
2

OpenSSL usa AES con SHA1.

Si desea examinar una fuente mejor escrita que OpenSSL, eche un vistazo al artículo de la
clase C ++ que interactúa con los cifrados de OpenSSL .

El artículo incluye un código fuente muy simple que:

le permite cifrar y descifrar archivos o cadenas utilizando el cifrado OpenSSL AES-256-CBC y los algoritmos de resumen SHA1. Es interoperable con la herramienta de línea de comandos openssl, que lo convierte en una buena introducción al uso de OpenSSL para cifrados.

harrymc
fuente
1

No sé la respuesta, pero probablemente la puedas encontrar fácilmente en el código fuente de OpenSSL .

Fran
fuente
2
"Fácilmente fácil": la mainfunción (donde reside la funcionalidad de solicitud de contraseña) tiene ~ 500 líneas de largo y está llena de gotos.
mk12
55
Guau. Acabo de mirar el código fuente. Es prácticamente ilegible. Sin comentarios. Nombres de variables de una letra. Ugh Lo siento, sugerí eso.
Fran