cn - pkcs#1v2.1-RSA 算法标准 下载本文

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

组织: PKI论坛 (http://www.pki.com.cn)

PKCS/PKIX中文翻译计划 论坛E-mail:pki@pki.com.cn

译者: Cece

版权:本中文翻译文档版权归PKI论坛的注册用户所共有。可以用于非商业用途自由转载,但必须保留本 文档的翻译及版权信息。如用于商业目的,所得利润需用于PKI论坛的发展。

更改记录

日期 2004/01/15 修改章节 类型 C 修改描述 创建文档 修改人 Cece * 修改类型分为 C-CREATE A - ADDED M - MODIFIED D - DELETED

PKCS #1 v2.1 RSA 算法标准

RSA实验室 2002年6月14日

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

目录

目录 ..........................................................................................................................................................................................................2 1 介绍....................................................................................................................................................................................................4 2 符号....................................................................................................................................................................................................5 3 密钥类型...........................................................................................................................................................................................7 3.1 RSA 公钥 ..................................................................................................................................................................................7 3.2 RSA 私钥 ..................................................................................................................................................................................7 4 数据转换原语 ..................................................................................................................................................................................9 4.1 I2OSP..........................................................................................................................................................................................9 4.2 OS2IP..........................................................................................................................................................................................9 5 密码原语.......................................................................................................................................................................................10 5.1 加密和解密原语 ....................................................................................................................................................................10 5.1.1 RSAEP..............................................................................................................................................................................10 5.1.2 RSADP ............................................................................................................................................................................. 11 5.2 签名和验证原语 ....................................................................................................................................................................12 5.2.1 RSASP1 ............................................................................................................................................................................12 5.2.1 RSAVP1............................................................................................................................................................................13 6 方案概述.........................................................................................................................................................................................13 7 加密方案.........................................................................................................................................................................................14 7.1 RSAES-OAEP.........................................................................................................................................................................15 7.1.1 加密运算 .........................................................................................................................................................................17 7.1.2 解密运算 .........................................................................................................................................................................20 7.2 RSAES-PKCS1-V1_5 ............................................................................................................................................................21 7.2.1 加密运算 .........................................................................................................................................................................22 7.2.2 解密运算 .........................................................................................................................................................................23 8 带附属的签名方案 .......................................................................................................................................................................24 8.1 RSASSA-PSS ..........................................................................................................................................................................25 8.1.1 签名生成运算 ................................................................................................................................................................26 8.1.2 签名验证运算 ................................................................................................................................................................27 8.2 RSASSA-PKCS1-V1_5 .........................................................................................................................................................28 8.2.1 签名生成运算 ................................................................................................................................................................29 8.2.2 签名验证运算 ................................................................................................................................................................29 9 带附属的签名的编码方法..........................................................................................................................................................31 9.1 EMSA-PSS ..............................................................................................................................................................................31

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

9.1.1 编码运算 .........................................................................................................................................................................33 9.1.2 验证操作 .........................................................................................................................................................................34 9.2 EMSA-PKCS1-V1_5..............................................................................................................................................................35 A ASN.1 语法...................................................................................................................................................................................37 A.1 RSA 密钥表示.......................................................................................................................................................................37 A.1.1 RSA公钥语法................................................................................................................................................................37 A.1.2 RSA私钥语法................................................................................................................................................................37 A.2 方案标识.................................................................................................................................................................................39 A.2.1 RSAES-OAEP.................................................................................................................................................................39 A.2.2 RSAES-PKCS1-v1_5 .....................................................................................................................................................42 A.2.3 RSASSA-PSS...................................................................................................................................................................42 A.2.4 RSASSA-PKCS1-v1_5...................................................................................................................................................43 B 支撑技术 ........................................................................................................................................................................................44 B.1 散列函数 .................................................................................................................................................................................45 B.2 掩模生成函数 ........................................................................................................................................................................46 B.2.1 MGF1 ..............................................................................................................................................................................46 C ASN.1 模块 ..................................................................................................................................................................................47 D 知识产权因素 ...............................................................................................................................................................................55 E 修订历史 ........................................................................................................................................................................................56 F 参考文档 ........................................................................................................................................................................................56

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

1 介绍

这篇文档是介绍基于RSA算法[42]的公钥密码系统的实现方法的,它包括以下几个方面: ? ? ? ?

密码原语 加密方案

带附属的签名方案 密钥和方案的ASN.1描述

本文档是为计算机和通信系统的一般应用以及具有一定灵活性的系统中的一般应用所编写的。希望基于这些规范的应用标准可以适用于其它的规范。本篇文档确定要与IEEE-1363-2000 [26]标准以及ANSI X9F1 [1] 和IEEE P1363 [27]工作组当前正在开发的草拟标准兼容。

本文档是PKCS #1 V2.0[44]的后续版本,但是包含了兼容技术。 下面所列为本篇文档的组织结构: ? ? ? ?

第一部分是介绍。

第二部分是对文档中使用到的符号的定义。 第三部分详细说明了RSA公钥和私钥的类型。

第四部分和第五部分详细说明了几个原语,或者说是基本数学操作。第四部分详细说明了数据转换原语,第五部分详细说明了密码系统原语(加密——解密、签名——验证)。 ?

本文档中的第六、七和八部分涉及加密和签名的方案。第六部分是概述。连同在PKCS #1 V1.5中介绍的方法一起,第七部分定义了基于OAEP[3]的加密方案和第八部分定义了基于PSS[4][5]的带附属的签名方案。. ? ? ? ? ?

第九部分详细说明了在第八部分中定义的签名方案的编码方法。

附录A详细说明了关于在第三部分中定义的密钥以及第七、八章中的方案的ASN.1描述。 附录B详细说明了本文档用到的散列函数和掩模生成函数,包括这些技术的ASN.1描述。 附录C给出一个ASN.1模块。

附录D、E、F和G涉及知识产权问题,概述了PKCS #1的修订历史,列出了其它参考出版物和标准,提供了关于公钥密码系统标准的一般信息。

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

2 符号

c C d di

密文代表,是一个界于0~n-1之间的整数。 密文,是一个八位组串 RSA 私有幂

其它因子ri 的CRT幂,是一个满足下式的正整数:

e · di ? 1 (mod ?ri – 1)), i = 3, …, u

dP

p的CRT幂,是一个满足下式的正整数

e · dP ? 1 (mod ?p – 1))

dQ

q的CRT幂,是一个满足下式的正整数

e · dQ ? 1 (mod ?q – 1))

e

RSA公开幂

编码后的消息,是一个八位组串

(期望的) 编码消息EM 的以比特为计量单位的长度 (期望的)编码消息EM 的以八位组为计量单位的长度 两个非负整数的最大公约数 哈希函数

散列函数Hash的输出的以八位组为计量单位的长度 RSA合数模 n的以八位组为计量单位的长度 RSA 私钥

可选的RSAES-OAEP 标签,是一个八位组串 一系列非负整数的最小公倍数

消息代表,是一个界于0到n – 1的整数 消息,是一个八位组串 MGF的输出,是一个字节串

(期望的)掩模的以八位组为计量单位的长度 掩模生成函数

生成掩模的种子因数(seed),是一个八位组串

EM emBits emLen

GCD (. , .) Hash hLen k K L

LCM (. , … , .) m

M mask

maskLen MGF

mgfSeed

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

mLen n

消息M 的以八位组为计量单位的长度 RSA合数模, n = r1 · r2 ? … · ru , u ? 2 RSA公钥

RSA合数模 n的前两个素数因子

CRT系数,是个满足下式且小于p的正整数

q · qInv ? 1 (mod p)

(n, e) p, q qInv

ri s S

RSA合数模 n的素数因子, 包括r1 = p, r2 = q, 以及任何另外的因子 签名代表,是一个位于 0到 n – 1之间的整数 签名,是一个八位组串

EMSA-PSS 盐(salt)的以八位组为计量单位的长度

其它素数因数ri 的CRT系数, 是一个比ri 小的正整数,满足下式

r1 · r2 · … · ri–1 · ti ? 1 (mod ri) , i = 3, …, u

sLen ti

u x X

?

?

RSA合数模的素数因子的个数, u ? 2 一个非负整数

与x 对应的一个八位组串 (指定的)八位组串X 的长度

一个八位组或八位组串的十六进制表示法的标志;“0x48” 表示十六进制值为48的字节; “(0x)48 09 0e” 表示三个连续的字节,它们的十六进制值分别为48, 09, 和0e LCM (r1 – 1, r2 – 1, … , ru – 1) 两个八位组串的位异或操作

取整函数;?x??是一个大于或等于实数x 的最小整数。 或操作

同余符号;a ? b (mod n) 表示能用整数n整除整数a – b

xLen 0x

?(n) ? ? . ???|| ?

注释:CRT既可以用于递归方式,也可以用于非递归方式。在本篇文档中使用了在Garner算法[22]之后的一种递归方式。请参看0节中的注释1。

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

3 密钥类型

在本篇文档定义的原语和方案中,使用了两种密钥类型:RSA公钥和RSA私钥。RSA公钥和RSA私钥一起构成一个RSA密钥对。

本篇规范支持所谓的“多素数”RSA,这种RSA的合数模可能由两个以上的素数因子构成。多素数RSA的优点在于,当使用CRT(中国余数定理),它就能减少解密和签名原语的计算开销。这在单处理器平台上能获得更好的性能,但是在多处理器平台上不一定,在多处理器平台上可以并行处理合数模的幂运算。

至于多素数如何影响RSA密码系统的安全性,请读者参考[49]。

3.1 RSA 公钥

为了这篇文档起见,一个RSA公钥由两部分构成:

n e

RSA合数模,是一个正整数 RSA公开幂,是一个正整数

在一个有效的RSA公钥中,RSA合数模n是由u 个不同的奇素数ri生成的,i = 1, 2, …, u, 其中u ? 2,而RSA公开幂e是一个位于3~n – 1之间的整数,满足GCD (e, ?(n)) = 1,其中?(n) = LCM (r1 – 1, …, ru – 1)。按照惯例,通常用p 和q分别合数模的前两个素数因子r1 和r2。

在设备之间互换RSA公钥的一个推荐描述在附录0中给出;设备中的内部表示可能不同。

3.2 RSA 私钥

为了本篇文档起见,一个RSA私钥可以采取两种表示法中的任何一个。 1. 第一种表示法由一对整数(n, d)构成,各部分的意义如下:

n

RSA合数模,是一个正整数 RSA私有幂,是一个正整数

d

2. 第二种表示法由一个五元组(p, q, dP, dQ, qInv)和一系列(可能为空)三元组 (ri, di, ti) i = 3, …, u构成,三元组的每个素数不出现在五元组中,各部分的意义如下:

p q

第一个因子,是一个正整数

第二个因子,是一个正整数

第一个因子的CRT幂,是一个正整数

dP

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

dQ qInv ri di

第二个因子的CRT幂,是一个正整数 (第一个)CRT系数,是一个正整数 第i个因子,,是一个正整数

第i个因子的 CRT幂,是一个正整数 第i个因子的 CRT系数,是一个正整数

ti

当采用第一种表示法表示时,有效的RSA私钥的RSA合数模 n与对应的RSA公钥的RSA合数模n一样,是由u个不同的奇素数ri 产生的,i = 1, 2, …, u, 其中u ? 2。RSA私有幂 d是一个小于n的正整数,满足

e · d ? 1 (mod ?(n)) ,

其中e是对应的RSA公开幂,?(n)和第3.1中定义的一样。

当用第二种表示法表示时,RSA私钥的两个因素p 和q是RSA合数模 n前两个素数(也就是 r1 和 r2),CRT幂 dP 和dQ是小于p 和q的正整数,分别满足

e · dP ? 1 (mod ?p – 1)) e · dQ ? 1 (mod ?q – 1)) ,

CRT系数qInv是一个小于p的正整数,满足

q · qInv ? 1 (mod p) 。

如果u > 2,表示法中将包括一个或多个三元组 (ri, di, ti), i = 3, …, u。因子ri是RSA合数模 n的一个其它素数因子。每一个CRT幂 di (i = 3, …, u),满足

e · di ? 1 (mod (ri – 1)) 。

每个CRT系数ti (i = 3, …, u)是一个小于ri的正整数,满足

Ri · ti ? 1 (mod ri) ,

其中Ri = r1 · ri–1。 r2 · … ·

在设备之间互换的RSA私钥的推荐描述(包括两种表示法的组成部分)在附录0中给出;设备的内部表示可能不同。

注释: 1.

这里CRT系数的定义以及第5部分的原语中使用到的程式遵循Garner算法[22](也可参见[37]的算法14.71)。然而,为了与PKCS #1 v2.0及之前版本中的RSA私钥表示法兼容,p 和q 的角色被保留了,这与其它素数不一样。因此,第一个CRT系数qInv被定义成是q mod p的倒数(inverse),而不是r1 mod r2的倒数(也就是p mod q的倒数)。 2.

Quisquater 和Couvreur [40] 注意到在RSA运算中使用中国剩余定理的优点。

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

4 数据转换原语

本篇文档所定义的模式中使用了两个数据转换原语: ? ?

I2OSP – 整数到字节串的转换原语 OS2IP – 字节串到整数的转换原语

为了本篇文档起见,也为了与ASN.1语法一致,一个八位组串是指一个有顺序的八位组(八位比特构成一个字节)序列。整个序列从第一位(通常是最左边的一位)到最后一位(最右边的一位)编入索引。为了转换为整数以及转换整数,在接下来的转换原语中第一个八位组被认为是最重要的。

4.1 I2OSP

I2OSP把一个非负整数转换为一个长度指定的字节串。 I2OSP (x, xLen) 输入: 输出:

x

待转换的非负整数

xLen 转换后的八位组串的期望长度 X

对应的长度为xLen 的八位组串

错误信息: “整数太大” 步骤:

1. 如果 x ? 256xLen,输出“整数太大”然后终止。 2. 用以256为基数的xLen位数表示整数x :

x = xxLen–1 256xLen–1 + xxLen–2 256xLen–2 + … + x1 256 + x0 ,

其中 0 ? xi < 256 (注意如果x小于256xLen–1,一个或多个高位将为零)。 3. 使字节 Xi 的整数值为xxLen–I , 1 ? I ? xLen。输出八位组串

X = X1 X2 … XxLen。

4.2 OS2IP

OS2IP 将一个八位组串转换成一个非负整数。 OS2IP (X) 输入: 输出:

X 待转换的八位组串 x 相应的非负整数

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

步骤:

1. 使 X1 X2 … XxLen 分别为X 的第一个至最后一个八位组,使 xxLen–i 的值为八位组Xi 的整数值,1 ?

i ? xLen。

2. 让 x = xxLen–1 256xLen–1 + xxLen–2 256xLen–2 + … + x1 256 + x0。 3. 输出x。

5 密码原语

密码原语是基本的数学运算,在此基础上形成密码方案。人们打算以硬件或软件模块的形式实现它们,而且不打算提供撇开方案的安全。

在本篇文档中定义了四类原语,以配对的方式组织:加密和解密;签名和验证。 原语规范假定输入满足一定的条件,特别地假设RSA公钥和私钥有效。

5.1 加密和解密原语

加密原语在公钥的控制下从消息代表产生出密文代表,解密原语在对应私钥的控制下从密文代表中恢复消息代表。

在本篇文档定义的加密方案中使用了一对加密和解密原语,被描述为:RSAEP/RSADP 。RSAEP和RSAEP涉及相同的数学运算,只是输入的密钥不同。

这里定义的原语和在IEEE Std 1363-2000 [26]中定义的IFEP-RSA/IFDP-RSA一样(除了增加了对多原语RSA的支持之外),而且与PKCS #1 v1.5兼容。

在每个原语中主要的数学运算是幂运算。

5.1.1 RSAEP

RSAEP ((n, e), m) 输入: 输出:

(n, e) m c

RSA 公钥

消息代表, 是一个位于0~ n – 1之间的整数 密文代表, 是一个位于0~ n – 1之间的整数

错误提示: “消息代表超出范围” 假设: 步骤:

RSA 公钥(n, e)有效

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

1. 如果消息代表m 不在0 ~n – 1之间, 输出“消息代表超出范围”并终止。 2. 让c = me mod n。 3. 输出c。

5.1.2 RSADP

RSADP (K, c) 输入:

K

RSA私钥,其中K采用以下形式中的一种: ? 一对(n, d)

? 一个五元组 (p, q, dP, dQ, qInv)和 一系列可能为空的三元组 (ri, di, ti), i =

3, …, u

输出: 出错提示: 假设: 步骤:

1. 如果密文代表c 不在0 ~n – 1的范围之内, 则输出“密文代表超出范围”然后终止。 2. 消息代表m 按照以下步骤计算。

a.

如果K采用第一种形式(n, d), 使m = c mod n。

d

c m

密文代表,是一个位于0 ~n – 1之间的整数 消息代表,是一个位于0 ~n – 1之间的整数

“密文代表超出范围” RSA 私钥K 有效

b. 如果K采用第二种形式(p, q, dP, dQ, qInv)和 (ri, di, ti), 则按照以下步骤进行:

i. ii. iii. iv. v.

使m1 = cdP mod p ,m2 = cdQ mod q。 如果u > 2, 使 mi = cdi mod ri, i = 3, …, u。 使h = (m1 – m2) · qInv mod p。 使 m = m2 + q · h。

如果u > 2,使R = r1 , 令i = 3 然后循环做以下各步骤,直至i= u

1. 使R = R · ri–1

2. 使h = (mi – m) · ti (mod ri) 3. 使m = m + R · h 4. 使i=i+1

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

3. 输出m。

注释:如果保留了p和q的定义,步骤2.a可以写成单个循环。然而,为了与PKCS #1 v2.0兼容,前两个素数p和q与其它素数分开处理。

5.2 签名和验证原语

签名原语在私钥的控制下从消息代表产生一个签名代表,而验证原语是在对应公钥的控制下从签名代表恢复出消息代表。本篇文档定义的签名方案中使用了一对签名和验证原语,被描述为: RSASP1/RSAVP1。

这里定义的原语与IEEE 1363-2000 [26]中定义的IFSP-RSA1/IFVP-RSA1是一样的(所不同的是这里的原语增加了对多原语RSA的支持),而且与PKCS #1 v1.5兼容。

在每个原语中的主要数学操作是幂操作,这一点和0部分中的加密和解密原语一样。RSASP1和RSAVP1与RSADP和RSAEP除了输入和输出参数的名称不一样之外,其它各方面都一样;它们的区别在于它们是为不同的目的而编写的。

5.2.1 RSASP1

RSASP1 (K, m) 输入:

K

RSA私钥, 这里K具有以下形式之一: ? 一对(n, d)

? 一个五元组(p, q, dP, dQ, qInv)和一系列可能为空的三元组(ri, di, ti), i = 3, …, u

输出: 出错提示: 假设: 步骤:

1. 如果消息代表m 不在0 ~n – 1之间,输出“消息代表超出范围” 然后终止运算。 2. 签名代表s由以下步骤计算得出。

a. 如果K采用第一种形式(n, d), 使s = m mod n。

b. 如果K采用第二种形式(p, q, dP, dQ, qInv)和 (ri, di, ti),则按照以下步骤进行:

i. 使s1 = mdP mod p ,s2 = mdQ mod q。

d

m s

消息代表,是一个位于0~ n – 1之间的整数 签名代表,是一个位于0~ n – 1之间的整数

“消息代表超出范围” RSA 私钥K有效的

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

ii. 如果u > 2,让si = mdi mod ri, i = 3, …, u。 iii. 让h = (s1 – s2) · qInv mod p. iv. 让s = s2 + q · h.

v. 如果u > 2, 让R = r1 ,i = 3 ,然后循环进行以下各步骤直至i = u

1. 让R = R · ri–1.

2. 让h = (si – s) · ti (mod ri). 3. 让s = s + R · h 4. 让i = i+1

3. 输出s。

注释:如果保留了p和q的定义,步骤2.a还可以写成单个循环。然而,为了与PKCS #1 v2.0兼容,前两个素数p和q与其它素数分开处理。

5.2.1 RSAVP1

RSAVP1 ((n, e), s) 输入: 输出: 出错提示:

(n, e) s m

RSA 公钥

签名代表, 是一个位于0~ n – 1之间的整数 消息代表, 是一个位于0~ n – 1之间的整数

“签名代表超出范围” RSA 公钥(n, e) 有效

假设:

步骤:

1. 如果签名代表s 不在范围0 ~n – 1之间,,输出“签名代表超出范围”然后终止运算。 2. 让m = se mod n。 3. 输出m。

6 方案概述

方案结合了密码原语和其它技术以获得特定的安全目标。在本篇文档种定义了两类方案:加密方案和带附属的签名方案。

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

本篇文档种定义的方案适用于有限的范围,它们的操作只是由几个使用RSA公钥或私钥处理数据的步骤构成,不包括获得密钥或者证实密钥的步骤。因此,一个典型的应用除了包括方案中的操作之外,还应包括密钥管理操作(通过该操作双方可以为一次方案操作选择RSA公钥和私钥)。这些具体的额外操作以及其它细节超出了本篇文档的讨论范围。

根据密码原语(见第0部分),方案操作规范假定输入满足一定的条件,特别是满足RSA公钥和私钥均有效。因此,如果密钥无效,则不规定设备行为。这种不规定行为的影响依赖于实际应用。声明密钥有效的包括通过申请明确密钥有效;在公钥基础架构内密钥的有效性;使密钥生成方承担使用有效密钥进行操作的责任。

一个大体上好的密码实现是将一对给定的RSA密钥对只用于一个方案。这样就避免使一个方案的漏洞连累其它方案的安全性,这一点对维持可证实的安全性可能是至关重要的。尽管RSAES-PKCS1-v1_5 (见0部分)和RSASSA-PKCS1-v1_5 (见0部分)一贯被结合在一起使用,且相互之间没有任何已知的不好的影响(实际上,这就是PKCS #1 v1.5介绍的方案),在新应用中不推崇这种结合使用一个RSA密钥对的做法。

为了说明在多个方案中使用一个RSA密钥对的风险,我们假定RSAES-OAEP (见 0部分) 和RSAES-PKCS1-v1_5中使用同一个RSA密钥对。尽管RSAES-OAEP自身具备抗攻击性,但对手可以利用RSAES-PKCS1-v1_5实现中的一个漏洞恢复出用两个方案中任何一个方案加密的消息。再举另外一个例子,假设RSASSA-PSS (见 0部分)和 RSASSA-PKCS1-v1_5中使用同一个RSA密钥对。如果对RSASSA-PSS的安全坚固性没有考虑到签名可以由另一个方案生成的可能性,那么这种坚固性将不再充分。如果一个RSA密钥对被用于这里定义的方案中的任何一个,而且也被用于其它地方定义的方案,那么可能需要作出同样的考虑。

7 加密方案

就本篇文档而言,一个加密方案由一个加密操作和一个解密操作构成,其中加密操作使用接受方的RSA公钥把消息转化成密文,而解密操作使用接受方对应的RSA私钥将密文恢复成消息。

一个加密方案能用于各种应用中。一个典型的应用是密钥建立协议,在该协议的消息中包含将被秘密地从一方递送到另一方的密钥。举例来说,PKCS #7 [45]使用这种协议将一个内容的加密密钥从发送方递送到接收方;这里定义的加密方案将会是适合于上述情况的密钥加密算法。

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

在本篇文档中定义了两个加密方案:RSAES-OAEP 和RSAES-PKCS1-v1_5。 RSAES-OAEP是新应用的推荐标准;加入RSAES-PKCS1-v1_5只是为了与已存在的应用兼容,并且不建议用于新应用。

这里给出的加密方案遵循一般的模型,这个模型类似于在IEEE Std 1363-2000 [26]中使用到的模型,就是将加密和解密原语与针对加密的编码方法结合起来。这种加密运算对消息进行消息编码运算,以产生一个编码消息,然后将编码后的消息转换成一个整数消息代表。一个加密原语作用于这个消息代表从而产生密文。反之,解密运算将解密原语作用于密文,从而恢复出消息代表,然后将这个消息代表转换成一个以八位组串为形式的编码消息。一个消息解码操作作用于这个编码消息,从而恢复出消息并验证解密运算的正确性。

为了避免与这种方式相关的实现漏洞,在解码运算中会处理错误(参见[6]和[36]),RSAES-OAEP 和RSAES-PKCS1-v1_5的编码和解码运算嵌入在各自的加密方案规范中,而不是定义在单独的规范中。两个加密方案均与PKCS #1 v2.0中的相应方案兼容。

7.1 RSAES-OAEP

RSAES-OAEP将RSAEP 和RSADP原语(参见0和0部分)与EME-OAEP编码方法结合起来(参见0中的步骤1.b和错误!未找到引用源。中的步骤3)。EME-OAEP基于Bellare 和Rogaway的最佳非对称加密scheme[3]。(OAEP代表“最佳非对称加密填充”)。它与在IEEE Std 1363-2000 [26]中定义的IFES方案兼容,在IFES中加密和解密原语是IFEP-RSA和IFDP-RSA,消息编码方法是EME-OAEP。RSAES-OAEP能够操作长度超过k – 2hLen – 2字节的消息,这里hLen是基础散列函数输出的长度,而k是接收方RSA合数模的以八位组为计量单位的长度。

假设计算eth roots modulo n是不可行的,且RSAES-OAEP中的掩模生成函数具有固有的属性;那么RSAES-OAEP语义上能抵抗适合的选择密文攻击。如果掩模生成函数被看作是一个黑盒子或者是一个随机的启示程序,那么在攻破RSAES-OAEP的难度能直接与使RSA函数反向的难度相关的意义上,这个保证是可证实的;进一步的讨论参见[21]和下面的注释。

RSAES-OAEP加密和解密运算都将标签L作为输入。在PKCS #1的这个版本中,L是一个空串,这个标签的其它使用超出了本篇文档的范围。相关的ASN.1语法描述参见附录A.2.1。

通过散列函数和掩模生成函数的选择以确定RSAES-OAEP的参数。这一选择过程对给定的RSA密钥是固定不变的。在附录B中给出了建议的散列函数和掩模生成函数。

注释:近来的结果对澄清OAEP编码方式[3]的安全性[3]有帮助(0部分中的步骤1.b对这个过程作了粗略的描述)。其背景如下所述。1994年,Bellare 和 Rogaway[3]引入了一个安全概念,他们表述为明文意识(PA94)。他们证明如果一个公钥

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

加密原语(例如RSAEP)没有私钥就难以倒转,那么对应的基于OAEP的加密方案就是有明文意识的(in the random oracle model),大致的意思是对手在没有真正知道基础明文情况下是不能产生出合法的密文的。一个加密方案的明文意识与反密文选择攻击的方案的限制有密切联系。在这种攻击中,对手有机会发送询问给一个模仿解密原语的启示程序。使用这些询问的结果,对手尝试解密一个密文。

然而,存在两类密文选择攻击,而PA94只包含了针对其中一种攻击的安全性。不同之处在于对手在获得challenge密文之后,可以做些什么事情。在对手获得challenge密文后,indifferent攻击方案(CCA1所表示的)不允许向解密启示程序提出任何询问,而adaptive方案(CCA2中有表示)允许(除了解密启示程序在其被发布之后拒绝解密challenge密文的情况)。1998年Bellare 和Rogaway与Desai 和Pointcheval[2]一道提出了一个新的更健壮的明文意识观念(PA98),它提出了针对CCA2的安全性。

总的说来,存在两个错误观念的潜在来源:PA94和 PA98是相同的概念; 或者CCA1 和CCA2 是相同的概念。任何一个假设都会得出一个结论,那就是Bellare-Rogaway的论文提出针对CCA2的OAEP安全性,而实际上它并没有提出针对CCA2的OAEP安全性。1 OAEP从未被证明对CCA2来说是安全的;事实上,Victor Shoup[48]已经证实这种验证并不存在于一般的情况中。简单地说,Shoup指出CCA2方案中的对手知道如何使加密原语部分反向,但不知道如何使它完全反向,这个对手也能攻破这个方案。举例来说,一个人可以想象如果攻击者知道如何恢复用RSAEP加密的一个随机整数的所有子节而不是前20个字节,那么她就能够攻破RSAES-OAEP。这样的攻击者不需要将RSAEP完全反向,因为在她的攻击过程中不需要使用前20个八位组。

同样地,RSAES-OAEP对于CCA2来说是安全的,就在Shoup宣布他的结果之后不久,这一点就被Fujisaki、 Okamoto、 Pointcheval和 Stern [21]证明了。假如能知道pre-image的足够大的一部分,使用聪明的网点缩小技术(clever lattice reduction techniques),他们能设法说明如何使RSAEP完全反向。这个观察结合了一个验证,那就是如果基础的加密原语难以被部分反向,那么OAEP对CCA2来说是安全的;这个观察填补了Bellare和Rogaway所证明的关于RSAES-OAEP的事实和某人认为他们证实的事实之间的缺口。我们就这样被RSAEP的公开弱点挽救了(也就是说,全部反向可以从部分反向中演绎出来),这有些自相矛盾。

然而不幸的是,降低安全对于具体的参数并不有效。尽管这个验证成功地将RSAES-OAEP的CCA2安全性的对手A与反向RSA的算法I关联起来,I成功的概率仅近似于? / 2,其中?是?成功的概率。另外,I的运行时间大约是t,其中t是对手的操作时间。结果是我们不能排除攻击RSAES-OAEP比用具体参数反向RSA容易得多的可能性。安全验证的存在仍然提供了一些保证,那就是RSAES-OAEP结构比ad hoc结构(诸如RSAES-PKCS1-v1_5)合理。

Hybrid加密方案基于RSA-KEM密钥封装范例,并提供严密的安全性验证,能直接应用于具体参数;详情见[30]。PKCS #1的后续版本可以定义基于这个范例的方案。

2

18

2

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

1

PKCS #1 v2.0引用了[3]并且声称“在没有明确明文意识或选择密文攻击类型的情况下,选择密文攻击对于有

明文意识的加密方案,像RSAES-OAEP,来说是无效的”。

2

在 [21]中,反向成功的概率是?2 / 4。其它因子1 / 216 取决于编码消息EM的开头八个固定的零比特,这在[21]中考虑的

OAEP变化中没有出现。(我必须两次应用A来反向RSA,且每个应用程序与因子1 / 28相应)

7.1.1 加密运算

RSAES-OAEP-ENCRYPT ((n, e), M, L) 可选项: 输入: 输出: 出错提示: 假设: 步骤:

1. 长度检查:

a. 如果L 的长度超出哈希函数的输入限制 (SHA-1的限制是261 – 1 个八位组), 输出“标

签太长”然后终止运算。

b. 如果mLen > k – 2hLen – 2,输出“消息太长”然后终止运算。

2. EME-OAEP 编码(见 错误!未找到引用源。):

a. 如果没有提供标签L, 则让L为空串。 让 lHash = Hash (L), 这是一个长度为hLen 的

八位组串(见下面的注释)。

b. 生成一个由k – mLen – 2hLen – 2个零值八元组构成的串PS。 PS的长度可能是零。 c. 连接lHash,PS,十六进制值为0x01的八元组和消息M ,形成一个长度为k – hLen – 1个

八位组的数据块DB :

DB = lHash || PS || 0x01 || M 。

d. 生成一个长度为hLen 的随机八位组串seed 。 e. 使dbMask = MGF (seed, k – hLen – 1) f. 使maskedDB = DB ? dbMask.

PKCS/PKIX中文翻译计划

Hash MGF (n, e) M L C

哈希函数(hLen 表示散列函数输出的以八位组为计量单位的长度) 掩模生成函数

接收方的RSA 公钥(k 表示RSA合数模 n 的以八位组为计量单位的长度) 待加密的消息,是一个长度为mLen 的八位组串,其中 mLen ? k – 2hLen – 2 消息的可选附加标签;如果没有提供L,那么L 的默认值是空串 密文,一个长度为k 的八位组串

“消息太长”;“标签太长” RSA公钥(n, e) 是有效的

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

g. 使 seedMask = MGF (maskedDB, hLen). h. 使maskedSeed = seed ? seedMask.

i. 连接一个十六进制值为0x00的八位组, maskedSeed和 maskedDB ,形成一个长度为k 个

八位组的编码消息EM

EM = 0x00 || maskedSeed || maskedDB。

3. RSA加密:

a. 将编码消息EM转换成一个整数消息代表(见4.2部分):

m = OS2IP (EM) 。

b. 将RSA公钥(n, e) 和消息代表m代入RSAEP加密原语(5.1.1部分),产生一个整数的密

文代表c :

c = RSAEP ((n, e), m) 。

c. 将密文代表c转换为一个长度为k个八元组的密文C (见4.1部分):

C = I2OSP (c, k) 。

4. 输出密文 C。

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

a DB = lHash PS M seed ’ 00 MGF ’ MGF EM = 00 maskedSeed maskedDB 图1:EME-OAEP 编码运算。lHash是可选标签L的散列。解码运算按照相反的步骤进行,从而恢复出M并且验证lHash和PS。

注释:如果L是空串,相应的散列值lHash具有下列十六进制值代表哈希函数的不同选择。

SHA-1: SHA-256: SHA-384:

(0x)da39a3ee 5e6b4b0d 3255bfef 95601890 afd80709

(0x)e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855 (0x)38b060a7 51ac9638 4cd9327e b1b1e36a 21fdb711 14be0743 4c0cc7bf 63f6e1da

274edebf e76f65fb d51ad2f1 4898b95b

(0x)cf83e135 7eefb8bd f1542850 d66d8007 d620e405 0b5715dc 83f4a921 d36ce9ce

SHA-512:

47d0d13c 5d85f2b0 ff8318d2 877eec2f 63b931bd 47417a81 a538327a f927da3e

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

7.1.2 解密运算

RSAES-OAEP-DECRYPT (K, C, L) 选项: 输入: 输出:

Hash

散列函数哈希(hLen 表示散列函数的输出的以八位组为计量单位的长度)

MGF 掩模生成函数 K C L M

接受方的RSA私钥(k表示RSA合数模n的以八位组为计量单位的长度) 待解密的密文,使一个长度为k的八位组串,其中k ≥ 2hLen + 2

可选标签,其与消息的联系将得到验证;如果没有提供L值,则L的默认值为空串。 消息,是一个长度为mLen的八位组串,其中mLen ? k – 2hLen – 2

错误提示: “解密出错” 步骤:

1. 长度检查:

a. 如果L的长度大于散列函数的输入限制(SHA-1的限制是261 – 1个八位组),输出“解密

出错”并中止运算。

b. 如果密文C的长度不是k个八位组,则输出“解密出错”并中止运算。 c. 如果k < 2hLen + 2,则输出“解密出错”并中止运算。

2. RSA 解密:

a. 将密文C转换成一个整数密文代表c(见0部分):

c = OS2IP (C) 。

b. 将RSA私钥K和密文代表c代入RSADP解密原语(见0部分),从而产生一个整数消息

代表m:

m = RSADP (K, c) 。

如果RSADP输出“密文代表超出范围”(意思是c ? n),则输出“解密出错”并且中止运算。

c. 将消息代表m转换成一个长度为k个八位组的编码消息EM(见0部分):

EM = I2OSP (m, k) 。

3. EME-OAEP编码:

a. 如果未提供标签L的值,则使L的值为空串。使lHash = Hash (L),这是一个长度为hLen

的八位组串(见0部分的注释)。

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

b. 将编码消息EM分解为一个八位组Y,一个长度为hLen的八位组串maskedSeed,以及一个

长度为k – hLen – 1的八位组串maskedDB,使得

EM = Y || maskedSeed || maskedDB 。

c. 使seedMask = MGF (maskedDB, hLen). d. 使seed = maskedSeed ? seedMask. e. 使dbMask = MGF (seed, k – hLen – 1). f. 使DB = maskedDB ? dbMask.

g. 将DB分解成一个长度为hLen的八位组串lHash’,一个(可能为空的)由十六进制值为

0x00的八位组构成的填充PS,以及一个消息M,使得

DB = lHash’ || PS || 0x01 || M .

如果没有可以从M中分离出PS的十六进制值为0x01的八位组,如果lHash没有等同的lHash’,或者如果Y是非零的,则输出“解密出错”并中止运算。(见下面的注释)

4. 输出消息M。

注释:必须确保对手无法在步骤3.f中分辨出不同的出错条件,防止对手了解关于编码消息EM的部分信息,无论是通过出错消息或是定时,或者更一般的。否则对手可能能够获得关于密文C的解密的有用信息,进而导致像Manger发现的攻击手法一样的选择密文攻击[36]。

7.2 RSAES-PKCS1-v1_5

RSAES-PKCS1-v1_5 将RSAEP 和RSADP 原语(见0部分和0部分)与EME-PKCS1-v1_5编码方法(见0部分中的步骤1和0部分中的步骤3)结合起来。它在数学上等同于 PKCS #1 v1.5中的加密方案。尽管当加密长消息(参见下面注释的第三条以及[10],[14]中有一个改良的攻击)时,应该避免起因于Coppersmith、Franklin、 Patarin 和Reiter的低幂RSA的攻击;但RSAES-PKCS1-v1_5 能够对长度大于k – 11(k是RSA合数模的以八位组为计量单位的长度)个八位组的消息进行运算。总的来看,由于这个方案反对随机生成密钥,因此不推荐使用这个方案加密一个任意的消息。考虑到一个合理的成功可能性,即使不知道对应的明文也可能生成有效的RSAES-PKCS1-v1_5密文。这种可能性可以用于[6]中所描述的选择密文攻击。因此,如果要使用RSAES-PKCS1-v1_5,应采取某些容易实现的应对措施以阻挠[6]中描述的攻击。典型的例子包括增加待编码数据的结构,严密地检查解密后消息的PKCS #1 v1.5的一致性(以及其它冗余性),统一基于PKCS #1 v1.5的一个客户机\\服务器协议中的错误消息。这些都可以作为有效的应对

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

措施,不需要修改一个基于PKCS #1 v1.5的协议。如需获得关于上述措施和其它应对措施的进一步讨论,请参见See [7] 。近来研究表明SSL/TLS握手协议(使用RSAES-PKCS1-v1_5 和某些应对措施)[17]的安全性与不同的RSA问题有关;进一步讨论请参见[32] 。

注释:一下段落描述一些使用RSAES-PKCS1-v1_5所固有的安全建议。除了这几年间密码改进中提出的新建议之外,也包括了本篇文档的版本1.5中的建议。 ?

建议为每个加密过程独立生成0部分中的步骤2中用到的伪随机八位组,特别是在同样的数据被输入多个加密过程时。H?stad的结果[24]是提出这个建议的一个动机。 ?

0部分步骤2中的填充串PS的长度至少为八个八位组,这是公钥运算的安全条件,它使得攻击者难以通过尝试所有可能的加密块来恢复数据。 ?

当待加密的消息的大小较小,伪随机八位组也能够帮助阻碍起因于Coppersmith et al[10]的攻击(关于这个攻击的改进,参见[14])。当相似的消息用同样的RSA公钥加密,这个攻击就会作用于低幂RSA。 ?

当待加密的消息的长度保持较小,则伪随机八位组能帮助一次起因于Coppersmith et al. [10]的攻击([14]中有攻击的改进)。当使用同样的RSA公钥加密类似的消息,这个攻击对低幂RSA就奏效了。特别地,这个攻击的一个特色是,当RSAEP的两个输入构成比特的一个大小数(8/9),且使用低幂RSA(e = 3)加密它们,用这个攻击恢复这两个输入是可能的。这个攻击的另一个特色是当已知RSAEP输入的一个大分数(2/3),就能成功解密单个密文。对于典型1应用程序,待加密的消息很短(例如,一个128位的对称密钥),所以既不是需要知道足够的信息,也不是两个消息的相同点,使这次攻击得手。然而,如果加密长消息,或者如果消息的某部分已知,那么这个攻击可能是一个小玩意儿。不管怎样,RSAES-OAEP方案克服了这个攻击。

7.2.1 加密运算

RSAES-PKCS1-V1_5-ENCRYPT ((n, e), M) 输入: 输出: 出错提示: 步骤:

1. 长度检查: 如果 mLen > k – 11,输出“消息太长”然后中止运算。 2. EME-PKCS1-v1_5编码:

a. 生成一个长度为k – mLen – 3 且由伪随机生成的非零八位组构成的八位组串PS 。PS的长

度至少为八个八位组。

b. 连接PS、消息 M 和其它填充,从而形成一个长度为k个八位组的编码消息EM

(n, e) M C

接收方的RSA公钥(k表示合数模n的以八位组为计量单位的长度) 待加密的消息,是一个长度为mLen 的八位组串,其中mLen ? k – 11 密文,是一个长度为k 的八位组串

“消息太长”

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

EM = 0x00 || 0x02 || PS || 0x00 || M 。

3. RSA加密:

a. 将编码消息EM转换成一个整数消息代表m(参见4.2部分):

m = OS2IP (EM) 。

b. 将RSA公钥(n, e) 和消息代表m代入RSAEP 加密原语(参见5.1.1部分),从而产生一

个密文代表c:

c = RSAEP ((n, e), m) 。

c. 将密文代表c转换成一个长度为k个八位组的密文代表c(参见4.1部分):

C = I2OSP (c, k) 。

4. 输出密文C。

7.2.2 解密运算

RSAES-PKCS1-V1_5-DECRYPT (K, C) 输入:

K C

接收方的RSA私钥

待解密的密文,是一个长度为k的八位组串,其中k是RSA合数模n的以八位组为计量单位的长度。

输出: 出错提示: 步骤:

1. 长度检查:如果密文C的长度不是k个八位组(或者如果k < 11),则输出“解密出错”并且中止

运算。 2. RSA解密:

a. 将密文C转换成一个整数密文代表c(参见4.2部分):

c = OS2IP (C) 。

M

消息,是一个长度至少为k – 11的八位组串

“解密出错”

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

b. 将RSA私钥(n, d) 和密文代表c 代入RSADP解密原语(参见5.1.2部分),进而产生一个

整数消息代表m:

m = RSADP ((n, d), c) 。

如果RSADP输出“密文代表超出范围”(意思是c ? n),则输出“解密出错”然后中止运算。

c. 将消息代表m 转换为一个长度为k个八位组串的编码消息EM :

EM = I2OSP (m, k) 。

3. EME-PKCS1-v1_5解码:将编码消息EM 分离成一个八位组串PS (由非零八位组构成)和一个

消息M ,使满足

EM = 0x00 || 0x02 || PS || 0x00 || M 。

如果EM的第一个八位组的十六进制值不为0x00,如果EM的第二个八位组的十六进制值不为0x02,如果没有十六进制值为0x00的八位组可以从M分离出PS,或者如果PS的长度小于8个八位组,输出“解密出错”并且中止运算。 4. 输出M。

注释:必须确保对手无法在步骤3中分辨出不同的出错条件,无论是通过出错消息或是定时。否则对手可能能够获得关于解密密文C的有用信息,进而导致Bleichenbacher攻击[6]的增强版;比得上(compare to) Manger的攻击 [36]。

8 带附属的签名方案

就本篇文档而言,一个带附属的签名方案包括一个签名生成运算和一个签名验证运算,其中签名生成运算利用签名者的RSA私钥产生一个签名,而签名验证运算利用签名者对应的RSA公钥验证消息上的签名。为了验证用这种方案产生的签名,验证者必须拥有消息本身。所以说,带附属的签名方案与带消息恢复的签名方案不同,本篇文档不讨论带消息恢复的签名方案。

一个带附属的签名方案可以用于各种应用程序中。举例来说,这里定义的带附属的签名方案是适合于

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

X.509 认证[28]的签名算法。尽管由于技术原因,PKCS #7当前版本将散列函数从签名方案(这个方案与这里提到的不一样)中分离出来,但相关的签名方案可以用在PKCS #7中;更多的讨论,请参见附录A.2.3的注释。

本篇文档种定义了两种带附属的签名方案: RSASSA-PSS 和RSASSA-PKCS1-v1_5。尽管还不知道有什么攻击是针对RSASSA-PKCS1-v1_5的,但是为了提高健壮性,在新应用程序中推荐采纳RSASSA-PSS。 包含RSASSA-PKCS1-v1_5是为了与已存在的应用程序兼容,而且尽管RSASSA-PKCS1-v1_5 仍然适用于新的应用程序,但是鼓励逐步向RSASSA-PSS 转换。

这里给定的带附属的签名方案遵循一般的模型(与IEEE Std 1363-2000 [26]中使用的一样),即将签名和验证原语与针对签名的编码方法结合起来。签名生成运算对消息进行消息编码运算以产生一个编码消息,随后该编码消息将被转换成一个整数消息代表。签名原语作用于消息代表,从而产生一个签名。与此相反,签名验证运算将签名验证原语应用于签名,以恢复出消息代表,然后消息代表被转换成一个编码后的八位组串消息。验证运算作用于这个消息和编码后的消息,以判断它们俩是否一致。

如果编码方法是确定性的(例如,EMSA-PKCS1-v1_5),验证运算可以对消息进行消息编码运算,并将运算结果——编码消息与先前获得的编码消息对比。如果匹配,则签名被认为是有效的。如果编码方法是随机的(如EMSA-PSS),那么验证运算会更加复杂。举例来说,EMSA-PSS验证操作从编码后的消息中提取随即salt和一个散列输出,并检查该散列输出、salt和消息是否一致;从消息和salt方面来说,散列输出是一个确定的函数。

对于在本篇文档中定义的带附属的签名方案来说,如果签名放在消息的后面,签名生成运算和签名验证运算就像“单方传送”运算一样容易实现。至于在RSASSA-PKCS1-v1_5情况下的示例格式,请参见PKCS #7 [45]。

8.1 RSASSA-PSS

RSASSA-PSS将RSASP1和 RSAVP1原语与EMSA-PSS编码方法结合起来。它与在IEEE P1363a 草案中修订过的IFSSA方案兼容IFSSA方案,IFSSA方案中的签名和验证原语是IEEE Std 1363-2000 [26]中定义的IFSP-RSA1 和IFVP-RSA1,而消息编码方法是EMSA4。由于EMSA4是作用于比特串而不是八位组串的,所以它比EMSA-PSS更通用。当限制于运算体和散列、salt均为八位组串的情况下,EMSA-PSS等同于EMSA4。

RSASSA-PSS能够运算的消息的长度可以是不受限制的也可以受一个相当大的数的约束,这取决于EMSA-PSS编码方法基于的散列函数。

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

假设计算e roots modulo n是可行的,EMSA-PSS中的散列函数和掩模生成函数具有适当的属性,RSASSA-PSS提供安全签名。如果散列函数和掩模生成函数被看作是黑盒子或者是随机启示程序,在伪造签名的难度可以直接与使RSA函数反向的难度关联的意义上,这个保证是可证实的。安全验证的边界本质上是“紧的”,意思是对于最好的伪造者来说,成功的可能性和运行时间非常接近于最好的RSA反向算法的对应参数;进一步的讨论,请参见[4][13][31]。

与RSASSA-PKCS1-v1_5签名方案对比,EMSA-PSS编码消息中不嵌入散列函数标识,所以在理论上,对手可能用一个不同的散列函数来替换由签名者选择的散列函数。因此,建议将EMSA-PSS掩模生成函数基于同一个散列函数。以这种方式,整个编码后的消息将依赖于散列函数,而且对手将难以用一个不同的散列函数来替换由签名者选择的散列函数。匹配散列函数只是为了防止散列函数被替换,而且如果采用其他方法(例如,验证者只接受指定的散列函数)防止散列函数被替换,则不需要匹配散列函数。关于这几点的进一步讨论,请参见[34]。RSASSA-PSS的可证实的安全性不依赖于掩模生成函数中的散列函数(与应用于消息的散列函数一样)。

由于结合了随即生成salt的值,因此RSASSA-PSS与其它基于RSA的签名方案的不同之处在于它是概率性的而非确定性的。通过提供一个比确定性的可供选择方案(诸如全域散列法(FDH))更加“严密的”安全验证,Salt值增强了这个方案的安全性;参见[4]中的讨论。然而,对安全性来说随机并非关键所在。由于最后的可证实安全性与FDH[12]的相似,在随机生成不可能实现的情况下,一个固定值或者一串数字可以取代之。

th

8.1.1 签名生成运算

RSASSA-PSS-SIGN (K, M) 输入: 输出:

K M S

签名者的RSA 私钥

待签名的消息,是一个八位组串

签名,是一个长度为k 的八位组串,这里k是RSA合数模n的以八位组为计量单位的长度

出错提示: 步骤:

1. EMSA-PSS编码: 将EMSA-PSS编码运算(见9.1.1部分)应用于消息M,从而产生一个长度为

?(modBits – 1)/8?个八位组的编码消息EM,以至于整数OS2IP (EM)的比特长度至少是modBits – 1,其中modBits是RSA合数模的比特长度。

“消息太长”,“编码出错”

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

EM = EMSA-PSS-ENCODE (M, modBits – 1) 。

注意如果modBits – 1可以被8整除,那么EM的八位组长度将比k小1;否则就等于k。如果编码运算输出“消息太长”,则“消息太长”然后中止运算。如果编码运算输出“编码出错”,输出“编码出错”然后中止运算。 2. RSA签名:

a. 将编码消息EM转换成一个整数消息代表m (见4.2部分):

m = OS2IP (EM) 。

b. 将RSASP1 签名原语(见5.2.1部分)应用于RSA 私钥K 以及消息代表m ,以产生一个

整数签名代表s:

s = RSASP1 (K, m) 。

c. 将签名代表s转换成长度为k个八位组的签名S(见4.1部分):

S = I2OSP (s, k) 。

3. 输出签名代表S。

8.1.2 签名验证运算

RSASSA-PSS-VERIFY ((n, e), M, S) 输入:

(n, e) M S

签名者的RSA公钥

签名待验证的消息,是一个八位组串

待验证的签名,是一个长度为k的八位组串,其中k是RSA合数模n的八位组长度

输出: 步骤:

1. 长度检查: I如果签名S的长度不是k个八位组,则输出“无效的签名”然后中止运算。. 2. RSA验证:

a. 将签名S转换为一个整数签名代表s(见4.2部分):

s = OS2IP (S) 。

b. 将RSAVP1验证原语作用于RSA 公钥(n, e)和签名代表,从而产生一个整数消息代表m :

m = RSAVP1 ((n, e), s) 。

如果RSAVP1输出“签名代表超出范围”,则输出“有效的签名”然后中止运算。 “有效的签名”或者“无效的签名”

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

c. 将消息代表m转换成长度为emLen = ?(modBits – 1)/8?个八位组的编码消息EM,其中

modBits是RSA合数模n的比特长度(见4.1部分):

EM = I2OSP (m, emLen) 。

注意如果modBits – 1能被8整除,那么emLen将比k小1;否则emLen就等于。如果输出“整数太大”,则输出“无效的签名”然后中止运算。

3. EMSA-PSS验证: 将EMSA-PSS验证运算(见9.1.2)作用于消息M和编码消息EM,以辨别它们

是否一致:

Result = EMSA-PSS-VERIFY (M, EM, modBits – 1) .

4. 如果Result =“consistent”,则输出“有效签名”。否则,输出“无效的签名”。

8.2 RSASSA-PKCS1-v1_5

RSASSA-PKCS1-v1_5将RSASP1原语 、RSAVP1原语和EMSA-PKCS1-v1_5编码方法结合起来了。它与在IEEE Std 1363-2000 [26]中定义的IFSSA方案兼容,方案中的签名和验证原语是IFSP-RSA1和IFVP-RSA1,而消息编码方法是EMSA-PKCS1-v1_5(这在IEEE Std 1363-2000中未给出定义,但在IEEE P1363a draft草案[27]中给出定义)。

RSASSA-PKCS1-v1_5可操作的消息的长度可以是不受限制的也可以是有一个非常大的数约束的,这取决于EMSA-PKCS1-v1_5方法的所依赖的散列函数。

假设计算e roots modulo n是不可行的以及在EMSA-PKCS1-v1_5中的散列函数有适当的属性,就可以推测RSASSA-PKCS1-v1_5提供了安全签名。进一步说就是,在不知道RSA私钥的情况下伪造签名被认为是计算上不可行的。同样地,在编码方法EMSA-PKCS1-v1_5中,散列函数标识被嵌入到编码过程中。因为这个特征,对手为了找到一个与先前已签名消息具有相同签名的消息,必须找到正在使用的特殊散列函数的冲突数据;对对手来说攻击与签名者选择的散列函数不同的散列函数是无用的。进一步的讨论参见[34]。

注释:正如PKCS #1 v1.5中的注释,EMSA-PKCS1-v1_5编码方法具有保证编码消息在转换成为一个整数消息代表之后是大数而且至少是某种程度的“随机数”的特征。这一点防止了由Desmedt 和Odlyzko [16]提出的攻击,在该攻击中,通过将消息代表分解成一批具有较小值的因子(例如,一批小素数),在消息代表之间产生倍增的联系。Coron、Naccache,和Stern [15]指出这类攻击的一种增强形式可能在攻击ISO/IEC 9796-2签名方案的一些实例方面相当有效。他们也分析了这类攻击用于EMSA-PKCS1-v1_5编码方法的复杂性,并且得出结论:当一个攻击需要的运算比在基础散列函数上进行一次冲突搜索还要多(也就是说,多于280次运算),那么这个攻击就是不现实的。Coppersmith、Halevi和 Jutla [11]继续扩展 Coron et al.的攻

th

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

击,以攻破ISO/IEC 9796-1带恢复消息的签名方案。各种攻击说明了细心构造RSA签名原语的输入的重要性,特别是在带恢复消息的签名方案中。如前所说,EMSA-PKCS-v1_5编码方法明确地包含一个散列运算,并且不是为带恢复消息的签名方案所编写的。此外,尽管没有已知的攻击是针对EMSA-PKCS-v1_5编码方法的,仍旧推荐逐步转换到EMSA-PSS,作为对未来开发的预防措施。

8.2.1 签名生成运算

RSASSA-PKCS1-V1_5-SIGN (K, M)

输入:

K M S

签名者的RSA私钥

待签名的消息,是一个八位组串

签名,是一个长度为k的八位组串,其中k是RSA合数模n的八位组长度

输出: 出错提示: 步骤:

“消息太长”;“RSA合数模太短”

1. EMSA-PKCS1-v1_5编码: 对消息进行EMSA-PKCS1-v1_5编码运算(见9.2部分)以产生一个长

度为k个八位组的编码消息EM :

EM = EMSA-PKCS1-V1_5-ENCODE (M, k) 。

如果编码运算输出“消息太长”,则输出“消息太长”然后中止运算。如果编码运算输出“期望的编码消息长度太短”,则输出“RSA合数模太短”然后中止运算。 2. RSA 签名:

a. 将编码消息EM转换成一个整数消息代表m (参见4.2部分):

m = OS2IP (EM) 。

b. 将RSASP1签名原语(见5.2.1)作用于RSA私钥K和消息代表m,从而产生一个整数签

名代表s:

s = RSASP1 (K, m) 。

c. 将签名代表s转换成一个长度为k个八位组的签名S(参见4.1部分):

S = I2OSP (s, k) 。

3. 输出签名S。

8.2.2 签名验证运算

RSASSA-PKCS1-V1_5-VERIFY ((n, e), M, S)

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

输入:

(n, e) M S

签名者的RSA公钥

签名待验证的消息,是一个八位组串

待验证的签名,是一个长度为k的八位组串,其中k是RSA合数模n的八位组长度

输出: 出错提示: 步骤:

“有效签名”或者“无效签名”

“message too long”; “RSA modulus too short”“消息太长”;“RSA合数模太短”

1. 长度检查: 如果签名S的长度不是k个八位组,则输出“无效签名”然后中止运算。 2. RSA验证:

a. 将签名S转换成一个签名代表s(参见4.2部分):

s = OS2IP (S) 。

b. 将RSAVP1验证原语(参见5.2.2部分)作用于RSA公钥(n, e)和签名代表s,以产生一个

整数消息代表:

m = RSAVP1 ((n, e), s) 。

如果RSAVP1输出“签名代表超出范围”,则输出“无效签名”然后中止运算。 c. 将签名代表m转换成一个长度为k个八位组的编码消息EM’(参见0部分):

EM’ = I2OSP (m, k) 。

如果I2OSP输出“整数太长”,则输出“无效签名”然后中止运算。

3. EMSA-PKCS1-v1_5编码: 对消息M进行EMSA-PKCS1-v1_5编码运算(见0部分),从而产生另

一个长度为k个八位组编码消息EM’:

EM’ = EMSA-PKCS1-V1_5-ENCODE (M, k) .

如果编码运算输出“消息太长”,则输出“消息太长”并且中止运算。如果编码运算输出“期望的编码消息长度太短”,则输出“RSA合数模太短”然后中止运算。

4. 比较编码消息EM和另一个编码消息EM’。如果他们相同,则输出“有效签名”;否则,输出“无

效签名”。

注释。实现签名验证运算的另一个方法是对编码消息进行一次“解码”运算(在本篇文档中没有定义),以恢复基础散列值,然后将它与一个新计算的散列值比较。这样做的优点在与它需要更少的中间存储(是两个散列值而非两个编码消息),而缺点是它需要另外的代码。

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

9 带附属的签名的编码方法

编码方法由在八位组串消息和八位组串编码消息之间进行变换的运算构成,而在方案中八位组串编码消息和证书消息代表互相转换。整数消息代表是通过原语进行转换的。因此编码方法在处理消息的方案和原语之间提供了连接。

就本篇文档而言,一个带附属的签名的编码方法由一个编码操作和一个可选的验证操作组成。一个编码操作将一个消息M变换为一个规定长度的编码消息EM。一个验证运算决定一个消息M和一个编码消息EM是否一致,也就是说,编码消息EM是否是消息M的有效编码。

编码运算可能引入一些随机因素,以便对于同一个消息的进行编码运算的不同应用程序将产生不同的编码消息,这一点有利于可证实的安全性。对于这样一个编码方法,同时需要一个编码运算和一个验证运算,除非验证者能够重新产生随机因素(例如,通过从签名者那里获得salt的值)。对于确定的编码方法,只需要一个编码运算。

在签名方案中使用了两个带附属的签名的编码方法,这里定义为:EMSA-PSS和EMSA-PKCS1-v1_5。

9.1 EMSA-PSS

通过选择散列函数、掩模生成函数和salt的长度,可以是编码方法参数化。对于给定的RSA密钥,除了salt的长度可变之外,其它选项应该是固定的(讨论参见[31])。在附录B中给出了建议的散列函数和掩模生成函数。这个编码方法是基于Bellare和Rogaway的概率签名方案(PSS:Probabilistic Signature Scheme)[4][5]。这个编码方案被随机化了,而且有一个编码运算和一个验证运算。 1 说明了这个编码运算。

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

a M Hash M’ = padding1 mHash salt DB = padding2 salt Hash ’ MGF EM = maskedDB H bc 1: EMSA-PSS编码运算。验证运算遵循相反的步骤,从而恢复出salt ,然后推进步骤以重新计

算和比较H。

注释:

1.这里定义的编码方法与Bellare 和Rogaway给IEEE P1363a [5]的建议中的编码方法在三个方面不同:

? 它对消息使用散列函数而不是掩模生成函数。尽管掩模生成函数是基于一个散列函数的,但直接 使用一个散列函数似乎更加自然。

? 与salt值一道被散列化的值是串(0x)00 00 00 00 00 00 00 00 || mHash 而不是消息M 本身。这里,mHash 是M 的散列。注意在两个步骤中散列函数是相同的。进一步的讨论见下面的注释3。(同样,使用名称“salt”而不是“seed”是由于“salt”更能体现该值的角色。)

? EMSA-PSS中的编码消息有九个固定的比特;第一个比特是0,最后八个比特形成一个“尾部域”,即八位组0xbc。

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

在最初的方案中,只有第一个比特是固定的。尾部域的基本原理是为了与IEEE Std 1363-2000 [26]中的Rabin-Williams IFSP-RW签名原语以及在草案ISO/IEC 9796-2 [29]中的对应原语兼容。

2.假设掩模生成函数是基于一个散列函数的,建议这个散列函数与应用于消息的散列函数一样;进一步的讨论参见8.1部分。

3.在没有危及RSASSA-PSS的安全坚固性的情况下,可以在计算签名运算的其余部分的模块之外执行EMSA-PSS-ENCODE的第1和第2步以及EMSA-PSS-VERIFY(散列函数对消息的应用),以便该模块的输入是mHash而不是消息M本身。换句话说,即使对手能够控制mHash的值,仍能保持RSASSA-PSS的安全坚固性。如果这个模块限制了I/O带宽(例如,一块智能卡),那么这是方便的。注意到PSS[4][5]的先前版本没有这性质。当然,让其它安全理由使这个模块处理整个消息是件吸引人的事。举例来说,如果这个模块不信任负责计算散列值的组件,它可能需要“看到”它正在签名的是什么。

4.salt的典型的八位组长度是hLen(散列函数Hash的输出的长度)和0。在两种情况下,RSASSA-PSS的安全性与使RSAVP1反向运算的难度密切相关。Bellare 和Rogaway[4]为最初的RSA-PSS方案指定了一个极度低级的界限,这粗略地与前一种情况对应;而Coron [12]为相关的全域散列法方案制定了一个较低级的界限,这粗略地与后一种情况对应。在[13]中Coron提供了一个通用的处理各种salt长度(从0到hLen)的方法;详细讨论参见[27]。同样参见[31],它改编了[4][13]中的安全坚固性,以提出RSA-PSS最初的和目前的版本的不同之处(就是上面注释1中所列的)。

5.就像在IEEE P1363a [27]中注释的,在签名方案中使用随机化——诸如EMSA-PSS中的salt值——可以为传送信息而不是被签名的消息提供一个“变换通道(covert channel)”。如需知道更多关于变换通道的信息,参见[50]。

9.1.1 编码运算

EMSA-PSS-ENCODE (M, emBits)

选项:

Hash MGF sLen M

散列函数(hLen表示散列函数的输出的八位组长度) 掩模生成函数

期望的salt的八位组长度 待编码的消息,是一个八位组串

输入:

emBits 整数OS2IP(EM)的最大比特长度(见4.2部分),至少为8hLen + 8sLen + 9 EM

编码后的消息,是一个长度为emLen = ?emBits/8?的八位组串

输出: 出错提示: 步骤:

“编码出错”;“消息太长”

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

1. 如果M的长度超出散列函数的输入限制(SHA-1的限制是2 – 1),则输出“消息太长”并且中

止运算。

2. 使mHash = Hash (M),这是一个长度为hLen 的八位组串。 3. 如果emLen < hLen + sLen + 2,输出“编码出错”然后中止运算。

4. 生成一个随机的长度为sLen的八位组串salt;如果sLen = 0,那么salt 是一个空串。 5. 使

M’ = (0x)00 00 00 00 00 00 00 00 || mHash || salt;

M’是一个长度为length 8 + hLen + sLen的八位组串,且开始的八个八位组均为0。 6. 使H = Hash (M’),这是一个长度为hLen 的八位组串。

7. 生成一个由emLen – sLen – hLen – 2个值为零的八位组构成的八位组串PS。PS的长度可以为0。 8. 使DB = PS || 0x01 || salt; DB 是一个长度为emLen – hLen – 1的八位组串。 9. 使dbMask = MGF (H, emLen – hLen – 1)。 10. 使maskedDB = DB ? dbMask。

11. 把maskedDB 的最左边的一个八位组中的最左边的8emLen – emBits 位置0。 12. 使EM = maskedDB || H || 0xbc。 13. 输出EM。

61

9.1.2 验证操作

EMSA-PSS-VERIFY (M, EM, emBits)

选项:

Hash MGF sLen M EM

散列函数(hLen散列函数的输出的八位组长度) 掩模生成函数

期望的salt的八位组长度 待验证的消息,是一个八位组串

编码消息,是一个长度为emLen = ?emBits/8?的八位组串

输入:

emBits 整数OS2IP (EM)(参见0部分)的最大比特长度,至少是8hLen + 8sLen + 9 “一致”或者“不一致”

输出: 步骤:

1. 如果M的长度大于散列函数的输入限制(SHA-1的输入限制是261 – 1),则输出“不一致”然后

中止运算。

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

2. 使mHash = Hash (M),是一个长度为hLen 的八位组串。 3. 如果emLen < hLen + sLen + 2,则输出“不一致”然后中止运算。

4. 如果EM最右边的八位组的十六进制值不是0xbc ,则输出“不一致”然后中止。

5. 使maskedDB 成为EM最左边的emLen – hLen – 1个八位组,而且使H成为接下来的hLen 个八位

组。

6. 如果maskedDB最左边的八位组的最左边的8emLen – emBits比特不全为零,则输出“不一致”然

后中止运算。

7. 使dbMask = MGF (H, emLen – hLen – 1)。 8. 使DB = maskedDB ? dbMask。

9. 将DB最左边的八位组中的左边数起8emLen – emBits个比特置零。

10. 如果DB左边数起的emLen – hLen – sLen – 2个八位组不为零或者如果第emLen – hLen – sLen – 1

个(最左边的八位组是第一个八位组)八位组的十六进制值不为0x01,则输出“不一致”然后中止运算。

11. 使salt 成为DB 的后sLen个八位组。 12. 使

M’ = (0x)00 00 00 00 00 00 00 00 || mHash || salt ;

M’是一个长度为8 + hLen + sLen的八位组串,且开头八个八位组的值为零。 13. 使H’ = Hash (M’),这是一个长度为hLen 的八位组串。 14. 如果H = H’,则输出“一致”;否则,输出“不一致”。

9.2 EMSA-PKCS1-v1_5

这个编码方法是确定性的,只有一个编码运算。 EMSA-PKCS1-v1_5-ENCODE (M, emLen)

选项: 输入:

Hash M

散列函数(hLen表示散列函数输出的八位组长度) 待编码的消息

emLen 期望的编码后消息的八位组长度,至少为tLen + 11,其中tLen 是在编码运算过程

中计算的某个值得DER编码T 的八位组长度。

输出: 出错提示:

EM 编码后的消息,是一个长度为emLen 的八位组串。

“消息太长”;“期望的编码消息长度太短”

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

步骤:

1. 将消息M代入散列函数,从而产生散列值H :

H = Hash (M) 。

如果散列函数输出“消息太长”则输出“消息太长”然后中止运算。

2. 用可识别的编码规则(DER)将散列函数的算法标识和散列值编码成一个类型为DigestInfo 的

ASN.1值(见附录A.2.4),其中类型DigestInfo 具有语法 DigestInfo ::= SEQUENCE {

digestAlgorithm AlgorithmIdentifier, digest OCTET STRING }

第一个域标识散列函数,第二个域包含散列函数。使T等于 DigestInfo值的DER编码(参见下面的注释),且让tLen等于T的八位组长度。

3. 如果emLen < tLen + 11,则输出“期望的编码消息长度太短”然后中止运算。

4. 生成一个由emLen – tLen – 3 个十六进制值为0xff 的八位组构成的串PS 。PS的长度将至少为八

个八位组。

5. 连接PS、 DER 编码T 和其它填充以形成编码消息EM

EM = 0x00 || 0x01 || PS || 0x00 || T 。

6. 输出EM。

注释:.

1. 对于附录0中提到的六个散列函数,DigestInfo 值的DER编码T 的值如下所示:

MD2: MD5: SHA-1:

(0x)30 20 30 0c 06 08 2a 86 48 86 f7 0d 02 02 05 00 04 10 || H。 (0x)30 20 30 0c 06 08 2a 86 48 86 f7 0d 02 05 05 00 04 10 || H。 (0x)30 21 30 09 06 05 2b 0e 03 02 1a 05 00 04 14 || H。

SHA-256: (0x)30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20 || H。 SHA-384: (0x)30 41 30 0d 06 09 60 86 48 01 65 03 04 02 02 05 00 04 30 || H。 SHA-512: (0x)30 51 30 0d 06 09 60 86 48 01 65 03 04 02 03 05 00 04 40 || H。

2. 在本片文档的版本1.5中,T被定义为是DigestInfo 值的BER编码,而不是DigestInfo 值的DER编码。特别的,至

少在理论上,本篇文档中定义的验证运算不可能拒绝一个有效签名(考虑到在PKCS #1 v1.5中给定的规范)。如

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

果将除了DER之外的其它规则应用于DigestInfo (例如,基础SEQUENCE类型的无限定长度编码法),将出现拒绝有效签名的情况。尽管在实际当中不会发生此类事情,在应用基于BER解码运算(在中有定义)的验证运算时,可以选择谨慎的设备(cautious implementer)。以这种方式,可以获得对任何基于PKCS #1 v1.5的有效实现的兼容。这样一个验证操作应该指出基础BER编码法是否是DER编码法,由此指出考虑到本篇文档中给出的规范,签名是否是有效的。

A ASN.1 语法

A.1 RSA 密钥表示

这一节定义RSA公钥和RSA私钥的ASN.Q对象标识符,并且定义类型RSAPublicKey 和

RSAPrivateKey 。这些定义的期望应用程序包括X.509认证、PKCS #8 [46] 和PKCS #12 [47]。

对象标识符rsaEncryption 将RSA公钥和私钥定义为附录 0和0中所示。与类型为AlgorithmIdentifier的值中的OID相联系的parameters域应该具有类型为NULL的值。

rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 }

在本节中的定义已被扩展,以支持多素数RSA,但是具有与先前版本向后兼容的特点。

A.1.1 RSA公钥语法

应该用ASN.1类型RSAPublicKey来表示一个RSA公钥:

RSAPublicKey ::= SEQUENCE { modulus INTEGER, -- n publicExponent INTEGER -- e }

类型RSAPublicKey的域具有以下意义:

? ?

modulus 是RSA的合数模n。 publicExponent 是RSA公开幂e。

A.1.2 RSA私钥语法

应该用ASN.1类型RSAPrivateKey来表示一个RSA私钥:

RSAPrivateKey ::= SEQUENCE { version Version, modulus INTEGER, -- n

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

publicExponent INTEGER, -- e privateExponent INTEGER, -- d prime1 INTEGER, -- p prime2 INTEGER, -- q

exponent1 INTEGER, -- d mod (p-1) exponent2 INTEGER, -- d mod (q-1)

coefficient INTEGER, -- (inverse of q) mod p otherPrimeInfos OtherPrimeInfos OPTIONAL }

类型RSAPrivateKey 的各域具有以下意义: ?

version 是版本号,为了与本文档的今后版本兼容。本篇文档的这个版本号应该是0,如果使用了多素

数,则版本号应该是1。

Version ::= INTEGER { two-prime(0), multi(1) }

(CONSTRAINED BY {-- version must be multi if otherPrimeInfos present --})

? ? ? ? ? ? ? ? ?

modulus 是RSA合数模n。 publicExponent 是RSA的公开幂e。 privateExponent 是RSA的私有幂d。 prime1 是n的素数因子p。 prime2 i是n的素数因子q。 exponent1 等于d mod (p ? 1)。 exponent2 等于d mod (q ? 1)。 coefficient 是CRT系数 q–1 mod p。

otherPrimeInfos 按顺序包含了其它素数r3, …, ru的信息。如果version是0 ,它应该被忽略;而如果version是1,它应该至少包含OtherPrimeInfo的一个实例。

OtherPrimeInfos ::= SEQUENCE SIZE(1..MAX) OF OtherPrimeInfo

OtherPrimeInfo ::= SEQUENCE { prime INTEGER, -- ri exponent INTEGER, -- di coefficient INTEGER -- ti }

OtherPrimeInfo的各域具有以下意义:

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

? ? ?

prime 是n的一个素数因子ri ,其中i ? 3。 exponent 是di = d mod (ri ? 1)。

coefficient 是CRT系数 ti = (r1 · ri–1) r2 · … ·

–1

mod ri。

注释:重要的是要防止RSA私钥被泄漏或是修改。这类防御技术超出了本篇文档的范围。PKCS #12 和#15中描述了存储和分发私钥的方法以及其它密码数据。

A.2 方案标识

本节定义加密和签名方案的对象标识。与PKCS #1 v1.5兼容的方案与PKCS #1 v1.5中的方案具有相同的标识。这些定义期望的应用程序包括X.509认证和PKCS #7。

这里是对PKCS #1 OID的类型表示的定义:

PKCS1Algorithms ALGORITHM-IDENTIFIER ::= {

{ OID rsaEncryption PARAMETERS NULL } | { OID md2WithRSAEncryption PARAMETERS NULL } | { OID md5WithRSAEncryption PARAMETERS NULL } | { OID sha1WithRSAEncryption PARAMETERS NULL } | { OID sha256WithRSAEncryption PARAMETERS NULL } | { OID sha384WithRSAEncryption PARAMETERS NULL } | { OID sha512WithRSAEncryption PARAMETERS NULL } | { OID id-RSAES-OAEP PARAMETERS RSAES-OAEP-params } | PKCS1PSourceAlgorithms ... -- Allows for future expansion -- }

|

{ OID id-RSASSA-PSS PARAMETERS RSASSA-PSS-params } ,

A.2.1 RSAES-OAEP

对象标识id-RSAES-OAEP 标识了RSAES-OAEP加密方案。

id-RSAES-OAEP OBJECT IDENTIFIER ::= { pkcs-1 7 }

在类型为AlgorithmIdentifier的值中,与这个OID相关的parameters域应该具有类型为RSAES-OAEP-params的值:

RSAES-OAEP-params ::= SEQUENCE {

hashAlgorithm [0] HashAlgorithm DEFAULT sha1, maskGenAlgorithm [1] MaskGenAlgorithm DEFAULT mgf1SHA1, pSourceAlgorithm [2] PSourceAlgorithm DEFAULT pSpecifiedEmpty }

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

类型RSAES-OAEP-params的域具有以下意义: ?

hashAlgorithm 标识了散列函数。在OAEP-PSSDigestAlgorithms集中,它应该是一个具有OID的算法

ID。关于所支持的散列函数的讨论,请参见附录B.1。

HashAlgorithm ::= AlgorithmIdentifier { {OAEP-PSSDigestAlgorithms} }

OAEP-PSSDigestAlgorithms ALGORITHM-IDENTIFIER ::= { { OID id-sha1 PARAMETERS NULL }| { OID id-sha256 PARAMETERS NULL }| { OID id-sha384 PARAMETERS NULL }| { OID id-sha512 PARAMETERS NULL }, ... -- Allows for future expansion -- }

默认的散列函数是SHA-1:

sha1 HashAlgorithm ::= { algorithm id-sha1,

parameters SHA1Parameters : NULL }

SHA1Parameters ::= NULL

? maskGenAlgorithm 标识掩模生成函数。它应该是一个算法ID(具有一个属于PKCS1MGFAlgorithms集

(对于这个版本来说,它应该由id-mgf1构成)的OID),以标识掩模生成函数MGF1(参见附录B.2.1)。与id-mgf1联系的parameters域应该是一个算法ID(具有一个属于OAEP-PSSDigestAlgorithms集的OID),标识MGF1基于的散列函数。

MaskGenAlgorithm ::= AlgorithmIdentifier { {PKCS1MGFAlgorithms} }

PKCS1MGFAlgorithms ALGORITHM-IDENTIFIER ::= { { OID id-mgf1 PARAMETERS HashAlgorithm }, ... -- Allows for future expansion -- }

默认的掩模函数是基于SHA-1的MGF1:

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

mgf1SHA1 MaskGenAlgorithm ::= { algorithm id-mgf1,

parameters HashAlgorithm : sha1 }

?

pSourceAlgorithm 标识标签L 的源(也可能是值)。它应该是一个算法标识(具有一个属于PKCS1PSourceAlgorithms集(对这个版本来说,应该由id-pSpecified构成)的对象标识), 指出这个

标签被明确描述。与id-pSpecified联系的parameters域应该是一个类型为OCTET STRING的值,包含这个标签。这篇规范的先前版本中,使用的是术语“编码参数”而不是“标签”,从此就出现了下面这个类型的名称。

PSourceAlgorithm ::= AlgorithmIdentifier { {PKCS1PSourceAlgorithms} }

PKCS1PSourceAlgorithms ALGORITHM-IDENTIFIER ::= { { OID id-pSpecified PARAMETERS EncodingParameters }, ... -- Allows for future expansion -- }

id-pSpecified OBJECT IDENTIFIER ::= { pkcs-1 9 }

EncodingParameters ::= OCTET STRING(SIZE(0..MAX))

默认标签是一个空串(以至于lHash会包含空串的散列):

pSpecifiedEmpty PSourceAlgorithm ::= { algorithm id-pSpecified,

parameters EncodingParameters : emptyString }

emptyString EncodingParameters ::= ''H

如果RSAES-OAEP-params中的域都使用了默认值,那么算法标识将具有以下的值:

rSAES-OAEP-Default-Identifier RSAES-AlgorithmIdentifier ::= { algorithm id-RSAES-OAEP, parameters RSAES-OAEP-params : { hashAlgorithm sha1, maskGenAlgorithm mgf1SHA1, pSourceAlgorithm pSpecifiedEmpty } }

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

RSAES-AlgorithmIdentifier ::= AlgorithmIdentifier { {PKCS1Algorithms} }

A.2.2 RSAES-PKCS1-v1_5

对象标识rsaEncryption (参见附录A.1)标识RSAES-PKCS1-v1_5加密方案。在类型为

AlgorithmIdentifier的值中与这个OID联系的parameters域应该具有一个类型为NULL的值。这与PKCS #1

v1.5中的一样。

rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 }

A.2.3 RSASSA-PSS

对象标识id-RSASSA-PSS标识加密方案。

id-RSASSA-PSS OBJECT IDENTIFIER ::= { pkcs-1 10 }

在类型为AlgorithmIdentifier的值中与这个OID相联系的parameters域应该具有一个类型为

RSASSA-PSS-params的值:

RSASSA-PSS-params ::= SEQUENCE {

hashAlgorithm [0] HashAlgorithm DEFAULT sha1, maskGenAlgorithm [1] MaskGenAlgorithm DEFAULT mgf1SHA1, saltLength [2] INTEGER DEFAULT 20,

trailerField [3] TrailerField DEFAULT trailerFieldBC }

类型RSASSA-PSS-params的各域具有以下意义: ?

hashAlgorithm 标识散列函数。它应该是一个算法ID(具有一个属于OAEP-PSSDigestAlgorithms集(参

见附录0)的OID)。默认的散列函数是SHA-1。 ?

maskGenAlgorithm 标识掩模生成函数。它应该是一个算法ID(具有一个属于PKCS1MGFAlgorithms集

(参见附录0)的OID)。默认的掩模生成函数是一个基于SHA-1的MGF1。对于MGF1(更一般地,对于基于一个散列函数地掩模生成函数)建议基础散列函数与hashAlgorithm标识的散列函数一样;进一步的说明请参见9.1节的注释2。

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

? saltLength 是salt的八位组长度。它应该是个整数。对于一个给定的hashAlgorithm,saltLength的默认

值是这个散列值的八位组长度。saltLength不像类型RSASSA-PSS-params的其它域,它的值对指定的RSA密钥对来说不需要是固定值。 ?

trailerField 是尾部域数字,为了与草案IEEE P1363a [27]兼容。对与本文档的这个版本它应该是1,这

表示尾部域具有十六进制值0xbc 。本篇文档不支持其它尾部域(包括IEEE P1363a中的尾部域HashID || 0xcc)。

TrailerField ::= INTEGER { trailerFieldBC(1) }

如果hashAlgorithm、maskGenAlgorithm和RSASSA-PSS-params的trailerField域使用默认值,那么算法标识将具有以下值:

rSASSA-PSS-Default-Identifier RSASSA-AlgorithmIdentifier ::= { algorithm id-RSASSA-PSS, parameters RSASSA-PSS-params : { hashAlgorithm sha1, maskGenAlgorithm mgf1SHA1, saltLength 20,

trailerField trailerFieldBC } }

RSASSA-AlgorithmIdentifier ::= AlgorithmIdentifier { {PKCS1Algorithms} }

注释:在一些应用中,作为一个签名方案的散列函数脱离签名方案中的其它操作而独立标识。举例来说,在PKCS #7 [45]中,一个散列函数标识放在消息前面,而“摘要加密”算法标识(指示其它操作)携带在签名中。为了PKCS #7让支持RSASSA-PSS签名方案,在RSASSA-PSS中需要用一个对象标识指示在散列函数(类似于RSASSA-PKCS1-v1_5方案的

RSAEncryption OID)之后的操作。S/MIME CMS [25]采用了不同的方式。尽管散列函数标识放在消息前面,但是全部签名

方案的算法标识可能携带在CMS签名中(这是对于DSA签名)。在这个惯例之后,id-RSASSA-PSS OID被用于标识CMS中的RSASSA-PSS签名。自从CMS被认为是PKCS #7的接班人之后,同时考虑到CMS而不是PKCS #7,进行了许多新开发,诸如增加对RSASSA-PSS支持。

A.2.4 RSASSA-PKCS1-v1_5

下面之一应该是RSASSA-PKCS1-v1_5的对象标识。OID的选择依赖于散列算法的选择:MD2、MD5、SHA-1、 SHA-256、SHA-384或者 SHA-512。注意如果采用了MD2或者MD5,那么这个OID就和PKCS

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

#1 v1.5中的一样。对于每个OID,在类型为AlgorithmIdentifier的值中,与这个OID相联系的parameters域应该具有一个类型为NULL的值。应该依照下表选择这个OID:

Hash algorithm MD2 MD5 SHA-1 SHA-256 SHA-384 SHA-512 OID md2WithRSAEncryption ::= {pkcs-1 2} md5WithRSAEncryption ::= {pkcs-1 4} sha1WithRSAEncryption ::= {pkcs-1 5} sha256WithRSAEncryption ::= {pkcs-1 11} sha384WithRSAEncryption ::= {pkcs-1 12} sha512WithRSAEncryption ::= {pkcs-1 13}

EMSA-PKCS1-v1_5编码方法包括一个类型为DigestInfo的ASN.1值,其中类型DigestInfo具有语法

DigestInfo ::= SEQUENCE {

digestAlgorithm DigestAlgorithm, digest OCTET STRING }

digestAlgorithm 标识散列函数且应是一个算法ID(具有一个属于PKCS1-v1-5DigestAlgorithms集的OID)。

关于支持的散列函数的讨论,参见附录0。

DigestAlgorithm ::= AlgorithmIdentifier { {PKCS1-v1-5DigestAlgorithms} }

PKCS1-v1-5DigestAlgorithms ALGORITHM-IDENTIFIER ::= { { OID id-md2 PARAMETERS NULL }| { OID id-md5 PARAMETERS NULL }| { OID id-sha1 PARAMETERS NULL }| { OID id-sha256 PARAMETERS NULL }| { OID id-sha384 PARAMETERS NULL }| { OID id-sha512 PARAMETERS NULL } }

B 支撑技术

本部分给出了几个关于支持第7部分中的加密方案和第9部分中的编码方案的基础函数的例子。为了移植到新技术上也为了与已存在的应用程序兼容,这里给出了一个技术范围。尽管这些支撑技术适合用应用程序实现,但是它们之中没有一个需要被实现。希望开发描述特定技术的PKCS #1 v2.1文档。

这个部分也给支撑技术指定了对象标识。

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

B.1 散列函数

第0部分和第0部分的运算使用了散列函数。散列函数是确定性的,意思是输出完全有输入决定。散列函数接纳可变长度的八位组串,然后生成固定长度的八位组串。第0部分和第0部分的运算使用的散列函数一般应该是限制冲突的。这意味着要找到有相同输出的散列函数的两个不同的输入是不可行的。一个限制冲突散列函数也具有吸引人的单方性能;这意味着给定一个输出,就不可能找到一个输入,使它的散列就事给定的输出。除了这些技术规格,用伪随机输出散列函数会产生一个掩模生成函数(见附录0)。

本篇文档中给出六个编码函数的散列函数作为例子:MD2 [33]、 MD5 [41]、 SHA-1 [38]以及申请算法SHA-256、SHA-384和SHA-512[39]。对于RSAES-OAEP加密方案和EMSA-PSS编码方案,只推荐使用SHA-1和SHA-256/384/512,新应用程序推荐使用SHA-1和SHA-256/384/512。MD2和MD5只推荐给与已存在的基于PKCS #1 v1.5的应用程序兼容。

对象标识id-md2、 id-md5、 id-sha1、 id-sha256、 id-sha384,和id-sha512,分别标识散列函数:

id-md2 OBJECT IDENTIFIER ::= {

iso (1) member-body (2) us (840) rsadsi (113549) digestAlgorithm (2) 2 }

id-md5 OBJECT IDENTIFIER ::= {

iso (1) member-body (2) us (840) rsadsi (113549) digestAlgorithm (2) 5 }

id-sha1 OBJECT IDENTIFIER ::= {

iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 26 }

id-sha256 OBJECT IDENTIFIER ::= {

joint-iso-itu-t (2) country (16) us (840) organization (1) gov (101) csor (3) nistalgorithm (4) hashalgs (2) 1 }

id-sha384 OBJECT IDENTIFIER ::= {

joint-iso-itu-t (2) country (16) us (840) organization (1) gov (101) csor (3) nistalgorithm (4) hashalgs (2) 2 }

id-sha512 OBJECT IDENTIFIER ::= {

joint-iso-itu-t (2) country (16) us (840) organization (1) gov (101) csor (3) nistalgorithm (4) hashalgs (2) 3 }

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

在类型为AlgorithmIdentifier 的值中,与这些对象标识联系的parameters域应该具有类型为NULL的值。

注释:PKCS #1的版本1.5也允许在签名方案中使用MD4。MD4的密码分析在这几年里取得了重大的进展。举例来说,Dobbertin [18]证实了如何找到MD4的冲突数据,而且MD4的前两round不是单方的[20]。由于这些结果以及其它结果(例如[8]),不再推荐使用MD4。MD2和MD5的密码分析中也有进展,尽管还不足以正名从以存在的应用程序中删除是正当的。Rogier 和 Chauvaud [43]证实了如何在MD2的修改版本中找到冲突数据。没有人证实如何找到所有MD5算法的冲突数据,尽管部分结果已经被发现(例如[9][19])。

为了address these concerns,不推荐新应用程序使用SHA-1、SHA-256 、SHA-384或者SHA-512。就今天来说,针对这些散列函数的最著名的攻击是带复杂度2L/2的类属攻击,其中L是散列函数输出的比特长度。对于本篇文档中的签名方案,一个冲突数据攻击很容易就转化成一个签名伪造。因此,值L / 2应该至少等于签名方案期望的安全等级的比特长度(B比特安全等级意思是攻击具有的复杂度为2B)。同样的拇指规则能够应用于RSAES-OAEP;建议seed的比特长度(等于散列函数输出的比特长度)应该为期望安全等级的比特长度的两倍。

B.2 掩模生成函数

一个掩模生成函数将一个可变长度的八位组串和一个期望的输出长度作为输入,并且输出一个具有期望长度的八位组串。对输入长度方面和输出八位组可能有限制,但是这种界限一般非常大。一个掩模生成函数的数出应该是伪随机的:给定输出而RSASSA-PSS不是输入的一部分,预算另一部分输出是不可能的。RSAES-OAEP和RSASSA-PSS的可证实安全性赖于掩模生成函数输出的随机本质,而输出的随机性反过来依赖于基础散列的随机本质。

这里给定一个掩模生成函数:MGF1,它依赖于散列函数。MGF1与IEEE Std 1363-2000 [26]以及草案ANSI X9.44 [1]中定义的掩模生成函数一致。本篇文档的今后版本可以定义其它掩模生成函数。

B.2.1 MGF1

MGF1 是一个基于散列函数的掩模生成函数。 MGF1 (mgfSeed, maskLen)

选项: 输入:

Hash mgfSeed maskLen mask

散列函数(hLen表示散列函数输出的八位组长度) 掩模生成所用的seed,使一个八位组串 期望的掩模的八位组长度,至多是2 hLen 掩模,使一个长度为maskLen的八位组

32

输出:

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

出错提示: 步骤:

“掩模太长”

1. 如果maskLen > 232 hLen,则输出“掩模太长”然后中止运算。 2. 使 T为空的八位组串。

3. 使counter从0步进到 ? maskLen / hLen ? – 1,循环以下步骤:

a. 将counter转换成一个长度为4个八位组的串C (见0节):

C = I2OSP (counter, 4) 。

b. 连接seed mgfSeed的散列和C,产生一个八位组串T:

T = T || Hash (mgfSeed || C) 。

4. 将T的前maskLen个八位组作为八位组串掩模输出。 对象标识id-mgf1标识了掩模生成函数MGF1:

id-mgf1 OBJECT IDENTIFIER ::= { pkcs-1 8 }

在类型为AlgorithmIdentifier的值中与这个OID相联系的parameters域应该是一个类型为hashAlgorithm的值,标识MGF1所依赖的散列函数。

C ASN.1 模块

PKCS-1 {

iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) pkcs-1(1) modules(0) pkcs-1(1) }

-- $ Revision: 2.1 $

-- This module has been checked for conformance with the ASN.1 standard by -- the OSS ASN.1 Tools

DEFINITIONS EXPLICIT TAGS ::= BEGIN

-- EXPORTS ALL

-- All types and values defined in this module are exported for use in other

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

-- ASN.1 modules.

IMPORTS

id-sha256, id-sha384, id-sha512 FROM NIST-SHA2 {

joint-iso-itu-t(2) country(16) us(840) organization(1) gov(101) csor(3) nistalgorithm(4) modules(0) sha2(1) };

-- ============================ -- Basic object identifiers -- ============================

-- The DER encoding of this in hexadecimal is: -- (0x)06 08

-- 2A 86 48 86 F7 0D 01 01 --

pkcs-1 OBJECT IDENTIFIER ::= {

iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) 1 } --

-- When rsaEncryption is used in an AlgorithmIdentifier the parameters -- MUST be present and MUST be NULL. --

rsaEncryption OBJECT IDENTIFIER ::= { pkcs-1 1 } --

-- When id-RSAES-OAEP is used in an AlgorithmIdentifier the parameters MUST -- be present and MUST be RSAES-OAEP-params. --

id-RSAES-OAEP OBJECT IDENTIFIER ::= { pkcs-1 7 } --

-- When id-pSpecified is used in an AlgorithmIdentifier the parameters MUST -- be an OCTET STRING. --

id-pSpecified OBJECT IDENTIFIER ::= { pkcs-1 9 } --

-- When id-RSASSA-PSS is used in an AlgorithmIdentifier the parameters MUST -- be present and MUST be RSASSA-PSS-params.

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

--

id-RSASSA-PSS OBJECT IDENTIFIER ::= { pkcs-1 10 } --

-- When the following OIDs are used in an AlgorithmIdentifier the parameters -- MUST be present and MUST be NULL. --

md2WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 2 } md5WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 4 } sha1WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 5 } sha256WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 11 } sha384WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 12 } sha512WithRSAEncryption OBJECT IDENTIFIER ::= { pkcs-1 13 } --

-- This OID really belongs in a module with the secsig OIDs. --

id-sha1 OBJECT IDENTIFIER ::= {

iso(1) identified-organization(3) oiw(14) secsig(3) algorithms(2) 26 } --

-- OIDs for MD2 and MD5, allowed only in EMSA-PKCS1-v1_5. --

id-md2 OBJECT IDENTIFIER ::= {

iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 2 }

id-md5 OBJECT IDENTIFIER ::= {

iso(1) member-body(2) us(840) rsadsi(113549) digestAlgorithm(2) 5 } --

-- When id-mgf1 is used in an AlgorithmIdentifier the parameters MUST be -- present and MUST be a HashAlgorithm, for example sha1. --

id-mgf1 OBJECT IDENTIFIER ::= { pkcs-1 8 }

-- ================ -- Useful types -- ================

ALGORITHM-IDENTIFIER ::= CLASS {

PKCS/PKIX中文翻译计划

PKCS #1 v2.1---RSA Cryptography Standard RSA算法标准

&id OBJECT IDENTIFIER UNIQUE, &Type OPTIONAL }

WITH SYNTAX { OID &id [PARAMETERS &Type] }

-- Note: the parameter InfoObjectSet in the following definitions allows a -- distinct information object set to be specified for sets of algorithms -- such as:

-- DigestAlgorithms ALGORITHM-IDENTIFIER ::= { -- { OID id-md2 PARAMETERS NULL }| -- { OID id-md5 PARAMETERS NULL }| -- { OID id-sha1 PARAMETERS NULL } -- } --

AlgorithmIdentifier { ALGORITHM-IDENTIFIER:InfoObjectSet } ::= SEQUENCE { algorithm

ALGORITHM-IDENTIFIER.&id({InfoObjectSet}), parameters

ALGORITHM-IDENTIFIER.&Type({InfoObjectSet}{@.algorithm}) OPTIONAL }

-- ============== -- Algorithms -- ============== --

-- Allowed EME-OAEP and EMSA-PSS digest algorithms. --

OAEP-PSSDigestAlgorithms ALGORITHM-IDENTIFIER ::= { { OID id-sha1 PARAMETERS NULL }| { OID id-sha256 PARAMETERS NULL }| { OID id-sha384 PARAMETERS NULL }| { OID id-sha512 PARAMETERS NULL }, ... -- Allows for future expansion -- } --

-- Allowed EMSA-PKCS1-v1_5 digest algorithms. --

PKCS1-v1-5DigestAlgorithms ALGORITHM-IDENTIFIER ::= {

PKCS/PKIX中文翻译计划