首页 > 其他分享 >[转]PKCS#5研究——基于口令的密码技术(合)

[转]PKCS#5研究——基于口令的密码技术(合)

时间:2023-12-22 16:24:06浏览次数:38  
标签:PKCS DK 步骤 导出 口令 密码 密钥 字节

原文地址:PKCS#5研究——基于口令的密码技术(合)-CSDN博客

 

本文档对PKCS#5 v2.1(基于口令的密码标准)介绍的基于口令的密钥生成函数、基于口令的加密方案、基于口令的消息认证MAC方案进行简要分析记录。其核心为基于口令的密钥生成函数即将口令(Password)通过密钥导出函数KDF后生成主密钥,用于加密方案和消息认证方案。NIST SP 800-132(基于口令的密钥导出)也是参考PKCS5来制定的。

 

1. 综述
PKCS5 v2.1主要讲述了三个方面的内容:

 

基于口令的密钥导出函数PBKDF。
PBKDF1:仅兼容PKCS5 v1.5用,使用HASH(MD2、MD5、SHA-1),导出密钥≤ hLen。
PBKDF2:推荐使用,使用HMAC,导出密钥可很长。方案同NIST SP800-132的PBKDF。
基于口令的加密方案,用PBKDF导出密钥进行加密。
PBES1:仅兼容PKCS5 v1.5,PBKDF1 + DES / RC2 – CBC
PBES2:推荐使用,PBKDF2 + AES-CBC-Pad
基于口令的消息认证方案,用PBKDF导出密钥计算MAC。
主要涉及如下几个参数

 

P:口令,任意长度的字符串(通常为ASCII 或UTF-8字符)。
S:盐值,无需保密,增加密文多变性,可为口令索引值或伪随机数等。
c:迭代次数,口令导出密钥时的迭代次数,建议不小于1000,以适当增加使用者负担,但可以显著增加攻击者难度。
DK:导出密钥。
dkLen:导出密钥的字节长度。
hLen:杂凑函数的输出字节长度。
口令的选择建议参考如下文档。

 

NIST SP 800-63: Electronic Authentication Guideline: Recommendations of the National Institute of Standards and Technology, Appendix A, April 2006.
5. 基于口令的密钥导出函数
有两个基于口令的密钥导出函数PBKDF方案,如下表。

 

表5.1 基于口令的密钥导出函数PBKDF1和PBKDF2对比

 

(hLen为HASH函数的输出长度)

 

项目

 

PBKDF1

 

PBKDF2

 

HASH函数

 

MD2

 

MD5

 

SHA-1

 

HMAC

 

(HMAC底层使用SHA-1、SHA-224、SHA-256、SHA-384、SHA-512)

 

导出密钥长度

 

≤ hLen

 

≤ (232 – 1) × hLen

 

使用

 

不推荐

 

仅兼容PKCS5 v1.5

 

推荐使用

 

对比NIST SP800-132

 

NIST SP800-132无PBKDF1函数

 

NIST SP800-132的PBKDF即PBKDF2函数

 

NIST SP800-132基于口令的密钥导出函数,是基于PKCS5得到。

 

5.1 PBKDF1
说明:NIST SP800-132基于口令的密钥导出函数不涉及此PBKDF1函数。

 

函数:DK = PBKDF1 (P, S, c, dkLen)

 

功能:基于口令的密钥导出函数PBKDF1

 

输入参数:

 

P:口令,任意长度的字符串(通常为ASCII 或UTF-8字符)。
S:盐值,无需保密,增加密文多变性。
c:迭代次数,越大越好,建议不小于1000。
dkLen:导出密钥DK的字节长度,≤ hLen。
内部参数:

 

HASH:杂凑函数(为MD2、MD5、SHA-1)。
hLen:杂凑函数的输出字节长度。
MSB(L, M):获取数据串M的高L字节。
返回数据:

 

DK:导出密钥。
执行步骤:

 

步骤1:若dkLen > hLen,返回错误标识。

 

步骤2:T0 = P || S。

 

步骤3:for i = 1,2,..., c,执行

 

3.1 Ti = Hash (Ti-1)

 

步骤4:返回导出密钥DK = MSB (dkLen, Tc)。

 

5.2 PBKDF2
说明:NIST SP800-132基于口令的密钥导出函数PBKDF即此PBKDF2函数。

 

函数:DK = PBKDF2 (P, S, c, dkLen)

 

功能:基于口令的密钥导出函数PBKDF2

 

输入参数:

 

P:口令,任意长度的字符串(通常为ASCII 或UTF-8字符)。
S:盐值,无需保密,增加密文多变性。
c:迭代次数,越大越好,建议不小于1000。
dkLen:导出密钥DK的字节长度,≤ (232 – 1) × hLen。
内部参数:

 

PRF:伪随机函数,可以是HMAC-SHA-1、HMAC-SHA-224、HMAC-SHA-256、HMAC-SHA-384、HMAC-SHA-512。
hLen:杂凑函数的输出字节长度。
MSB(L, M):获取数据串M的高L字节。
返回数据:

 

DK:导出密钥。
执行步骤:

 

步骤1:若dkLen > (232 – 1) × hLen,返回错误标识。

 

步骤2:分组数l和最后一个分组的大小r是

 

h=⌈dkLen/hLen⌉

=






/





 

r=dkLen−(l−1)hlen

=






(


1
)




 

(即r = dkLen mod hLen,但模值为0时修正为hLen)。

 

步骤3:for i = 1,2,..., l

 

3.1 Ti = 0,U0=S || Int(i)(Int(i)为i值的32比特大端表示)

 

3.2 for j = 1,2,..., c

 

3.2.1 Uj= PRF (P, Uj-1)

 

3.2.2 Ti = Ti⊕Uj

 

步骤4:返回DK= MSB(T1 || T2 || ... || Tl , dkLen)。

 

 

 

备注:PKCS5 v2.1 PBKDF2和NIST SP800-132 PBKDF中使用的PRF都是HMAC,而NIST SP800-108(普通密钥导出函数,非基于口令的密钥导出函数)中使用的PRF可以是HMAC或CMAC。

 

6. 基于口令的加密方案
有两个基于口令的加密PBES方案,如下表。

 

表5.1 基于口令的加密方案PBES1和PBES2对比

 

(hLen为HASH函数的输出长度)

 

项目

 

PBES1

 

PBES2

 

使用的PBKDF

 

PBKDF1

 

PBKDF2

 

使用的密码算法

 

DES / RC2 – CBC模式

 

AES-CBC-Pad

 

使用

 

不推荐

 

仅兼容PKCS5 v1.5

 

推荐使用

 

AES-CBC-Pad是AES算法,密钥16/24/32字节,分组16字节,IV16字节。
根据PKCS#5的附录B.2.4 RC5-CBC-Pad 提到的RC5-128的填充方式,猜测AES-CBC-Pad的填充方式为:the padding string consists of 16-(||M||mod 16) octets each with value 16-(||M|| mod 16).
6.1 PBES1
PBES中对消息填充的方案(EM = M || PS)为:

 

记T = 8-(#M mod 8),
填充数据PS为连续T个字节且每个字节值均为T的字符串。
例:若#M mod 8 = 7,PS = 01
例:若#M mod 8 = 0,PS = 08 08 08 08 08 08 08 08
此填充规则来至于RFC 1423。
6.1.1 PBES1-ENC
函数:C = PBES1-ENC (M, P, S, c)

 

功能:基于口令的加密方案PBES1的加密算法

 

输入参数:

 

M:明文。
P:口令,任意长度的字符串(通常为ASCII 或UTF-8字符)。
S:盐值,8字节。无需保密,增加密文多变性。
c:迭代次数,越大越好,建议不小于1000。
内部参数:

 

ENC-CBC:加密函数CBC模式(如AES-ENC-CBC)。
返回数据:

 

C:密文。
执行步骤:

 

步骤1:生成导出密钥,DK = PBKDF1 (P, S, c, 16)。

 

步骤2:生成加密密钥K(DK的高8字节)和初始化向量IV(DK的低8字节):

 

K = DK[0...7], IV = DK[8...15] .

 

步骤3:生成编码后的消息(记T = 8-(#M mod 8))

 

EM = M || PS,

 

其中填充数据PS为连续T个字节且每个字节值均为T的字符串。

 

例:若#M mod 8 = 7,PS = 01
例:若#M mod 8 = 0,PS = 08 08 08 08 08 08 08 08
步骤4:CBC加密:C = ENC-CBC(K, IV, EM)。

 

步骤5:输出密文C。

 

6.1.2 PBES1-DEC
函数:M = PBES1-DEC (C, P, S, c)

 

功能:基于口令的加密方案PBES1的解密算法

 

输入参数:

 

C:密文。
P:口令,任意长度的字符串(通常为ASCII 或UTF-8字符)。
S:盐值,8字节。无需保密,增加密文多变性。
c:迭代次数,越大越好,建议不小于1000。
内部参数:

 

DEC-CBC:解密函数CBC模式(如AES-DEC-CBC)。
返回数据:

 

M:明文。
执行步骤:

 

步骤1:生成导出密钥,DK = PBKDF1 (P, S, c, 16)。

 

步骤2:生成加密密钥K(DK的高8字节)和初始化向量IV(DK的低8字节):

 

K = DK[0...7], IV = DK[8...15] .

 

步骤3:CBC解密:EM = DEC-CBC(K, IV, C)。

 

步骤4:解码生成编码后的消息

 

M || PS = EM。

 

记T 为EM最后一个字节的值,填充数据PS为连续T个字节且每个字节值均为T的字符串。如果PS不满足要求(1):T=1,2,...,8;(2)PS的T个字节的值都为T;则填充数据格式验证失败,返回错误。

 

步骤5:输出明文M。

 

 

 

6.2 PBES2
PBES中对消息填充的方案(EM = M || PS)为:

 

记T = 8-(#M mod 8),
填充数据PS为连续T个字节且每个字节值均为T的字符串。
例:若#M mod 8 = 7,PS = 01
例:若#M mod 8 = 0,PS = 08 08 08 08 08 08 08 08
此填充规则来至于RFC 1423。
6.2.1 PBES2-ENC
函数:C = PBES2-ENC (M, P, S, c)

 

功能:基于口令的加密方案PBES2的加密算法

 

输入参数:

 

M:明文。
P:口令,任意长度的字符串(通常为ASCII 或UTF-8字符)。
S:盐值,8字节。无需保密,增加密文多变性。
c:迭代次数,越大越好,建议不小于1000。
内部参数:

 

dkLen:导出密钥DK的字节长度。
返回数据:

 

C:密文。
执行步骤:(PKCS#5未详细描述dkLen、K和IV的获取,相关内容为揣测)

 

步骤1:根据选择的密码算法AES-CBC-Pad确定dkLen(自定义)。

 

步骤2:生成导出密钥,DK = PBKDF2 (P, S, c, dkLen)。

 

步骤3:加密:C = AES-CBC-Pad.ENC(DK, M)。(涉及K和IV的划分,自定义)

 

步骤4:输出密文C。

 

根据PKCS#5的附录B.2.4 RC5-CBC-Pad 提到的RC5-128的填充方式,猜测AES-CBC-Pad的填充方式为:the padding string consists of 16-(||M||mod 16) octets each with value 16-(||M|| mod 16).

 

6.2.2 PBES2-DEC
函数:M = PBES2-DEC (C, P, S, c)

 

功能:基于口令的加密方案PBES2的解密算法

 

输入参数:

 

C:密文。
P:口令,任意长度的字符串(通常为ASCII 或UTF-8字符)。
S:盐值,8字节。无需保密,增加密文多变性。
c:迭代次数,越大越好,建议不小于1000。
内部参数:

 

dkLen:导出密钥DK的字节长度。
返回数据:

 

M:明文。
执行步骤:(PKCS#5未详细描述dkLen、K和IV的获取,相关内容为揣测)

 

步骤1:根据选择的密码算法AES-CBC-Pad确定dkLen(自定义)。

 

步骤2:生成导出密钥,DK = PBKDF2 (P, S, c, dkLen)。

 

步骤3:解密:M = AES-CBC-Pad.DEC(DK, C)。(涉及K和IV的划分,自定义)

 

步骤4:输出明文M。

 

7. 基于口令的消息认证方案
仅有一个基于口令的消息认证方案PBMAC1,如下表。

 

表5.1 基于口令的加密方案PBES1和PBES2对比

 

(hLen为HASH函数的输出长度)

 

项目

 

PBMAC1.

 

使用的PBKDF

 

PBKDF2

 

使用的密码算法

 

HMAC

 

(底层HASH使用SHA1和SHA2)

 

使用

 

推荐

 

7.1 PBMAC1
7.1.1 PBMAC1 generation
函数:C = PBMAC1-Generate (M, P, S, c dkLen)

 

功能:基于口令的加密方案PBES1的加密算法

 

输入参数:

 

M:消息。
P:口令,任意长度的字符串(通常为ASCII 或UTF-8字符)。
S:盐值,8字节。无需保密,增加密文多变性。
c:迭代次数,越大越好,建议不小于1000。
dkLen:导出密钥的字节长度。
内部参数:

 

MAC:HMAC-SHA1或HMAC-SHA2。
返回数据:

 

T:消息检验码。
执行步骤:

 

步骤1:生成导出密钥,DK = PBKDF:2 (P, S, c, dkLen)。

 

步骤2:生成消息检验码T = MAC(DK, M)。

 

步骤3:输出消息检验码T。

 

7.1.2 PBMAC1 verification
函数:C = PBMAC1-Verify (M, P, S, c, dkLen, T)

 

功能:基于口令的加密方案PBES1的加密算法

 

输入参数:

 

M:消息。
P:口令,任意长度的字符串(通常为ASCII 或UTF-8字符)。
S:盐值,8字节。无需保密,增加密文多变性。
c:迭代次数,越大越好,建议不小于1000。
dkLen:导出密钥的字节长度。
T:消息检验码。
内部参数:

 

MAC:HMAC-SHA1或HMAC-SHA2。
返回数据:

 

ret:TRUE为验证通过,FALSE为验证失败。
执行步骤:

 

步骤1:生成导出密钥,DK = PBKDF2 (P, S, c, dkLen)。

 

步骤2:生成消息检验码T1= MAC(DK, M)。

 

步骤3:比较T1和T,两者相同则返回ret = TRUE,否则返回ret = FALSE。
————————————————
版权声明:本文为CSDN博主「艾米的爸爸」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/samsho2/article/details/83987081

 

标签:PKCS,DK,步骤,导出,口令,密码,密钥,字节
From: https://www.cnblogs.com/dirgo/p/17921846.html

相关文章

  • [转]PBKDF2函数,比「Hash加盐」更好的口令保护方案
    原文地址:PBKDF2函数,比「Hash加盐」更好的口令保护方案-简书在前面两篇文章中,对用户口令进行加密的方式其实称为Password-basedencryption(PBE),算法实现很简单,那是不是有更好和更标准的PBE实现呢?基于Hash+salt的算法最大的问题在于Hash函数的运算太快了,虽然加盐让......
  • 头歌—衍生密码体制
    #第1关:Rabin密码体制题目描述任务描述Rabin密码体制是RSA密码体制的一种。本关任务:使用Rabin密码体制对给定的明文进行加密。相关知识为了完成本关任务,你需要掌握:Rabin密码体制。Rabin密码体制在本关中,我们描述Rabin密码体制,假定模数n=pq不能被分解,则该类体质对于选择明......
  • keepass口令管理实践
    目录一、下载安装KeePassXC下载安装二、创建数据库三、新建密码条目一、下载安装KeePassXC下载老师给的参考文件主要针对Windows系统,因为我用的是MacOS系统,所以我查阅资料,最终选择下载KeepassXC。GettingKeePass-Downloads下拉找到KeePassXC(forLinux/MacOS)安装二、......
  • 云技术分享 | EC2 之 Windows 忘记密码(二)
    01场景描述紧接上一篇文章《EC2之Windows忘记密码(一)》,本文将介绍解决的第三种方法——磁盘挂载。亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将......
  • 手把手教你isPalindrome 方法在密码验证中的应用
    在信息安全领域中,密码验证是一个极为重要的组成部分。一个强密码应具备足够的复杂性,以免遭到破解。而回文密码是一种具备特殊性质的密码,其正序和倒序相同,因此具有极高的安全性,并能发挥重要作用。在实际密码策略中,我们可以使用回文判断算法中的isPalindrome来验证用户输入的密码是......
  • 云技术分享 | EC2 之 Windows 忘记密码(一)
    01场景描述在AmazonWindowsEC2云主机中,如果忘记密码,该如何去修改密码或者连接实例呢?亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开......
  • 【Django】加密 settings.py文件中的数据库密码
    1.使用fromcryptography.fernetimportFernet第三方库pip3installcryptography2.Fernet的使用fromcryptography.fernetimportFernet#生成加密密钥key=Fernet.generate_key()#创建Fernet对象fernet=Fernet(key)#要加密的原始数据message=b"Hell......
  • ansible设置用户密码
    用ansible设置用户的密码时,由于需要对传输的密码进行加密,所以要在主机安装python的passlib库。利用pip安装passlib:pipinstallpasslib生成的经过加密的密码(sha512加密算法),说明:在Password后输入我们的密码"xxxxx",然后再按enter键 pipinstallpasslibpyth......
  • 【业务安全实战演练】密码找回模块测试08
    一、验证码客户端回显测试典型场景:任意用户登录使用验证码的场景:人机验证:防止机器操作,爆破表单。唯一凭据:唯一性判断,任意账户登录。​找回密码测试中要注意验证码是否会回显在响应中,有些网站程序会选择将验证码回显在响应中,来判断用户输入的验证码是否和响应中的......
  • 密码学家晚餐问题(n>2情况)
    密码学家晚餐问题场景描述三位密码学家(Alice、Bob、Carol)正在享受晚餐,坐在他们钟爱的三星级餐馆。业务逻辑在准备支付账单时,侍者通知他们需要匿名支付,其中一个密码学家可能正在支付账单。账单可能已经由美国国家安全局(NSA)支付。他们互相尊重匿名支付的权利,但又需要确认是否是N......