Хеш-функция OpenSSL для генерации ключа AES


8

Какую хеш-функцию использует OpenSSL для генерации ключа для AES-256? Я не могу найти это нигде в их документации.

$ 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

Какой алгоритм хеширования генерирует несоленый хеш после key=второй последней строки для ввода «a»?

Ответы:


9

Я уверен, что это алгоритм дайджеста SHA1, но, честно говоря, я не могу сказать со 100% уверенностью.

А кто бы мог подумать, что что-то, предназначенное для увеличения тупости, будет иметь тупые инструкции;)

РЕДАКТИРОВАТЬ: Это может быть не полезно в ваших обстоятельствах, но я думаю, вы всегда могли знать, делая

openssl enc -d -a -md sha1 -aes-256-cbc -nosalt -p 

Я определил, что он использует MD5 по умолчанию, так как, когда я использую вашу команду (sidenote: ни одна из этих опций не задокументирована на странице мага ...), md5вместо этого sha1я получаю те же результаты, что я публиковал изначально. Вопрос в том, как получить 256 бит из MD5 (128-битный алгоритм хеширования)?
mk12

Один из способов сделать это - объединить два разрозненных MD5 в двоичном виде, что дает истинный 256-битный ключ. Есть несколько других методов для этого. Вы можете проверить пакет php "md5_base64". Даже если вы не php парень, документы довольно информативны.
Snesticle

4

Это объединение двух хэшей MD5.

Это выводится так:

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

Вы можете проверить это, выполнив:

$ 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

Обратите внимание, как оба MD5 из 'key.128.tmp' и 'key.256.tmp', соединенные вместе, образуют тот же ключ, что и вывод исходной команды.


И если вы сделаете третью итерацию, вы получите IV. Этот случай удобен тем, что размеры ключа и данных = IV (256 и 128 бит) являются точными коэффициентами хеш-вывода; в общем случае вы объединяете выходные данные хэша и берете первые K битов для ключа и следующие D битов для IV.
dave_thompson_085

обновление: по умолчанию используется md5, но по состоянию на 1.1.0 в 2016 году это sha256. Все подробности в crypto.stackexchange.com/questions/3298/...
dave_thompson_085

2

OpenSSL использует AES с SHA1.

Если вы хотите изучить лучше написанный источник, чем OpenSSL, взгляните на статью
C ++ class, которая взаимодействует с шифрами OpenSSL .

Статья содержит очень простой исходный код, который:

позволяет шифровать и дешифровать файлы или строки с использованием алгоритма шифрования OpenSSL AES-256-CBC и алгоритма дайджеста SHA1. Он совместим с инструментом командной строки openssl, что делает его хорошим введением в использование OpenSSL для шифров.


1

Я не знаю ответа, но вы, вероятно, могли бы найти его достаточно легко в исходном коде OpenSSL .


2
«Достаточно легко» - mainфункция (там, где работает функция запроса пароля) имеет длину ~ 500 строк и изобилует символом gotos.
mk12

5
Ух ты. Я только что посмотрел на исходный код. Это практически не читается. Без комментариев. Однобуквенные имена переменных. Тьфу. Извините, я предложил это.
Фран
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.