我正在使用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函数,
密钥推导算法
密钥和IV通过将D_1,D_2等串联起来得到,直到有足够的数据可用于密钥和IV为止。D_i定义为:
D_i = HASH ^ count(D_(i-1)||数据||盐)其中|| 表示连接,D_0为空,HASH是使用的摘要算法,HASH ^ 1(data)仅是HASH(数据),HASH ^ 2(data)是HASH(HASH(数据)),依此类推。
因此,对于一次迭代,关键应该是:
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,密码为密钥。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句