AESキーを生成するためのOpenSSLハッシュ関数


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」に対して、2番目の最後の行の後に無塩ハッシュを生成するハッシュアルゴリズムはどれですか。

回答:


9

SHA1ダイジェストアルゴリズムであることはほぼ間違いありませんが、正直なところ、100%確実とは言えません。

そしてだれが鈍化を増加させるように設計された何かが鈍感な指示を持っているだろうと思ったでしょう;)

編集:これはあなたの状況では役に立たないかもしれませんが、私はあなたが常に行うことで知ることができると思います

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

私があなたのコマンドを使用するとき(補足:これらのオプションはいずれもmageページに記載されていません...)をのmd5代わりに使用するとsha1、最初に投稿したのと同じ結果が得られます。問題は、MD5(128ビットのハッシュアルゴリズム)から256ビットを取得する方法ですか。
mk12

これを行う1つの方法は、2つの異なるMD5をバイナリ形式で連結して、真の256ビットキーを生成することです。これには他にもいくつかの方法があります。phpパッケージ「md5_base64」をチェックアウトするかもしれません。あなたがphpの人ではない場合でも、ドキュメントはかなり有益です。
Snesticle 2012

4

これは、2つの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」の両方が連結されて、最初のコマンドの出力と同じキーを形成していることに注目してください。


そして、3回目の反復を行うと、IVが得られます。keyとdata = IVサイズ(256および128ビット)はどちらもハッシュ出力の正確な倍数であるため、このケースは便利です。一般に、ハッシュ出力を連結し、キーには最初のKビットを、IVには次のDビットを使用します。
dave_thompson_085

更新:デフォルトはmd5でしたが、2016年の1.1.0以降はsha256です。crypto.stackexchange.com/questions/3298/…の
dave_thompson_085

2

OpenSSLはSHA1でAESを使用します。

OpenSSLよりも優れたソースを調べたい場合は、
OpenSSL暗号にインターフェースするC ++クラスの記事をご覧ください

この記事には、次のような非常にシンプルなソースコードが含まれています。

OpenSSL AES-256-CBC暗号およびSHA1ダイジェストアルゴリズムを使用して、ファイルまたは文字列を暗号化および復号化できます。opensslコマンドラインツールと相互運用できるため、暗号化にOpenSSLを使用するための優れた入門ツールです。


1

答えはわかりませんが、おそらくOpenSSLソースコードで十分簡単に​​見つけることができます


2
「十分に簡単」-このmain機能(パスワードを尋ねる機能が存在する場所)は、長さが約500行で、gotosが散らばっています。
mk12

5
ワオ。私はソースコードを見ただけです。事実上判読できません。コメントはありません。1文字の変数名。ああ。申し訳ありません。
フラン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.