用于生成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” 生成未加盐的哈希?

Answers:


9

可以肯定地说,这是一个SHA1摘要算法,但老实说,我不能百分百确定。

谁会想到旨在增加钝性的东西会带有钝性指示;)

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

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

我已经确定它默认情况下使用MD5,因为当我使用您的命令(注:这些选项均未记录在法师页面上)时,使用md5代替sha1,得到的结果与最初发布的结果相同。问题是,它如何从MD5(128位哈希算法)中获得256位?
mk12 2012年

完成此操作的一种方法是将两个不同的MD5二进制级联,从而得到真正的256位密钥。还有其他一些方法可以做到这一点。您可能会签出php软件包“ md5_base64”。即使您不是php专家,这些文档也非常有用。
Snesticle 2012年

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

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


如果执行第三次迭代,您将获得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将AES与SHA1结合使用。

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

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

允许您使用OpenSSL AES-256-CBC密码和SHA1摘要算法对文件或字符串进行加密和解密。它可与openssl命令行工具互操作,这是对使用OpenSSL进行密码的很好的介绍。


1

我不知道答案,但是您可能可以在OpenSSL源代码中轻松找到它。


2
“足够容易” —该main功能(要求密码的功能所在的位置)长约500行,并带有gotos。
mk12

5
哇。我只是看了一下源代码。这几乎是不可读的。没意见。一字母变量名称。啊。抱歉,我建议了。
Fran
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.