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


8.1.2  签名验证运算
RSASSA-PSS-VERIFY  ((n, e), M, S)
输入:(n, e)签名者的RSA公钥
M        签名待验证的消息,是一个八位组串
S         待验证的签名,是一个长度为k的八位组串,其中k是RSA合数模n的八位组长度
输出:“有效的签名”或者“无效的签名”
步骤:
(1)长度检查: I如果签名S的长度不是k个八位组,则输出“无效的签名”然后中止运算。.
(2)RSA验证:
a.将签名S转换为一个整数签名代表s:
s = OS2IP (S) 。
b.将RSAVP1验证原语作用于RSA 公钥(n, e)和签名代表,从而产生一个整数消息代表m :
m = RSAVP1  ((n, e), s) 。
如果RSAVP1输出“签名代表超出范围”,则输出“有效的签名”然
后终止运算。
c.将消息代表m转换成长度为emLen = (modBits – 1)/8个八位组的编码消息EM,其中modBits是RSA合数模n的比特长度
EM = I2OSP (m, emLen) 。
注意:如果modBits – 1能被8整除,那么emLen将比k小1;如果输出“整数太大”,则输出“无效的签名”然后中止运算。
(3)EMSA-PSS验证: 将EMSA-PSS验证运算作用于消息M和编码消息
EM,以辨别它们是否一致:
Result = EMSA-PSS-VERIFY (M, EM, modBits – 1) .
(4)如果Result =“consistent”,则输出“有效签名”。否则,输出“无
效的签名”。



9  带附属的签名的编码方法
编码方法由在八位组串消息和八位组串编码消息之间进行变换的运算构成,而在方案中八位组串编码消息和证书消息代表互相转换。整数消息代表是通过原语进行转换的。因此编码方法在处理消息的方案和原语之间提供了连接。
就本篇文档而言,一个带附属的签名的编码方法由一个编码操作和一个可选的验证操作组成。一个编码操作将一个消息M变换为一个规定长度的编码消息EM。一个验证运算决定一个消息M和一个编码消息EM是否一致,也就是说,编码消息EM是否是消息M的有效编码。
编码运算可能引入一些随机因素,以便对于同一个消息的进行编码运算的不同应用程序将产生不同的编码消息,这一点有利于可证实的安全性。对于这样一个编码方法,同时需要一个编码运算和一个验证运算,除非验证者能够重新产生随机因素(例如,通过从签名者那里获得salt的值)。对于确定的编码方法,只需要一个编码运算。
在签名方案中使用了带附属的签名的编码方法,这里定义为:EMSA-PSS。
9.1  EMSA-PSS
通过选择散列函数、掩模生成函数和salt的长度,可以是编码方法参数化。对于给定的RSA密钥,除了salt的长度可变之外,其它选项应该是固定的。在附录B中给出了建议的散列函数和掩模生成函数。这个编码方法是基于Bellare和Rogaway的概率签名方案(PSS:Probabilistic Signature Scheme)。这个编码方案被随机化了,而且有一个编码运算和一个验证运算。
下面说明了这个编码运算

注释:
(1)这里定义的编码方法与Bellare 和Rogaway给IEEE P1363a [2]的建议中的编码方法在三个方面不同:
        它对消息使用散列函数而不是掩模生成函数。尽管掩模生成函数是基于一个散列函数的,但直接 使用一个散列函数似乎更加自然。
        与salt值一道被散列化的值是串(0x)00 00 00 00 00 00 00 00 || mHash 而不是消息M 本身。这里,mHash 是M 的散列。注意在两个步骤中散列函数是相同的。进一步的讨论见下面的注释3。(同样,使用名称“salt”而不是“seed”是由于“salt”更能体现该值的角色。)
        EMSA-PSS中的编码消息有九个固定的比特;第一个比特是0,最后八个比特形成一个“尾部域”,即八位组0xbc。在最初的方案中,只有第一个比特是固定的。尾部域的基本原理是为了与IEEE Std 1363-2000中的Rabin-Williams IFSP-RW签名原语以及在草案ISO/IEC 9796-2中的对应原语兼容。
(2)假设掩模生成函数是基于一个散列函数的,建议这个散列函数与应用于消息的散列函数一样;进一步的讨论参见8.1部分。
(3)在没有危及RSASSA-PSS的安全坚固性的情况下,可以在计算签名运算的其余部分的模块之外执行EMSA-PSS-ENCODE的第1和第2步以及EMSA-PSS-VERIFY(散列函数对消息的应用),以便该模块的输入是mHash而不是消息M本身。换句话说,即使对手能够控制mHash的值,仍能保持RSASSA-PSS的安全坚固性。如果这个模块限制了I/O带宽(例如,一块智能卡),那么这是方便的。[2]的先前版本没有这性质。当然,让其它安全理由使这个模块处理整个消息是件吸引人的事。举例来说,如果这个模块不信任负责计算散列值的组件,它可能需要“看到”它正在签名的是什么。
(4)salt的典型的八位组长度是hLen(散列函数Hash的输出的长度)和0。在两种情况下,RSASSA-PSS的安全性与使RSAVP1反向运算的难度密切相关。Bellare 和Rogaway为最初的RSA-PSS方案指定了一个极度低级的界限,这粗略地与前一种情况对应;而Coron [7]为相关的全域散列法方案制定了一个较低级的界限,这粗略地与后一种情况对应。在[8]中Coron提供了一个通用的处理各种salt长度(从0到hLen)的方法;。[8]中的安全坚固性,以提出RSA-PSS最初的和目前的版本的不同之处(就是上面注释1中所列的)。
(5)就像在IEEE P1363a中注释的,在签名方案中使用随机化——诸如EMSA-PSS中的salt值——可以为传送信息而不是被签名的消息提供一个“变换通道(covert channel)”。
9.1.1  编码运算
EMSA-PSS-ENCODE (M, emBits)
选项:Hash 散列函数(hLen表示散列函数的输出的八位组长度)
MGF 掩模生成函数
sLen        期望的salt的八位组长度
输入:M  待编码的消息,是一个八位组串
emBits        整数OS2IP(EM)的最大比特长度,至少为8hLen + 8sLen + 9
输出:EM编码后的消息,是一个长度为emLen = emBits/8的八位组串
出错提示:        “编码出错”;“消息太长”
步骤:
(1)如果M的长度超出散列函数的输入限制(SHA-1的限制是261 – 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。
9.1.2  验证操作
EMSA-PSS-VERIFY (M, EM, emBits)
选项:Hash 散列函数(hLen散列函数的输出的八位组长度)
MGF        掩模生成函数
sLen        期望的salt的八位组长度
输入:        M   待验证的消息,是一个八位组串
EM        编码消息,是一个长度为emLen = emBits/8的八位组串
        emBits        整数OS2IP (EM)(参见0部分)的最大比特长度,至少是8hLen + 8sLen + 9
输出:        “一致”或者“不一致”
步骤:
(1)如果M的长度大于散列函数的输入限制(SHA-1的输入限制是261 – 1),
(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’,则输出“一致”;否则,输出“不一致”。










A  支撑技术
本部分给出了几个关于支持第7部分中的加密方案和第9部分中的编码方案的基础函数的例子。为了移植到新技术上也为了与已存在的应用程序兼容,这里给出了一个技术范围。尽管这些支撑技术适合用应用程序实现,但是它们之中没有一个需要被实现。希望开发描述特定技术的PKCS #1 v2.1文档。
这个部分也给支撑技术指定了对象标识。
A.1  散列函数
散列函数是确定性的,意思是输出完全有输入决定。散列函数接纳可变长度的八位组串,然后生成固定长度的八位组串。运算使用的散列函数有时是限制冲突的。这意味着要找到有相同输出的散列函数的两个不同的输入是不可行的。一个限制冲突散列函数也具有吸引人的单方性能;这意味着给定一个输出,就不可能找到一个输入,使它的散列就事给定的输出。除了这些技术规格,用伪随机输出散列函数会产生一个掩模生成函数。
本篇文档中给出六个编码函数的散列函数作为例子:MD2、 MD5、 SHA-1以及申请算法SHA-256、SHA-384和SHA-512。对于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
}
在类型为AlgorithmIdentifier 的值中,与这些对象标识联系的parameters域应该具有类型为NULL的值。
注释:PKCS #1的版本1.5也允许在签名方案中使用MD4。MD4的密码分析在这几年里取得了重大的进展。举例来说,Dobbertin [13]证实了如何找到MD4的冲突数据,而且MD4的前两round不是单方的。由于这些结果以及其它结果,不再推荐使用MD4。MD2和MD5的密码分析中也有进展,尽管还不足以正名从以存在的应用程序中删除是正当的。Rogier 和 Chauvaud证实了如何在MD2的修改版本中找到冲突数据。没有人证实如何找到所有MD5算法的冲突数据,尽管部分结果已经被发现。
为了address these concerns,不推荐新应用程序使用SHA-1、SHA-256 、SHA-384或者SHA-512。就今天来说,针对这些散列函数的最著名的攻击是带复杂度2L/2的类属攻击,其中L是散列函数输出的比特长度。对于本篇文档中的签名方案,一个冲突数据攻击很容易就转化成一个签名伪造。因此,值L / 2应该至少等于签名方案期望的安全等级的比特长度(B比特安全等级意思是攻击具有的复杂度为2B)。同样的拇指规则能够应用于RSAES-OAEP;建议seed的比特长度(等于散列函数输出的比特长度)应该为期望安全等级的比特长度的两倍。
A.2  掩模生成函数
一个掩模生成函数将一个可变长度的八位组串和一个期望的输出长度作为输入,并且输出一个具有期望长度的八位组串。对输入长度方面和输出八位组可能有限制,但是这种界限一般非常大。一个掩模生成函数的数出应该是伪随机的:给定输出而RSASSA-PSS不是输入的一部分,预算另一部分输出是不可能的。RSAES-OAEP和RSASSA-PSS的可证实安全性赖于掩模生成函数输出的随机本质,而输出的随机性反过来依赖于基础散列的随机本质。
这里给定一个掩模生成函数:MGF1,它依赖于散列函数。MGF1与IEEE Std 1363-2000以及草案ANSI X9.44中定义的掩模生成函数一致。本篇文档的今后版本可以定义其它掩模生成函数。
A.2.1  MGF1
MGF1 是一个基于散列函数的掩模生成函数。
MGF1 (mgfSeed, maskLen)
选项:Hash 散列函数(hLen表示散列函数输出的八位组长度)
输入:mgfSeed        掩模生成所用的seed,使一个八位组串
        maskLen        期望的掩模的八位组长度,至多是232 hLen
输出:mask掩模,使一个长度为maskLen的八位组
出错提示:“掩模太长”
步骤:
(1)askLen > 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所依赖的散列函数。

结论
      
本论文的研究对象是RSA密码算法体制,RSA数字签名的实现,及研究原理及相关算法,并实现之。RSA是目前最为流行、应用最广泛的公开密钥算法,许多密码系统中都嵌入有它。
RSA不仅可以用于加密解密,还能够完成签名验证功能。对于一个密码算法来讲,安全性是其最重要的性能指标。虽然目前还不能从理论上证明RSA的安全性,但是,普遍任务,其安全性等价于分解摸数n,而大数的因子分解又是数学上的难解的问题,因此,可以说,在足够的情况下,RSA是安全的。更具有说服力的是,从1978年RSA诞生至今二十多年,仍然无法找到有效的攻击方法,事实胜于雄辩,显然,RSA的安全性很强。
但是,1024比特长的大数远算,使得RSA的速度比较慢,因此,必须想方.设法加快其速度。这主要有两种手段,一为选用快速算法,一为选用高性能的器件。
目前,对RSA的研究,本人认为可考虑能否将一些优秀的数字信号处理器件结合使用,以求得到更好的效果.



参考文献

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

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