用于生成 AES 密钥的 OpenSSL 哈希函数

用于生成 AES 密钥的 OpenSSL 哈希函数

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”,哪种哈希算法会在倒数第二行之后生成无盐哈希?

答案1

相当确定它是一种 SHA1 摘要算法,但老实说,我不能 100% 确定。

谁会想到,旨在增加愚钝度的东西会有愚钝的指令;)

编辑:这可能对你的情况没有帮助,但我想你总是可以通过做来知道

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

答案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

请注意“key.128.tmp”和“key.256.tmp”的 MD5 如何连接在一起形成与初始命令输出相同的密钥。

答案3

OpenSSL 使用带有 SHA1 的 AES。

如果你想检查比 OpenSSL 更好的源代码,请查看文章
与 OpenSSL 密码接口的 C++ 类

本文包含非常简单的源代码:

允许您使用 OpenSSL AES-256-CBC 密码和 SHA1 摘要算法加密和解密文件或字符串。它可与 openssl 命令行工具互操作,这使其成为使用 OpenSSL 进行密码的良好入门指南。

相关内容