PKCS#1v21RSA密码学规范.docx

上传人:b****8 文档编号:9430892 上传时间:2023-02-04 格式:DOCX 页数:41 大小:34.67KB
下载 相关 举报
PKCS#1v21RSA密码学规范.docx_第1页
第1页 / 共41页
PKCS#1v21RSA密码学规范.docx_第2页
第2页 / 共41页
PKCS#1v21RSA密码学规范.docx_第3页
第3页 / 共41页
PKCS#1v21RSA密码学规范.docx_第4页
第4页 / 共41页
PKCS#1v21RSA密码学规范.docx_第5页
第5页 / 共41页
点击查看更多>>
下载资源
资源描述

PKCS#1v21RSA密码学规范.docx

《PKCS#1v21RSA密码学规范.docx》由会员分享,可在线阅读,更多相关《PKCS#1v21RSA密码学规范.docx(41页珍藏版)》请在冰豆网上搜索。

PKCS#1v21RSA密码学规范.docx

PKCS#1v21RSA密码学规范

PKCS#1v2.1:

RSA密码学规范

RSA实验室

2002年6月14日

--翻译:

CaesarZou

1.介绍

这个文档提供了基于RSA算法的公钥密码学的建议实现,包含如下的方面:

>密码学单元

>加密方案

>带填充的签名方案

>以ASN.1语法展现的密钥和方案

参考建议基于计算机的通用需求和通讯系统,并且引入了合适数量的灵活性。

建议基于这个规范的应用标准可以包含额外的限制。

参考建议尝试与IEEE-1353-2000和当前ANSIX9F1开发的讨论版本规范以及IEEEP1363[27]工作组兼容。

这个文档取代PKCS#1版本2.0。

但是包含兼容的技术。

这个文档的组织结构如下:

>第一章是一个介绍。

>第二章定义了这个文档中使用的一些符号。

>第三章定义了RSA公钥和四要类型。

>第四章和第五章定义了一些单元或者数学操作的基本单位。

>第六章第七章和第八章解决了这个文档中加密和签名的方案。

第六章给出了一个综述,沿着PKCS$1v1.5定义的方法,第七章定义了OAEP基础的加密算法,第八章定义了PSS基础的填充签名算法。

>第九章定义了第八章定义的签名算法的编码方法。

附录A定义了第三章定义的密钥以及第七章第八章定义的算法的ASN.1语法标识。

附录B定义了这个文档中使用的哈希函数和掩码生成算法。

包含算法的ASN.1语法标识。

附录C给出了一个ASN.1模块

附录D,E,F和G包含了一些常见问题,PKCS#1的版本历史,给出到其它出版物和规范的引用,并提供关于公钥算法规范的基本信息。

2符号

c密文标识,是一个0到n-1大小的整数。

C密文标识,一个字符串

dRSA私有指数

diri的CRT指数的附加因子,一个正整数满足e*di≡1(mod(ri-1)),i=3,....,u

dPp的CRT指数,一个正整数满足e*dP≡1(mod(p-1))

dQq的CRT指数,一个正整数满足e*dQ≡1(mod(q-1))

eRSA公有指数

EM编码消息,一个字节串

emBits一个编码消息EM的比特长度

emLen一个编码消息EM的字节长度

GCD两个正整数的最大公约数

Hash哈希函数

hLen哈希函数Hash输出的字节长度

kRSA模数n的字节长度

KRSA私钥

L可选的RSAES-OAEP标签,一个字节串

LCM一系列正整数的最小公倍数

m消息标识,一个0到n-1的整数

M消息,一个字节串

maskMGF的输出,一个字节串

mgfSeedmask生成的种子,一个字节串

mLen消息M的字节长度

nRSA模数,n=r1*r2*....ru,u>=2

(n,e)RSA公钥

p,qRSA模数n的第一分解因子

qinvCRT西数,一个小于p的正整数,满足q.qinv≡1(modp)

riRSA模数的主因子,包含r1=p,r2=q,如果有的话也包含额外的因子。

s签名标志,一个0到n-1整数

S签名,一个字节串

sLenEMSA-PSS的字节长度

tiri的CRT系数的附加质数,一个小于ri的正整数,满足r1*ri*....*ri-1*ti≡1(modri),i=3,.....u

uRSA模数的主因子个数,u大于等于2

x一个正整数

Xx的字节串

xLenX的字节串长度

0x一个字节或者一个字节串的十六进制标识;"0x48"意味着十六进制的值48;"(0x)48090e"意味着由3个连续的十六进制值48,09,03组成的字节串

λ(n)r1-1,r2-1,ru-1的最小公倍数

⊕两个字节串异或

[.]上限函数,一个大于等于实数x的最小整数

||连接符

≡全等符号;a≡b(modn)意思是n可以被整数a-b整除

注释。

CRT可以使用回调或者非回调的方式提供,本文参照了加纳算法使用的回调算法。

参见3.2章的注释1.

3密钥类型

这个文档的算法和单元提供了两种密钥类型:

RSA公钥和RSA私钥。

RSA公钥和RSA私钥合在一起称为RSA密钥对。

这个规范支持号称“多质数”的可以有两个以上质数因子的RSA模数。

多模数的RSA的好处是使用CRT(中国余数算法)的时候是解密和签名运算具有更低的计算代价。

在单处理器平台就可以获得很好的表现,并且在多处理器平台上面会有很大的提升,因为可以并行的调用模幂运算。

关于多个质数对RSA算法安全的影响的讨论,参见注释[49]

3.1RSA公钥

基于这个文档的目标,一个RSA公钥由两个组件组成:

nRSA模数,一个正整数

eRSA公共指数,一个正整数

在一个有效的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)。

按惯例,前两个质数r1和r2也可以被分别的定义为p和q。

在不同实现之间交换的公钥建议语法参见附录A.1.1;实现内部的表现可以是不同的。

3.2RSA私钥

基于这个文档的目标,一个RSA私钥可以有如下两种标识方式:

1.第一种标识方式由(n,d)对组成,其中组件意义如下:

nRSA模数,一个正整数

dRSA私有指数,一个正整数

2.第二种标识方式由一个五元组(p,q,dP,dQ,qInv)和一个(可能为空)的三元组(ri,di,ti)组成,i=3,...,u,对应于不在五元组的每个指数。

其中组件意义如下:

p第一因子,一个正整数

q第二因子,一个正整数

dP第一因子的CRT指数,一个正整数

dQ第二因子的CRT指数,一个正整数

qInv第一CRT系数,一个正整数

ri第i因子,一个正整数

di第i因子的CRT指数,一个正整数

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

在一个第一种方式描述的有效的RSA私钥内,RSA模数和对应的RSA公钥中的模数一致,由u个独立的质数ri,i=1,2....,u(u>=2)的乘积,RSA私有指数d是一个小于n的正整数

满足e·d≡1(modλ(n)),其中e是公钥指数,λ(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(modp)。

如果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(modri),其中Ri=r1·r2·…·ri–1

在不同实现之间交换的私钥建议语法参见附录A.1.2;实现内部的表现可以是不同的。

注释:

1.此处CRT系数的定义遵从和使用了第五章描述的加纳算法。

然而为了和PKCS#1v.20以及以前版本的描述兼容,p和q的规则相对于其它的质数是颠倒的。

因此

CRT系数qInv被定义为q模p的倒数,而不是R1模r2或者说是p模q的倒数。

2.QuisquaterandCouvreur算法符合了中国余数算法带给RSA操作的好处。

4.数据转化单元

这个文档定义了两个数据转化单元

>I2OSP

整数到字节串单元

>OS2IP字节串到整数单元

基于本文的目标,考虑到ASN.1的语法,一个字节串是一个有序的八比特字节组成的。

顺序从左到右,从到整数的转化考虑,在接着的转化单元中,第一个字节为最高有效字节。

4.1I2OSP(整数到字节串单元)

I2OSP转化一个非负整数为一个指定长度的字节串。

I2OSP(x,xLen)

输入:

x

待转化的非负整数

xLen预订的结果字节串的长度

输出:

X

对应的长度为xLen的字节串

错误:

整数太大了

步骤:

1.如果x>=256^xLen,输出错误信息“整数太大”并结束

2.将整数x写为基于256的唯一的xLen长度数字表示:

x=x(xLen-1)256^(xLen-1)+x(xLen-2)256^(xLen-2)+...+x0,其中0=

3.设字节Xi为X(xLen-i)的值。

i从1到xLen,输出字节串:

X=X1X2...X(xLen)

4.2OS2IP(字节串到整数单元)

OS2IP转化一个字节串到一个非负整数。

OS2IP(X)

输入:

X

待转化的字节串

输出:

x

对应的正整数

步骤:

1.使得X的字节X1X2...X(xLen)从左到右,并使得整数值作为x(xLen-i)1<=i<=xLen。

2.使得x=x(xLen-1)256^(xLen-1)+x(xLen-2)256^(xLen-2)+...+x0

3.输出x。

5.算法单元

算法单元是在具体加密算法使用的基础数学操作。

它被假定为通过硬件或者软件模块实现,而不提供算法安全无关的逻辑。

本文中定义了四种类型的单元,成对的方式组织为:

加密和解密;签名和验签。

单元的规范假定输入条件满足特定规定,并且RSA的公钥和私钥是有效的。

5.1加密和解密单元

一个加密单元在公钥的控制下从输入消息产生一个密文,并且解密单元在对应私钥的控制下将密文恢复为明文。

在本文中定义的:

RSAEP/RSADP中使用了一对加密和解密单元。

RSAEP和RSADP使用了不同密钥输入下的相同的数学操作。

此处定义的单元和IEEE规范中的IFEP-RSA/IFDP-RSA是相同的,并且兼容PKCS#1v1.5

单元中用到的主要数学操作是模幂。

5.1.1RSAEP

RSAEP((n,e),m)

输入:

(n,e)

RSA公钥

m消息标识,一个介于0到n-1的整数

输出:

c

密文标识,一个介于0到n-1的整数

错误:

消息标识越界

假定:

RSA公钥(n,e)是有效的

步骤:

1.如果消息标识m不在0到n-1,输出“消息越界”并停止。

2.使得c=m^emodn

3.输出c

5.1.2RSADP

RSADP(K,c)

输入:

K

RSA私钥,K有如下的格式:

--一个对(n,d)

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

c密文,一个介于0到n-1之间的整数

输出:

m

消息标识,一个介于0到n-1的整数

错误:

密文数据越界

假定:

RSA私钥K是有效的

步骤:

1.如果密文标识c不在0到n-1之间,输出“密文消息越界”并停止

2.消息标识m采用如下方式产生。

a.如果K使用第一种方式(n,d),使得m=c^dmodn

b.如果K使用第二种方式(p,q,dP,dQ,qInv)和(ri,di,ti),流程如下:

1.使得m1=c^dPmodp,m2=c^dQmodq

2.如果u>2,使得mi=c^dimodri,i=3,...,u

3.使得h=(m1-m2)*qInvmodp

4.使得m=m2+q*h

5.如果u>2,使得R=r1并且从i=3到u开始做

1.使得R=R*ri-1

2.使得h=(mi-m)*timodri

3.使得m=m+R*h

3.输出m

注释:

2.a步骤可以重写为一个单循环,由p和q的顺序反转。

参见PKCS#1V2.0,所以前两个质数p和q和其它扩展指数是区别对待的。

5.2签名和验签操作

签名单元提供了在私钥控制下从消息产生一个签名的过程,一个验签单元在对应的公钥的控制下,将消息从对应的签名中产生出来。

本文定义的一对签名和验签操作为:

RSASP1/RSAVP1.

本单元和IEEE1363-2000中的IFSP-RSA1/IFSP-RSA1相同并且兼容PKCS#1v1.5

RSASP1和RSAVP1除了名字和参数和RSADP和RSAEP不一致外,单元中用到的主要数学操作和加密解密一样为模幂;他们是由不同的目标区分的。

5.2.1RSASP1

RSASP1(K,m)

输入输出流程等同于RSADP

5.2.2RSAVP1

RSAVP1((n,e),s)

输入输出流程等同于RSAEP

6方案综述

方案联合了算法单元和其它的技术来实现特定的安全目标。

本文规定了两种类型的设计:

加密方案和带填充的签名方案。

本文中的设计定义仅包含操作方案中的RSA公钥或私钥的处理数据的步骤,不包含获得和验证密钥的过程。

然而除了算法方案外,应用的典型操作还应该包含为RSA算法过程选择公私钥的密钥管理过程。

这部分附加的操作和细节不在本文范围内。

因为是作为一个数学单元,算法操作假设输入的特定条件是满足的,特别是RSA的公钥和私钥的有效性。

因此,一个实现在密钥无效的情况下的操作是未定义的。

这种未定义属性的处理由应用决定。

解决密钥验证的可能手段,包含应用明确的密钥验证;公共密钥基础框架的密钥验证;以及追究产生无效密钥的操作的分配责任。

一个总体上比较好的加密的做法是在一个过程中使用一个给定的RSA密钥对。

这就避免了一个设计的漏洞影响到其它部分安全的风险,对保证安全至关重要。

虽然RSAES-PKCS1-v1_5(7.2章)和RSASSA-PKCS1-v1_5(8.2章)传统上被遗弃使用并且没有任何已知的坏的作用,但在新的应用中,这种类型的组合是不推荐的。

举例来说明在多个过程中使用一个RSA密钥对的风险,假设一个RSA密钥对在RSAES-OAEP(7.1)和RSAES-PKCS1-v1_5同时使用。

尽管RSAES-OAEP是抗攻击的,但攻击者可以在RSAES-PKCS1-v1_5中找到弱点来把加密的消息恢复出来。

另外一个例子,假设一个RSA密钥对同时被RSASSA-PSS和RSASSA-PKCS1-v1_5使用。

然后RSASSA-PSS的安全验证将不再是足够的,因为验证不考虑被第二个过程产生签名的可能性。

基于类似的考虑,同一组密钥在此处定义的过程和其它地方定义的过程共享的时候,也有同样的问题。

7加密方案

基于本文的目的,一个加密过程由一个加密操作和一个解密操作,加密操作使用接受到的公钥从一个消息产生一个密文,解密操作使用给定的RSA私钥将密文恢复为明文。

加密过程可以在多种应用中使用,一个典型的应用是建立协议,消息包含着密钥数据秘密的从一方发给另外一方。

具体的实例,PKCS#7使用这样的协议从发送者提交内容-加密密钥到接收者;次数定义的加密过程将会符合那个场景下的密钥-加密算法。

本文定义了两个加密过程:

RSAES-OAEP和RSAES-PKCS1-v1_5。

RSAES-OAEP建议在新的应用中使用;RSAES-PKCS1-v1_5的包含仅仅是为了和现有的应用兼容,在新应用中不建议使用。

此处定义的加密过程遵从类似IEEEStd1363-2000的通用模型,包含在加密算法内的加密和解密单元。

加密操作提供对消息提供编码操作其产生一个整数形式的编码消息。

加密单元操作消息编码产生密文。

相对于此,解密操作将密文恢复为转化为字节串的编码消息。

消息解码操作将编码的消息恢复为原始消息并且校验解密的正确性。

为了避免实现在解码操作中的方式错误带来的实现弱点,RSAES-OAEP和RSAES-PKCS1-v1_5的解码操作嵌入在各自的规范里,而不是定义在其它规范中。

两个加密过程都和PKCS#1v2.0对应的过程兼容。

7.1RSAES-OAEP

RSAES-OAEP包含了RSAEP和RSADP单元(第5.11和5.12章)以及EME-OAEP编码方法(7.1.1step1.b和7.1.2step3)。

EME-OAEP基于Bellare和Rogaway的最佳非对称加密方案。

它和IEEEStd1363-2000中的IFES对应的加密和解密单元是IFEP-RSA和IFDP-RSA,消息编码算法是EME-OAEP方案兼容。

RSAES-OAEP可以操作长度最大为k-2hLen-2个字节,hLen是潜在的哈希输出的长度,k是RSA模数的容器字节数。

假设计算e的th次方模n是不可行的,并且RSAES-OAEP的掩码生成函数也有相应的属性,RSA理论上对抵抗指定密文攻击是安全的。

这个保证是可证实的,攻破RSA-OAEP的难度直接依赖于反推RSA函数的难度,提供的掩码函数可以被看作黑盒子或者随机数,见[21]有进一步的讨论。

RSAES-OAEP通过选择哈希函数和掩码生成函数来参数化。

对于一个给定的RSA密钥,这个选择是固定的。

建议的哈希和掩码生成函数见附录B。

7.1.1加密操作

RSAES-OAEP-ENCRYPT((n,e),M,L)

可选:

Hash

哈希函数(hLen代表哈希函数的输出字节数)

MGF掩码生成函数

输入:

(n,e)输入的RSA公钥(k代表RSA模数n的字节长度)

M待加密的数据,一个长度为mLen的字节串,并且mLen<=k-2hLen-2

L可选的和消息关联的标签;如果L没有提供,默认的值是空串

输出:

C加密输出,长度为k的字节串

错误:

“消息太长”;“标签太长”

假设:

RSA公钥(n,e)是有效的。

操作:

1.长度检查

a.如果L的长度超过了哈希函数的输入限制(SHA-1是2^61-1字节),输出"标签太长“并中止。

b.如果mLen>k-2hLen-2,输出“消息太长”并中止。

2.EME-OAEP编码

a.如果标签L没有提供,使得L为空串。

使得lHash=Hash(L),一个长度为hLen的字节串。

b.生成一个字节串PS,由k-mLen-2hLen-2个字节零组成,PS的长度有可能是0。

c.连接lHash,PS,一个单字节值为0x01和消息M,形成一个长度为k-hLen-1的字节串:

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

d.生成一个长度为hLen的随机字节串种子seed。

e.使得dbMask=MGF(seed,k-hLen-1)

f.使得maskedDB=DB⊕dbMask.

g.使得seedMask=MGF(maskedDB,hLen)

h.使得maskedSeed=seed⊕seedMask

i.级联值为0x00的单字节,maskedSeed,和maskedDB形成长度为k的消息EM:

EM=0x00||maskedSeed||maskedDB

3.RSA加密:

a.转化消息EM为一个整数m(参见4.2章)

m=OS2IP(EM).

b.使用RSA公钥(n,e)和消息m产生一个加密结果整数c。

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

c.转化加密结果c为长度为k的加密数据C。

C=I2OSP(c,k)

d.输出密文C

7.1.2解密操作

RSAES-OAEP-DECRYPT(K,C,L)

可选:

Hash

哈希函数(hLen代表哈希函数的输出字节数)

MGF掩码生成函数

输入:

K

输入的RSA私钥(k代表RSA模数n的字节数)

C待解密的密文,长度为k的字节串,k>=2hLen+2

L可选的关联到验证的消息的标签,L没提供的话,使用默认值空串。

输出:

M

消息,一个长度为mLen的字节串,并且mLen<=k-2hLen-2

错误:

“解密错误”

步骤:

1.长度检查

a.如果L的长度大于哈希函数的输入限制,输出“解密错误”并停止。

b.如果密文C的长度不是k个字节,输出“解密错误”并停止。

c.如果k<2hLen+2,输出“解密错误”并停止。

2.RSA解密

a.转化密文C为整数形式c(参见第4.2章)

c=OS2IP(C)

b.使用RSADP解密单元使用私钥K将密文c产生整数消息m:

m=RSADP(K,c)

如果RSADP输出“解密数据越界”(c>=n),输出"解密错误“并停止。

c.转化消息m为k字节长度的字节串EM

EM=I2OSP(m,k)

3.EME-OAEP解码

a.如果标签L没有提供,使得L作为空串。

使得lHash=Hash(L),一个长度为hLen的字节串。

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-h-1)

f.使得DB=maskedDB⊕dbMask

g.将DB分成长度为lHash的字节串,一个由0组成的填充串,和消息M

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

如果没有值为0x01的数据将PS和M分隔开,如果lHash不等于lHash',或者如果Y非零,输出“解密错误“并停止。

4.输出消息M。

7.2RSAES-PKCS1-v1_5

RSAES-PKCS1-v1_5包含RSAEP和RSAEP单元和EME-PKCS1-v1_5编码方法.它算术上等于PKCS#1v1.5的加密算法。

RSAES-PKCS1-v11+5可以操作长度最大为k-11字节(k是RSA模数n的字节长度)。

但应小心在长数据加密过程中基于Coppersmith,Franklin,Patarin,和Reiter的小指数RSA攻击。

作为一般规则,此方案用于加密普通的消息,而不建议用于加密随机生成的密钥。

它有一定概率成功的在不知道对应的明文的前提下产生有效的RSAES-PKCS-v1_5的密文。

这个能力可能被密文选择性攻击利用。

因此如果采用RSAES-PKCS1_v1_5,应采取一些容易实施的对策阻扰攻击。

典型的例子是在数据中加入附加结构,在解密的消息中严格检查PKCS#1v1.5的一致性(和其它冗余)。

并巩固在基于PKCS#1v1.5的客户-服务协议中的错误消息。

这些都可以是不涉及改动PKCS#1v1.5基础协议的有效的对策。

这个问题的进一步讨论请参照[7]。

最近展现出来的SSL/TLS的握手协议,就是使用RSAES-PKCS1-v1_5和若干对策解决RSA问题的一个变种。

7.2.1加密操作

RSAES-PKCS1-V1_5-ENCRYPT((n,e),M)

输入:

(n,e)

输入的RSA公钥(k代表RSA模数n的字节长度)

M待加密的数据,一个长度为mLen的字节串,并且mLen<=k-11

输出:

C

密文,长度为k的字节串

错误:

“消息太长”

步骤:

1.长度检查:

如果mLen>k-11,输出“消息太长”并停止。

2.EME-PKCS1-v1_5编码:

a.生成长度为k-mLen-3的字节串PS包含随机生成的非零的伪随机数。

PS的长度最小为8个字节。

b.级联PS,消息M和其它的填充组成长度为k的消息EM

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

3.RSA加密:

a.转化消息EM为整数消息m(参照4.2章)

m=OS2IP(EM)

b.使用RSAEP加密单元使用RSA公钥(n,e)和消息m生成整数密文c。

c.转化整数c为长度为k的密文字节串。

C=I2OSP(c,k)

4.输出密文C。

7.2.2解密操作

RSAES-PKCS1-V1_5-DECRYPT(K,C)

输入:

K

输入的私钥

C待解密的密文,一个长度为k的字节串,k是RSA模数n的字节长度。

输出:

M

消息,一个长度最多为k-11的字节串

错误:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1