Fonction de hachage OpenSSL pour générer une clé AES

8

Quelle fonction de hachage OpenSSL utilise-t-il pour générer une clé pour AES-256? Je ne le trouve nulle part dans leur documentation.

$ 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

Quel algorithme de hachage génère le hachage non salé après key=sur l'avant-dernière ligne, pour l'entrée "a"?

mk12
la source

Réponses:

9

Je suis assez sûr que c'est un algorithme de résumé SHA1 mais en toute honnêteté, je ne peux pas le dire avec 100% de certitude.

Et qui aurait pensé que quelque chose conçu pour augmenter l'obus aurait des instructions obtuses;)

EDIT: Cela peut ne pas être utile dans vos circonstances, mais je suppose que vous pourriez toujours savoir en faisant

openssl enc -d -a -md sha1 -aes-256-cbc -nosalt -p 
Snesticle
la source
J'ai déterminé qu'il utilise MD5 par défaut, comme lorsque j'utilise votre commande (sidenote: aucune de ces options n'est documentée dans la page du mage ...) avec md5au lieu de sha1, j'obtiens les mêmes résultats que ceux que j'ai publiés à l'origine. La question est, comment obtient-il 256 bits de MD5 (un algorithme de hachage de 128 bits)?
mk12
Une façon de procéder consiste à concaténer deux MD5 disparates sous forme binaire, ce qui donne une véritable clé de 256 bits. Il existe également quelques autres méthodes pour cela. Vous pouvez consulter le package php "md5_base64". Même si vous n'êtes pas un php, les documents sont assez instructifs.
Snesticle
4

Il s'agit d'une concaténation de deux hachages MD5.

Il est dérivé comme ceci:

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

Vous pouvez vérifier cela en faisant:

$ 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

Remarquez comment les MD5 de 'key.128.tmp' et 'key.256.tmp' concaténés ensemble forment la même clé que la sortie à la commande initiale.

user3281907
la source
Et si vous faites une troisième itération, vous obtiendrez l'IV. Ce cas est pratique car la taille des clés et des données = IV (256 et 128 bits) sont toutes deux des multiples exacts de la sortie de hachage; en général, vous concaténez les sorties de hachage et prenez les K premiers bits pour la clé et les D bits suivants pour l'IV.
dave_thompson_085
mise à jour: la valeur par défaut était md5, mais à partir de 1.1.0 en 2016, c'est sha256. Tous les
dave_thompson_085
2

OpenSSL utilise AES avec SHA1.

Si vous souhaitez examiner une source mieux écrite qu'OpenSSL, consultez l'article
classe C ++ qui s'interface avec les chiffrements OpenSSL .

L'article comprend du code source très simple qui:

vous permet de chiffrer et de déchiffrer des fichiers ou des chaînes à l'aide des algorithmes de chiffrement OpenSSL AES-256-CBC et de résumé SHA1. Il est interopérable avec l'outil de ligne de commande openssl qui en fait une bonne introduction à l'utilisation d'OpenSSL pour les chiffrements.

harrymc
la source
1

Je ne connais pas la réponse, mais vous pourriez probablement la trouver assez facilement dans le code source d'OpenSSL .

Fran
la source
2
"Assez facilement" - La mainfonction (où réside la fonctionnalité de demande de mot de passe) est d'environ 500 lignes et jonchée de gotos.
mk12
5
Sensationnel. Je viens de regarder le code source. C'est pratiquement illisible. Sans commentaires. Noms de variables à une lettre. Pouah. Je suis désolé d'avoir suggéré cela.
Fran