基于RSA算法的数字签名系统.docx
- 文档编号:7504703
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:35
- 大小:592.07KB
基于RSA算法的数字签名系统.docx
《基于RSA算法的数字签名系统.docx》由会员分享,可在线阅读,更多相关《基于RSA算法的数字签名系统.docx(35页珍藏版)》请在冰豆网上搜索。
基于RSA算法的数字签名系统
基于RSA算法的数字签名系统
2013年3月
目录
第一章概述1
1.1课题背景1
1.2数字签名及其应用2
1.2.1数字签名概述2
1.2.2数字签名的应用3
1.3课题内容3
第二章数字签名软件的技术支撑4
2.1RSA加密算法4
2.1.1公钥和私钥的产生5
2.1.2加密消息5
2.1.3解密消息5
2.1.4安全6
2.1.5实现细节6
2.2数字签名原理7
2.3散列函数8
2.3.1散列函数的性质8
2.3.2散列函数的应用9
2.3.3MD5算法10
2.3.4SHA-1算法11
2.4C#和.NET12
第三章系统的分析与设计13
3.1需求分析13
3.2总体设计13
3.3功能模块的划分15
3.4各功能模块的介绍16
第四章系统的实现18
4.1RSA加密算法的实现18
4.1.1公私密钥的生成19
4.1.2使用私钥加密20
4.1.3使用公钥解密21
4.1.4其他21
4.2散列函数21
4.3数字签名的实现22
4.3.1设计思想22
4.3.2系统实现24
4.4本章小结33
结束语34
一前言
1.1需求
随着Internet和计算机网络技术的蓬勃发展,连通全世界的电子信息通道已经形成,应用Internet网开展电子商务业务也开始具备实用的条件,电子商务获得长足发展的时机已经成熟。
专家认为,作为21世纪重要经济增长点的电子商务,其作用不亚于200年前的工业革命。
随着世界经济一体化的发展,资金流动越来越快,市场变化也越来越快,各国间经济依存关系更加紧密,发展电子商务的重要性也日益突出。
而且凭借其在增加贸易机会、降低贸易成本、简化贸易流程、提高贸易效率等方面的优势,电子商务也越来越得到全球各个国家的重视和支持。
众所周知,在Internet上的电子商务交易过程中,最核心和最关键的问题就是交易的安全性。
电子商务主要的安全要素包括:
(1)有效性,保证电子形式的贸易信息的有效性是开展电子商务的前提;
(2)机密性,电子商务建立在一个较为开放的网络环境上,维护商业机密是其全面推广应用的重要保障;
(3)完整性,由于数据输入时的意外差错或欺诈行为,可能导致贸易各方信息的差异。
此外,数据传输过程中信息的丢失、信息重复或信息传送的次序差异也会导致贸易各方信息的不同。
贸易各方信息的完整性将影响到贸易各方的交易和经营策略,保持贸易各方信息的完整性是EC(EletronicCommerce电子商务)应用的基础;
(4)可靠性/不可抵赖性/鉴别,在无纸化的EC方式下,通过手写签名和印章进行贸易方的鉴别是不可能的。
因此,要在交易信息的传输过程中为参与交易的个人、企业或国家提供可靠的标识;
(5)审查能力,根据机密性和完整性的要求,应对数据审查的结果进行记录。
所以为了保证电子商务的健康快速发展,上述的安全性必须得到满足。
然而,随着网络的复杂性,网络安全面临着诸多的威胁,如破坏信息的完整性、冒充、抵赖等。
这对电子商务的发展也带了许多不安全的因素。
因此,必须有一个保密完善的机制运用在电子商务中,才可能保证电子商务的安全。
而数字签名便是一个在电子商务交易中维护交易安全的工具。
1.2数字签名及其应用
1.2.1数字签名概述
数字签名是在公钥加密系统的基础上建立起来的,这里首先讲述一下公钥密码的原理:
公钥密码算法使用两个密钥,使用其中一个密钥(称为加密密钥)用于加密,另外一个密钥(称为解密密钥)用于解密。
公钥密码算法具有如下特征:
(1)加密密钥与解密密钥是本质上不同的,也就是说如果仅仅知道密码算法和加密密钥,而要确定解密密钥,在计算上不可行的;
(2)大多数公钥密码算法的加密密钥与解密密钥具有互换的性质。
如RSA算法,密钥对中的一个用于加密,另外一个就用于解密。
数字签名过程一般对于数据摘要信息进行处理,所谓数据摘要就是散列函数对消息处理产生的散列值,也称其为消息的散列值。
摘要信息在数字签名中应用过程可以概述为:
首先使用某种散列算法,对要发送的数据进行处理,生成数据摘要信息;然后采用公钥密码算法,用私钥加密数据摘要信息。
加密后的数据摘要信息就相当于用户的签名,类似于现实生活中的签名和印章。
接收方可以对接收到的签名结果进行验证,以判断签名的有效性。
数字签名在具体实施时,首先发送方对信息施以数学变换,所得到的信息与源信息唯一地对应;在接收方进行逆变换,得到原始信息。
只要数学变换方法优良,变换后的信息在传输中就具有很强的安全性,很难被破译、篡改。
这个发送方的变换过程就是签名,通常是一种加密措施;对应的逆变换过程就是对签名的认证,通常是一种解密措施。
数字签名与传统签字或印章有根本不同,数字签名的基础是公钥密码学,通过数学的手段来达到传统签字的功能。
简单地说,在公钥密码体制中,仅仅签名者自己掌握私钥,而其对应的公钥是公开的,那么签名者用自己的私钥变换数据(加密),其他人就可以利用签名者的公钥来逆变换数据(解密),因为利用其他任何公钥都无法正确逆变换出该私钥变换后的数据,从而就可以鉴别该数据是谁进行的变换处理,亦即是谁的签名。
数字签名具有许多传统签名所不具备的优点,如签名因消息而异,同一个人对不同的消息,其签名结果两者是一个混合的不可分割的整体等。
所以,数字签名比传统签名更具可靠性。
由上述介绍可知,一个签名体制一般包括两个部分:
一个是发送方的签名部分,对消息M签名,可以记作S=Sig(K,M),签字算法使用的密钥是秘密的,即是签字者的私钥。
二是接受方的认证部分,对签名S的验证可以记作Ver(M,S,K)={真,假},认证算法使用的密钥是发送方(即签名者)的公钥。
1.2.2数字签名的应用
数字签名机制作为保障网络信息安全的手段之一,可以解决伪造、抵赖、冒充和篡改问题。
数学签名的目的之一,就是在网络环境中代替传统的手工签字与印章,那么数字签名可以抵御那些网络攻击?
(1)防冒充(伪造)。
其他人不能伪造对消息的签名,因为私有密钥只有签名者自己知道,所以其他人不可能构造出正确的签名结果数据。
显然自己的私有密钥是一定要保存好的。
(2)可鉴别身份。
由于传统的手工签字一般是双方直接见面的,身份自可一清二楚;在网络环境中,接收方必须能够鉴别发送方所宣传的身份。
即接收方使用发送方的公开密钥对签名报文对签名报文进行解密运算,如其结果为明文,则签名有效,证明对方身份是真实的。
(3)防篡改(防破坏信息的完整性)。
传统的手工签字,假如要签署一本200页的合同,是仅仅在合同末尾签名呢?
还是对每一页都签名?
不然,对方会不会偷换其中几页?
这些都是问题所在。
而数字签名,签名与原有文件已经形成了一个混合的整体数据,不可能篡改,从而保证了数据的完整性。
(4)防抵赖。
前面讲了,数字签名可以鉴别身份,不可能冒充伪造,那么,只要保存好签名的报文,就好似保存了手工签署的合同文本,也就是保留了证据,签名者就无法抵赖。
以上是签名者不能抵赖,那如果接收方确已收到对方的签名报文,却抵赖没有收到呢?
要防接收方的抵赖,在数字签名体制中,要求接收方返回一个自己签名的表示收到的报文,给对方或者是第三者,或者引入第三方机制。
如此操作,双方都不可抵赖。
(5)机密性。
有了机密性保证,截收攻击也就失效了。
手工签字的文件是不具备保密性的,文件一旦丢失,文件信息就极可能泄露。
数字签名可以加密要签名的信息,一串密文是不可理解的。
综上所述,对于之前提到的电子商务的安全性因素,数字签名都可以得到保证。
利用数字签名,电子商务可以安全地完成企业之间、企业与消费者之间在网上的商业交换活动。
网上证券也能安全地完成股票交易、网上银行证券转账业务等。
数字签名为这些业务提供了身份鉴别、防抵赖、防篡改等保证,是网上业务可以顺利安全地进行。
1.3内容
数字签名是当前网络安全领域的研究热点。
特别是在电子商务、电子银行、电子政务等应用领域,数字签名是其关键技术之一,在社会生活的各个领域也有极其广阔的应用前景。
密码技术是信息安全的核心技术。
公钥密码在信息安全中担负起密钥协商、数字签名、消息认证等重要角色,已成为最核心的密码。
要求在了解了数字签名技术的基本功能、原理的基础上,设计并实现基于RSA的数字签名算法。
利用RSA算法实现数字签名软件,要求软件可用性强,且操作简便。
它应具有的功能如
(1)对文件所生成的签名进行认证,即提供身份认证;
(2)防止签名方的抵赖,保证签名的不可否认性;
(3)防止签名文件的篡改,即保证数据的完整性。
本系统将从RSA算法和数字签名的原理开始,详细叙述RSA数字签名的完整过程,以及软件的对改系统的具体实现。
分别是系统的技术支撑,系统的分析与设计以及系统实现。
第二章数字签名软件的技术支撑
本章主要介绍系统开发过程中所需要的软件开发技术和算法原理。
主要RSA算法原理,数字签名原理,C#编程技术,以及VisualStudio中的.NET平台。
2.1RSA加密算法
RSA加密算法是一种非对称加密算法。
在公钥加密标准和电子商业中RSA被广泛使用。
RSA是1977年由罗纳德·李维斯特(RonRivest)、阿迪·萨莫尔(AdiShamir)和伦纳德·阿德曼(LeonardAdleman)一起提出的。
当时他们三人都在麻省理工学院工作。
RSA就是他们三人姓氏开头字母拼在一起组成的。
1973年,在英国政府通讯总部工作的数学家克利福德·柯克斯(CliffordCocks)在一个内部文件中提出了一个相应的算法,但他的发现被列入机密,一直到1997年才被发表。
对极大整数做因数分解的难度决定了RSA算法的可靠性。
换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。
假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降。
但找到这样的算法的可能性是非常小的。
今天只有短的RSA钥匙才可能被强力方式解破。
到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。
只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。
但在分布式计算技术和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战。
1983年麻省理工学院在美国为RSA算法申请了专利。
这个专利2000年9月21日失效。
由于该算法在申请专利前就已经被发表了,在世界上大多数其它地区这个专利权不被承认。
2.1.1公钥和私钥的产生
假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息。
她可以用以下的方式来产生一个公钥和一个私钥:
(1)随意选择两个大的质数p和q,p不等于q,计算N=pq。
(2)根据欧拉函数,不大于N且与N互质的整数个数为(p-1)(q-1)
(3)选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)
(4)用以下这个公式计算d:
d×e≡1(mod(p-1)(q-1))
(5)将p和q的记录销毁。
(N,e)是公钥,(N,d)是私钥。
(N,d)是秘密的。
Alice将她的公钥(N,e)传给Bob,而将她的私钥(N,d)藏起来。
2.1.2加密消息
假设Bob想给Alice送一个消息m,他知道Alice产生的N和e。
他使用起先与Alice约好的格式将m转换为一个小于N的整数n,比如他可以将每一个字转换为这个字的Unicode码,然后将这些数字连在一起组成一个数字。
假如他的信息非常长的话,他可以将这个信息分为几段,然后将每一段转换为n。
用下面这个公式他可以将n加密为c:
计算c并不复杂。
Bob算出c后就可以将它传递给Alice。
2.1.3解密消息
Alice得到Bob的消息c后就可以利用她的密钥d来解码。
她可以用以下这个公式来将c转换为n:
得到n后,她可以将原来的信息m重新复原。
解码的原理是
以及ed≡1(modp-1)和ed≡1(modq-1)。
由费马小定理可证明(因为p和q是质数)
和
这说明(因为p和q是不同的质数,所以p和q互质)
2.1.4安全
假设偷听者乙获得了甲的公钥N和e以及丙的加密消息c,但她无法直接获得甲的密钥d。
要获得d,最简单的方法是将N分解为p和q,这样她可以得到同余方程d×e≡1(mod(p-1)(q-1))并解出d,然后代入解密公式
导出n(破密)。
但至今为止还没有人找到一个多项式时间的算法来分解一个大的整数的因子,同时也还没有人能够证明这种算法不存在(见因数分解)。
至今为止也没有人能够证明对N进行因数分解是唯一的从c导出n的方法,但今天还没有找到比它更简单的方法。
(至少没有公开的方法。
)因此今天一般认为只要N足够大,那么黑客就没有办法了。
假如N的长度小于或等于256位,那么用一台个人电脑在几个小时内就可以分解它的因子了。
1999年,数百台电脑合作分解了一个512位长的N。
今天对N的要求是它至少要1024位长。
1994年彼得·秀尔(PeterShor)证明一台量子计算机可以在多项式时间内进行因数分解。
假如量子计算机有朝一日可以成为一种可行的技术的话,那么秀尔的算法可以淘汰RSA和相关的衍生算法(即依赖于分解大整数困难性的加密算法)。
假如有人能够找到一种有效的分解大整数的算法的话,或者假如量子计算机可行的话,那么在解密和制造更长的钥匙之间就会展开一场竞争。
但从原理上来说RSA在这种情况下是不可靠的。
2.1.5实现细节
1.密钥生成
首先要使用概率算法来验证随机产生的大的整数是否质数,这样的算法比较快而且可以消除掉大多数非质数。
假如有一个数通过了这个测试的话,那么要使用一个精确的测试来保证它的确是一个质数。
除此之外这样找到的p和q还要满足一定的要求,首先它们不能太靠近,此外p-1或q-1的因子不能太小,否则的话N也可以被很快地分解。
此外寻找质数的算法不能给攻击者任何信息,这些质数是怎样找到的,尤其产生随机数的软件必须非常好。
要求是随机和不可预测。
这两个要求并不相同。
一个随机过程可能可以产生一个不相关的数的系列,但假如有人能够预测出(或部分地预测出)这个系列的话,那么它就已经不可靠了。
比如有一些非常好的随机数算法,但它们都已经被发表,因此它们不能被使用,因为假如一个攻击者可以猜出p和q一半的位的话,那么他们就已经可以轻而易举地推算出另一半。
此外密钥d必须足够大,1990年有人证明假如p大于q而小于2q(这是一个很经常的情况)而d 此外e=2永远不应该被使用。 2.速度 比起DES和其它对称算法来说,RSA要慢得多。 实际上Bob一般使用一种对称算法来加密他的信息,然后用RSA来加密他的比较短的对称密码,然后将用RSA加密的对称密码和用对称算法加密的消息送给Alice。 这样一来对随机数的要求就更高了,尤其对产生对称密码的要求非常高,因为否则的话可以越过RSA来直接攻击对称密码。 3.密钥分配 和其它加密过程一样,对RSA来说分配公钥的过程是非常重要的。 分配公钥的过程必须能够抵挡一个从中取代的攻击。 假设蛋蛋交给阿庆一个公钥,并使阿庆相信这是小Q的公钥,并且她可以截下小Q和阿庆之间的信息传递,那么她可以将她自己的公钥传给阿庆,阿庆以为这是小Q的公钥。 可以将所有阿庆传递给小Q的消息截下来,将这个消息用她自己的密钥解密,读这个消息,然后将这个消息再用小Q的公钥加密后传给小Q。 理论上小Q和阿庆都不会发现蛋蛋在偷听他们的消息。 今天人们一般用数字认证来防止这样的攻击。 2.2数字签名原理 用RSA算法做数字签名,总的来说,就是签名者用私钥参数d加密,也就是签名;验证者用签字者的公钥参数e解密来完成认证。 下面简要描述数字签名和认证的过程。 1、生成密钥 为用户随机生成一对密钥: 公钥(e,n)和私钥(d,n). 2、签名过程 (1)计算消息的散列值H(M). (2)用私钥(d,n)加密散列值: s=(H(M)) modn,签名结果就是s. (3)发送消息和签名(M,s). 3、认证过程 (1)取得发送方的公钥(e,n). (2)解密签名s: h=s modn. (3)计算消息的散列值H(M). (4)比较,如果h=H(M),表示签名有效;否则,签名无效。 根据上面的过程,我们可以得到RSA数字签名的框图如图2-1: 图2-1RSA数字签名框图 2.3散列函数 散列函数(或散列算法,英语: HashFunction)是一种从任何一种数据中创建小的数字“指纹”的方法。 该函数将数据打乱混合,重新创建一个叫做散列值的指纹。 散列值通常用来代表一个短的随机字母和数字组成的字符串。 好的散列函数在输入域中很少出现散列冲突。 在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到。 2.3.1散列函数的性质 所有散列函数都有如下一个基本特性: 如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。 这个特性是散列函数具有确定性的结果。 但另一方面,散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值很可能是相同的。 但也可能不同,这种情况称为“散列碰撞”,这通常是两个不同长度的散列值,刻意计算出相同的输出值。 输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值。 典型的散列函数都有无限定义域,比如任意长度的字节字符串,和有限的值域,比如固定长度的比特串。 在某些情况下,散列函数可以设计成具有相同大小的定义域和值域间的一一对应。 一一对应的散列函数也称为排列。 可逆性可以通过使用一系列的对于输入值的可逆“混合”运算而得到。 2.3.2散列函数的应用 由于散列函数的应用的多样性,它们经常是专为某一应用而设计的。 例如,加密散列函数假设存在一个要找到具有相同散列值的原始输入的敌人。 一个设计优秀的加密散列函数是一个“单向”操作: 对于给定的散列值,没有实用的方法可以计算出一个原始输入,也就是说很难伪造。 为加密散列为目的设计的函数,如MD5,被广泛的用作检验散列函数。 这样软件下载的时候,就会对照验证代码之后才下载正确的文件部分。 此代码有可能因为环境因素的变化,如机器配置或者IP地址的改变而有变动。 以保证源文件的安全性。 错误监测和修复函数主要用于辨别数据被随机的过程所扰乱的事例。 当散列函数被用于校验和的时候,可以用相对较短的散列值来验证任意长度的数据是否被更改过。 1.加密 一个典型的加密单向函数是“非对称”的,并且由一个高效的散列函数构成;一个典型的加密暗门函数是“对称”的,并且由一个高效的随机函数构成。 2.散列表 散列表是散列函数的一个主要应用,使用散列表能够快速的按照关键字查找数据记录。 (注意: 关键字不是像在加密中所使用的那样是秘密的,但它们都是用来“解锁”或者访问数据的。 )例如,在英语字典中的关键字是英文单词,和它们相关的记录包含这些单词的定义。 在这种情况下,散列函数必须把按照字母顺序排列的字符串映射到为散列表的内部数组所创建的索引上。 散列表散列函数的几乎不可能/不切实际的理想是把每个关键字映射到唯一的索引上(参考完美散列),因为这样能够保证直接访问表中的每一个数据。 一个好的散列函数(包括大多数加密散列函数)具有均匀的真正随机输出,因而平均只需要一两次探测(依赖于装填因子)就能找到目标。 同样重要的是,随机散列函数不太会出现非常高的冲突率。 但是,少量的可以估计的冲突在实际状况下是不可避免的(参考生日悖论或鸽洞原理)。 在很多情况下,heuristic散列函数所产生的冲突比随机散列函数少的多。 Heuristic函数利用了相似关键字的相似性。 例如,可以设计一个heuristic函数使得像FILE0000.CHK,FILE0001.CHK,FILE0002.CHK,等等这样的文件名映射到表的连续指针上,也就是说这样的串行不会发生冲突。 相比之下,对于一组好的关键字性能出色的随机散列函数,对于一组坏的关键字经常性能很差,这种坏的关键字会自然产生而不仅仅在攻击中才出现。 性能不佳的散列函数表意味着查找操作会退化为费时的线性搜索。 3.错误校正 使用一个散列函数可以很直观的检测出数据在传输时发生的错误。 在数据的发送方,对将要发送的数据应用散列函数,并将计算的结果同原始数据一同发送。 在数据的接收方,同样的散列函数被再一次应用到接收到的数据上,如果两次散列函数计算出来的结果不一致,那么就说明数据在传输的过程中某些地方有错误了。 这就叫做冗余校验。 对于错误校正,假设相似扰动的分布接近最小(adistributionoflikelyperturbationsisassumedatleastapproximately)。 对于一个信息串的微扰可以被分为两类,大的(不可能的)错误和小的(可能的)错误。 我们对于第二类错误重新定义如下,假如给定H(x)和x+s,那么只要s足够小,我们就能有效的计算出x。 那样的散列函数被称作错误校正编码。 这些错误校正编码有两个重要的分类: 循环冗余校验和里德所罗门码。 4.语音识别 对与像从一个已知列表中匹配一个MP3文件这样的应用,一种可能的方案是使用传统的散列函数——例如MD5,但是这种方案会对时间平移、CD读取错误、不同的音频压缩算法或者音量调整的实现机制等情况非常敏感。 使用一些类似于MD5的方法有利于迅速找到那些严格相同(从音频文件的二进制数据来看)的音频文件,但是要找到全部相同(从音频文件的内容来看)的音频文件就需要使用其他更高级的算法了。 那些并不紧随IT工业潮流的人往往能反其道而行之,对于那些微小差异足够鲁棒的散列函数确实存在。 现存的绝大多数散列算法都是不够鲁棒的,但是有少数散列算法能够达到辨别从嘈杂房间里的扬声器里播放出来的音乐的鲁棒性。 有一个实际的例子是Shazam[1]服务。 用户可以用电话机拨打一个特定的号码,并将电话机的话筒靠近用于播放音乐的扬声器。 该项服务会分析正在播放的音乐,并将它于存储在数据库中的已知的散列值进行比较。 用户就能够收到被识别的音乐的曲名(需要收取一定的费用)。 2.3.3MD5算法 MD5即Message-DigestAlgorithm5(信息-摘要算法5),用于确保信息传输完整一致。 是计算机广泛使用的散列算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。 将数据(如汉字)运算为另一固定长度值,是散列算法的基础原理,MD5的前身有MD2、MD3和MD4。 1992年8月RonaldL.Rivest在向IETF提交了一份重要文件,描述了这种算法的原理,由于这种算法的公开性和安全性,在90年代被广泛使用在各种程序语言中,用以确保资料传递无误等。 MD5由MD4、MD3、MD2改进而来,一度主要增强算法复杂度和不可逆性。 MD5一度被广泛应用于安全领域。 但是由于MD5的弱点被不断发现以及计算机能力不断的提升,现在已经可以构造两个具有相同MD5的信息,使本算法不再适合当前的安全环境。 目前,MD5计算广泛应用于错误检查。 例如在一些BitTorrent下载中,软件通过计算MD5和检验下载到的碎片的完整性。 MD5较老,散列长度通常为128位,随着计算机运算能力提高,找到“碰撞”是可能的。 因此,在安全要求高的场合不使用MD5。 2004年,王小云证明MD5数字签名算法可以产生碰撞。 2007年,MarcStevens,ArjenK.Lenstra和BennedeWeger进一步指出通过伪造软件签名,可重复性攻击MD5算法。 研究者使用前缀碰撞法(chose
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 RSA 算法 数字签名 系统