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

20935
mk12

Какую хеш-функцию использует 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=второй последней строки для ввода «а»?

8

4 ответа на вопрос

7
Snesticle

Fairly sure it's an SHA1 digest algorithm but in all honesty I can't say with 100% certainty.

And who would have thought that something designed to increase obtuseness would have obtuse instructions ;)

EDIT: This may not be helpful in your circumstances but I guess you could always know by doing

openssl enc -d -a -md sha1 -aes-256-cbc -nosalt -p 
Я определил, что он использует MD5 по умолчанию, так как когда я использую вашу команду (sidenote: ни одна из этих опций не задокументирована на странице мага ...) с `md5` вместо` sha1`, я получаю те же результаты, что и я первоначально размещено. Вопрос в том, как получить 256 бит из MD5 (128-битный алгоритм хеширования)? mk12 12 лет назад 0
Один из способов сделать это - объединить два разрозненных MD5 в двоичном виде, что дает истинный 256-битный ключ. Есть несколько других методов для этого. Вы можете проверить пакет php "md5_base64". Даже если вы не php парень, документы довольно информативны. Snesticle 12 лет назад 0
4
user3281907

Это объединение двух хэшей 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 9 лет назад 0
обновление: по умолчанию используется md5, но по состоянию на 1.1.0 в 2016 году это sha256. Полная информация на https://crypto.stackexchange.com/questions/3298/is-there-a-standard-for-openssl-interoperable-aes-encryption dave_thompson_085 6 лет назад 0
2
harrymc

OpenSSL uses AES with SHA1.

If you wish to examine better-written source than OpenSSL, have a look at the article
C++ class that interfaces to OpenSSL ciphers.

The article includes very simple source code that :

allows you to encrypt and decrypt files or strings using the OpenSSL AES-256-CBC cipher and SHA1 digest algorithms. It is interoperable with the openssl command line tool which makes it a good introduction to using OpenSSL for ciphers.

1
Fran

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

«Достаточно легко» - функция `main` (где работает функция запроса пароля) имеет длину ~ 500 строк и изобилует` goto`s. mk12 12 лет назад 2
Вот это да. Я только что посмотрел на исходный код. Это практически не читается. Без комментариев. Однобуквенные имена переменных. Тьфу. Извините, я предложил это. Fran 12 лет назад 5

Похожие вопросы