PKCS#1v21RSA密码学规范.docx
- 文档编号:9430892
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:41
- 大小:34.67KB
PKCS#1v21RSA密码学规范.docx
《PKCS#1v21RSA密码学规范.docx》由会员分享,可在线阅读,更多相关《PKCS#1v21RSA密码学规范.docx(41页珍藏版)》请在冰豆网上搜索。
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的字节串 错误:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PKCS v21RSA 密码学 规范