首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >openssl如何使用PBKDF2从密码构造派生密钥?

openssl如何使用PBKDF2从密码构造派生密钥?
EN

Stack Overflow用户
提问于 2021-02-12 17:34:18
回答 1查看 1.9K关注 0票数 0

我正在开发一个Java模块来解密由openssl加密的消息,

代码语言:javascript
运行
复制
openssl aes-256-cbc -k *** -a -pbkdf2 -iter 1 -md sha256

但没有成功。

经过一些调查,发现问题是,我无法从一个给定的密码和盐得到正确的密钥和IV。

以下是代码:

代码语言:javascript
运行
复制
$ 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  -

根据BytesToKey函数,

密钥推导算法 密钥和IV是通过连接D_1、D_2等来导出的,直到密钥和IV有足够的数据为止。D_i被定义为: D_i =散列^count(D_(i-1)\x\x\x)\{e76f}\{e76f}表示连接,D_0是空的,散列是正在使用的摘要算法,散列^1(数据)是简单的散列(数据),散列^2(数据)是散列(数据),等等。

因此,对于一个迭代,关键应该是:

代码语言:javascript
运行
复制
KEY = SHA256(password || salt)

那是8c8a825d..。但是,openssl的结果是187DC06E.

那么,openssl如何计算派生密钥呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-12 21:01:08

您使用了"-pbkdf2“标志,这意味着您使用的是PBKDF2一个密钥派生函数( KDF ),而不是遗留的KDF实现的EVP_BytesToKey

PBKDF2在RFC 2898中定义如下:https://www.ietf.org/rfc/rfc2898.txt

相关的OpenSSL函数记录在这里:HMAC.html

上述RFC指的是伪随机函数(PRF).因为您已经指定了SHA256摘要,所以使用的PRF是HMAC 256,密码是密钥。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66176468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档