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的字节串
错误: