RSA数字签名的实现毕业论文 第4页


RSAES-OAEP-ENCRYPT ((n, e), M, L)
可选项:        Hash        哈希函数(hLen 表示散列函数输出的以八位组为计量单位的长度)
MGF        掩模生成函数
输入:(n, e)接收方的RSA 公钥(k 表示RSA合数模 n 的以八位组为计量单位的长度)
M 待加密的消息,是一个长度为mLen 的八位组串,其中 mLen  k – 2hLen – 2
L 消息的可选附加标签;如果没有提供L,那么L 的默认值是空串
输出:C 密文,一个长度为k 的八位组串
出错提示:“消息太长”;“标签太长”
假设:RSA公钥(n, e) 是有效的
步骤:
(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.
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。


注释:如果L是空串,相应的散列值lHash具有下列十六进制值代表哈希函数的不同选择。
SHA-1:  (0x)da39a3ee 5e6b4b0d 3255bfef 95601890 afd80709
SHA-256:(0x)e3b0c442 98fc1c14 9afbf4c8 996fb924 27ae41e4 649b934c a495991b 7852b855
SHA-384:        (0x)38b060a7 51ac9638 4cd9327e b1b1e36a 21fdb711 14be0743 4c0cc7bf 63f6e1da
                            274edebf e76f65fb d51ad2f1 4898b95b
SHA-512:        (0x)cf83e135 7eefb8bd f1542850 d66d8007 d620e405 0b5715dc 83f4a921 d36ce9ce
47d0d13c 5d85f2b0 ff8318d2 877eec2f 63b931bd 47417a81 a538327a f927da3e
7.1.2  解密运算
RSAES-OAEP-DECRYPT (K, C, L)
选项:        Hash散列函数哈希(hLen 表示散列函数的输出的以八位组为计量单位的长度)
MGF        掩模生成函数
输入:        K 接受方的RSA私钥(k表示RSA合数模n的以八位组为计量单位的长度)
        C 待解密的密文,使一个长度为k的八位组串,其中k ≥ 2hLen + 2
L        可选标签,其与消息的联系将得到验证;如果没有提供L值,则L的默认值为空串。
输出:        M 消息,是一个长度为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:

EM = I2OSP (m, k) 。
(3)EME-OAEP编码:
a.如果未提供标签L的值,则使L的值为空串。使lHash = Hash (L),这是一个长度为hLen的八位组串(见0部分的注释)。
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:
注释:必须确保对手无法在步骤0中分辨出不同的出错条件,防止对手了解关于编码消息EM的部分信息,无论是通过出错消息或是定时,或者更一般的。否则对手可能能够获得关于密文C的解密的有用信息,进而导致像Manger发现的攻击手法一样的选择密文攻击。











8  带附属的签名方案
就本篇文档而言,一个带附属的签名方案包括一个签名生成运算和一个签名验证运算,其中签名生成运算利用签名者的RSA私钥产生一个签名,而签名验证运算利用签名者对应的RSA公钥验证消息上的签名。为了验证用这种方案产生的签名,验证者必须拥有消息本身。所以说,带附属的签名方案与带消息恢复的签名方案不同,本篇文档不讨论带消息恢复的签名方案。
一个带附属的签名方案可以用于各种应用程序中。举例来说,这里定义的带附属的签名方案是适合于X.509的签名算法。尽管由于技术原因,PKCS #7当前版本将散列函数从签名方案(这个方案与这里提到的不一样)中分离出来,但相关的签名方案可以用在PKCS #7中;更多的讨论,请参见附录A.2.3的注释。
这里给定的带附属的签名方案遵循一般的模型,即将签名和验证原语与针对签名的编码方法结合起来。签名生成运算对消息进行消息编码运算以产生一个编码消息,随后该编码消息将被转换成一个整数消息代表。签名原语作用于消息代表,从而产生一个签名。与此相反,签名验证运算将签名验证原语应用于签名,以恢复出消息代表,然后消息代表被转换成一个编码后的八位组串消息。验证运算作用于这个消息和编码后的消息,以判断它们俩是否一致。
如果编码方法是确定性的(例如,EMSA-PKCS1-v1_5),验证运算可以对消息进行消息编码运算,并将运算结果——编码消息与先前获得的编码消息对比。如果匹配,则签名被认为是有效的。如果编码方法是随机的(如EMSA-PSS),那么验证运算会更加复杂。举例来说,EMSA-PSS验证操作从编码后的消息中提取随即salt和一个散列输出,并检查该散列输出、salt和消息是否一致;从消息和salt方面来说,散列输出是一个确定的函数。
对于在本篇文档中定义的带附属的签名方案来说,如果签名放在消息的后面,签名生成运算和签名验证运算就像“单方传送”运算一样容易实现。
8.1  RSASSA-PSS
RSASSA-PSS将RSASP1和 RSAVP1原语与EMSA-PSS编码方法结合起来。它与在IEEE P1363a 草案中修订过的IFSSA方案兼容IFSSA方案,IFSSA方案中的签名和验证原语是IEEE Std 1363-2000中定义的IFSP-RSA1 和IFVP-RSA1,而消息编码方法是EMSA4。由于EMSA4是作用于比特串而不是八位组串的,所以它比EMSA-PSS更通用。当限制于运算体和散列、salt均为八位组串的情况下,EMSA-PSS等同于EMSA4。
RSASSA-PSS能够运算的消息的长度可以是不受限制的也可以受一个相当大的数的约束,这取决于EMSA-PSS编码方法基于的散列函数。
假设计算eth roots modulo n是可行的,EMSA-PSS中的散列函数和掩模生成函数具有适当的属性,RSASSA-PSS提供安全签名。如果散列函数和掩模生成函数被看作是黑盒子或者是随机启示程序,在伪造签名的难度可以直接与使RSA函数反向的难度关联的意义上,这个保证是可证实的。安全验证的边界本质上是“紧的”,意思是对于最好的伪造者来说,成功的可能性和运行时间非常接近于最好的RSA反向算法的对应参数。
与RSASSA-PKCS1-v1_5签名方案对比,EMSA-PSS编码消息中不嵌入散列函数标识,所以在理论上,对手可能用一个不同的散列函数来替换由签名者选择的散列函数。因此,建议将EMSA-PSS掩模生成函数基于同一个散列函数。以这种方式,整个编码后的消息将依赖于散列函数,而且对手将难以用一个不同的散列函数来替换由签名者选择的散列函数。匹配散列函数只是为了防止散列函数被替换,而且如果采用其他方法(例如,验证者只接受指定的散列函数)防止散列函数被替换,则不需要匹配散列函数。RSASSA-PSS的可证实的安全性不依赖于掩模生成函数中的散列函数(与应用于消息的散列函数一样)。
由于结合了随即生成salt的值,因此RSASSA-PSS与其它基于RSA的签名方案的不同之处在于它是概率性的而非确定性的。通过提供一个比确定性的可供选择方案(诸如全域散列法(FDH))更加“严密的”安全验证,Salt值增强了这个方案的安全性。然而,对安全性来说随机并非关键所在。由于最后的可证实安全性与FDH[7]的相似,在随机生成不可能实现的情况下,一个固定值或者一串数字可以取代之。
8.1.1  签名生成运算
RSASSA-PSS-SIGN (K, M)
输入:K 签名者的RSA 私钥
M        待签名的消息,是一个八位组串
输出:S        签名,是一个长度为k 的八位组串,这里k是RSA合数模n的以八位组为计量单位的长度
出错提示:“消息太长”,“编码出错”
步骤:
(1)EMSA-PSS编码:将EMSA-PSS编码运算(见9.1.1部分)应用于消息M,从而产生一个长度为(modBits – 1)/8个八位组的编码消息EM,以至于整数OS2IP (EM)的比特长度至少是modBits – 1,其中modBits是RSA合数模的比特长度。
EM = EMSA-PSS-ENCODE (M, modBits – 1) 。
注意如果modBits – 1可以被8整除,那么EM的八位组长度将比k小1;否则就等于k。如果编码运算输出“消息太长”,则“消息太长”然后中止运算。如果编码运算输出“编码出错”,输出“编码出错”然后中止运算。
(2)RSA签名:
a.将编码消息EM转换成一个整数消息代表m:
m = OS2IP (EM) 。
b.将RSASP1 签名原语(见5.2.1部分)应用于RSA 私钥K 以及消息代表m ,以产生一个整数签名代表s:
s = RSASP1 (K, m) 。
c.将签名代表s转换成长度为k个八位组的签名S:
S = I2OSP (s, k) 。
(3)输出签名代表S。

上一页  [1] [2] [3] [4] [5] [6] 下一页

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有