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

192 篇文章 62 订阅
11 篇文章 9 订阅

本文档对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-132PBKDF
  • 基于口令的加密方案,用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:杂凑函数的输出字节长度。

口令的选择建议参考如下文档。

  1. 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

输入参数:

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

内部参数:

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

返回数据:

  1. 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

输入参数:

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

内部参数:

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

返回数据:

  1. DK:导出密钥。

执行步骤:

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

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

h = \left \lceil dkLen/hLen \right \rceil

r = dkLen -(l-1)hlen

(即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 = TiUj

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

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

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的加密算法

输入参数:

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

内部参数:

  1. ENC-CBC:加密函数CBC模式(如AES-ENC-CBC)。

返回数据:

  1. 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的解密算法

输入参数:

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

内部参数:

  1. DEC-CBC:解密函数CBC模式(如AES-DEC-CBC)。

返回数据:

  1. 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的加密算法

输入参数:

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

内部参数:

  1. dkLen:导出密钥DK的字节长度。

返回数据:

  1. 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的解密算法

输入参数:

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

内部参数:

  1. dkLen:导出密钥DK的字节长度。

返回数据:

  1. 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的加密算法

输入参数:

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

内部参数:

  1. MAC:HMAC-SHA1或HMAC-SHA2。

返回数据:

  1. 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的加密算法

输入参数:

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

内部参数:

  1. MAC:HMAC-SHA1或HMAC-SHA2。

返回数据:

  1. ret:TRUE为验证通过,FALSE为验证失败。

执行步骤:

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

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

步骤3:比较T1和T,两者相同则返回ret = TRUE,否则返回ret = FALSE。

When parties share a secret symmetric key (e.g., upon a successful execution of a key- establishment scheme as specified in [1] and [2]), it is often the case that additional keys will be needed (e.g. as described in [3]). Separate keys may be needed for different cryptographic purposes – for example, one key may be required for an encryption algorithm, while another key is intended for use by an integrity protection algorithm, such as a message authentication code. At other times, the distinct keys required by multiple entities may be generated by a trusted party from a single master key. Key derivation functions are used to derive such keys. 2. Scope and Purpose This Recommendation specifies several families of key derivation functions that use pseudorandom functions. These key derivation functions can be used to derive additional keys from a key that has been established through an automated key-establishment scheme (e.g. as defined in [1] and [2]), or from a pre-shared key (e.g., a manually distributed key). Effectively, the key derivation functions specified in this Recommendation provide the key expansion functionality described in [4], where key derivation is portrayed as a process that potentially requires two separate steps: 1) randomness extraction (to obtain an initial key) and 2) key expansion (to produce additional keys from that initial key and other data). Note that the key-agreement schemes specified in [1] and [2] already incorporate the use of a (hash-based) key derivation function. If the key used as an input to one of the key derivation functions specified in this Recommendation has been established by using one of those key-agreement schemes, then, for all intents and purposes, that key has been obtained by employing one of the key derivation functions defined in [1] and [2] as a randomness extractor.
### 回答1: Capl编程是一种用于控制通讯总线的脚本语言。在使用Capl编程实现积分算法时,我们可以按照以下步骤进行: 第一步,定义变量:我们需要定义一个变量来存储积分结果。可以使用浮点型或整型来存储积分值,根据实际需求选择适的数据类型。同时,我们还需要定义一个变量来记录时间间隔,用于计算积分的时间差。 第二步,初始化:在程序开始时,我们需要将积分变量初始化为0,并设定时间间隔。 第三步,数据处理:在每个周期内,我们可以从总线上获取到相应的数据,并进行处理。对于积分算法,我们需要将获取的数据乘以时间间隔,得到面积,并将其累加到积分变量中。 第四步,输出结果:根据需要,我们可以在程序中定义输出结果的方式,例如将积分结果输出到日志文件中或发送到特定设备。 第五步,更新时间间隔:如果在积分过程中需要动态调整时间间隔,我们可以根据实际情况更新时间间隔的值。 第六步,结束:在程序结束时,我们可以将积分结果保存或进行后续处理。 总而言之,使用Capl编程实现积分算法需要定义变量、初始化、数据处理、输出结果、更新时间间隔和结束等步骤。通过这些步骤,我们可以在Capl脚本中实现积分算法,并根据实际需求对结果进行处理。 ### 回答2: CAPL编程是一种用于AUTOSAR架构的嵌入式系统开发的专用编程语言。积分算法用于计算连续函数的积分结果。在CAPL编程中,可以使用循环结构和变量操作来实现积分算法。 首先,需要定义一个函数,用来表示被积函数,例如f(x)。然后,定义一个变量,用于存储积分结果。假设此变量为sum。 接下来,采用循环结构对被积函数进行积分运算。可以使用for循环或while循环。循环的开始和结束条件可以根据积分的范围进行设定。 在每一次循环中,需要计算被积函数在当前x值处的积分值,并累加到sum变量中。这里可以使用数值计算方法,如梯形法则或辛普森法则等。具体计算方法可以根据实际需求进行选择。 循环结束后,sum变量存储的值即为积分结果。 需要注意的是,CAPL编程中的数据类型和运算符对于积分算法的实现也非常重要。在选择变量类型时,需要确保其能够存储积分结果的精度要求。在进行数值计算时,需要注意运算符的优先级和运算顺序,以避免计算错误。 综上所述,通过在CAPL编程中使用循环结构和变量操作,可以很容易地实现积分算法。希望以上回答能对您有所帮助。 ### 回答3: CAPL(通用自动化系统试验语言)是一种脚本编程语言,用于在汽车测试和诊断环境中编写测试脚本和控制脚本。下面是一种实现积分算法的CAPL编程方法。 首先,我们需要在CAPL脚本中定义一个变量来存储积分结果。可以使用一个整数或浮点数类型的变量来存储积分结果。 接下来,我们需要使用一个循环来实现积分算法。可以使用一个for循环,将积分的范围分成多个小的时间间隔,并在每个时间间隔内进行积分运算。 在每个时间间隔内,我们可以通过乘以时间间隔的大小来计算该时间间隔内的积分。假设我们要对一个变量x进行积分,我们可以使用以下公式进行积分计算:积分结果 = 积分结果 + x * 时间间隔。 在CAPL脚本中,我们可以使用变量和表达式来实现上述算法。我们可以使用变量来存储积分结果,并使用循环和条件语句来控制积分的计算。 最后,在CAPL脚本中,我们可以使用输出语句将积分结果打印出来或将其存储到文件中,以便后续分析和使用。 综上所述,我们可以通过在CAPL脚本中定义变量、使用循环和条件语句,并使用表达式进行积分计算,从而实现积分算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值