openssl 如何使用 PBKDF2 从密码构造派生密钥?
How does openssl construct the derived key from password with PBKDF2?
我正在开发一个 Java 模块来解密由 openssl 加密的消息,
openssl aes-256-cbc -k *** -a -pbkdf2 -iter 1 -md sha256
但没有成功。
经过一番调查,发现问题是我无法从给定的密码短语和盐中获取正确的 KEY 和 IV。
代码如下:
$ openssl aes-256-cbc -k hi -a -S 4142434445464748 -md sha256 -pbkdf2 -iter 1 -P
salt=4142434445464748
key=187DC06E1AF1278348E5EFE761FDE3133DF42B03CF64E1B286E50E58238AEFB5
iv =1949A8BB58205A5C04BB28AD1947016C
$ echo hiABCDEFGH | hd
00000000 68 69 41 42 43 44 45 46 47 48 0a |hiABCDEFGH.|
0000000b
$ echo -n hiABCDEFGH | sha256sum
8c8a825dbab83fbe7fb58552e26bb98aa3af20e7e6294e04ae6422a86906606b -
根据EVP_BytesToKey函数,
Key Derivation Algorithm
The key and IV is derived by concatenating D_1, D_2, etc until enough data is available for the key and IV . D_i is defined as:
D_i = HASH^count(D_(i-1) || data || salt)
where || denotes concatentaion, D_0 is empty, HASH is the digest algorithm in use, HASH^1(data) is simply HASH (data), HASH^2(data) is HASH ( HASH (data)) and so on.
所以,对于单次迭代,键应该是:
KEY = SHA256(password || salt)
也就是8c8a825d
...但是openssl的结果是187DC06E
...
那么,openssl 是如何计算派生密钥的呢?
您使用了“-pbkdf2”标志,这意味着您使用的是 PBKDF2 密钥派生函数 (KDF),而不是实施的遗留 KDF EVP_BytesToKey
。
PBKDF2 在此处的 RFC 2898 中定义:
https://www.ietf.org/rfc/rfc2898.txt
相关的OpenSSL函数记录在这里:
https://www.openssl.org/docs/man1.1.1/man3/PKCS5_PBKDF2_HMAC.html
上面的RFC指的是伪随机函数(PRF)。由于您指定了SHA256的摘要,因此使用的PRF是HMAC-SHA256,密码为密钥。
我正在开发一个 Java 模块来解密由 openssl 加密的消息,
openssl aes-256-cbc -k *** -a -pbkdf2 -iter 1 -md sha256
但没有成功。
经过一番调查,发现问题是我无法从给定的密码短语和盐中获取正确的 KEY 和 IV。
代码如下:
$ openssl aes-256-cbc -k hi -a -S 4142434445464748 -md sha256 -pbkdf2 -iter 1 -P
salt=4142434445464748
key=187DC06E1AF1278348E5EFE761FDE3133DF42B03CF64E1B286E50E58238AEFB5
iv =1949A8BB58205A5C04BB28AD1947016C
$ echo hiABCDEFGH | hd
00000000 68 69 41 42 43 44 45 46 47 48 0a |hiABCDEFGH.|
0000000b
$ echo -n hiABCDEFGH | sha256sum
8c8a825dbab83fbe7fb58552e26bb98aa3af20e7e6294e04ae6422a86906606b -
根据EVP_BytesToKey函数,
Key Derivation Algorithm
The key and IV is derived by concatenating D_1, D_2, etc until enough data is available for the key and IV . D_i is defined as:
D_i = HASH^count(D_(i-1) || data || salt) where || denotes concatentaion, D_0 is empty, HASH is the digest algorithm in use, HASH^1(data) is simply HASH (data), HASH^2(data) is HASH ( HASH (data)) and so on.
所以,对于单次迭代,键应该是:
KEY = SHA256(password || salt)
也就是8c8a825d
...但是openssl的结果是187DC06E
...
那么,openssl 是如何计算派生密钥的呢?
您使用了“-pbkdf2”标志,这意味着您使用的是 PBKDF2 密钥派生函数 (KDF),而不是实施的遗留 KDF EVP_BytesToKey
。
PBKDF2 在此处的 RFC 2898 中定义: https://www.ietf.org/rfc/rfc2898.txt
相关的OpenSSL函数记录在这里: https://www.openssl.org/docs/man1.1.1/man3/PKCS5_PBKDF2_HMAC.html
上面的RFC指的是伪随机函数(PRF)。由于您指定了SHA256的摘要,因此使用的PRF是HMAC-SHA256,密码为密钥。