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% впевненістю.

І хто міг би подумати, що щось, що покликане посилити тупість, матиме тупі інструкції;)

EDIT: Це може бути не корисним у ваших обставинах, але, мабуть, ви завжди могли це знати, роблячи

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 ++, яка інтерфейсує до шифрів 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.