1、第四,详述了RSA数字签名的设计与实现,主要实现的模块包括RSA密钥的产生(一对公钥和私钥),RSA加密算法和解密算法的实现,消息摘要MD的生成以及利用RSA算法实现数字签名和签名的验证;第五,对该系统进行了整体的测试和分析改进;第六,分析了RSA数字签名的安全性,指出了RSA数字签名的发展方向。关键词: RSA算法;加密; 解密;RSA数字签名目 录基于RSA的数字签名的设计 1一. 绪论 11.1 研究背景 11.2 本课题的研究意义 1二. RSA算法和RSA数字签名算法的基本概念和原理 22.1 RSA算法的基本概念 22.2 RSA算法的基本原理 3三. RSA数字签名的设计与实现
2、33.1 RSA数字签名的总体设计 33.1.1 RSA数字签名所需实现的功能 33.1.2 本软件的总体要求和设计 43.2 各部分的设计实现 43.2.1 密钥产生的实现 43.2.2 产生消息摘要的设计实现 83.2.3 数字签名的设计实现 8四. 结果展示 9五. 结论 9参考文献 10基于RSA的数字签名的设计一. 绪论1.1 研究背景随着电子信息技术的迅速发展,人类已步入信息社会。但是由于整个社会形成了一个巨大的计算机网络,任何一个计算机网络出现的安全问题,都会影响整个国家的网络安全,所以信息安全、计算机网络安全问题已引起了人类的高度重视。无论是在局域网还是在广域网中,都存在着自然
3、和人为等诸多因素的脆弱性和潜在威胁。故此,网络的安全措施应是能全方位地针对各种不同的威胁和脆弱性,这样才能确保网络信息的保密性、完整性和可用性。针对网络安全的威胁主要有三方面:(1)人为的无意失误;(2)人为的恶意攻击;(3)网络软件的漏洞和“后门”。 现代密码学已成为信息安全技术的核心,密码学是以研究通信安全保密的学科,即研究对传输信息采用何种秘密的变换以防止第三者对信息的窃取。密码学包括两个分支:密码编码学和密码分析学。密码编码学主要研究对信息进行交换,以保护信息在信道的传递过程中不被他人窃取、解密和利用的方法,而密码分析学则与密码编码学相反,它主要研究如何分析和破译密码。两者之间既相互对
4、立又相互促进。密码体制的分类有很多,其中一种是根据加密算法和解密算法所使用的密钥是否相同,可以将密码体制分为对称密钥密码体制(单钥密码体制)和非对称密钥密码体制(公钥密码体制),这两种密码体制各有自己的长处和短处,因此现在采用了两种的混合体,如PGP。1.2 本课题的研究意义随着电子商务的发展,网络上资息的伪造和欺骗成为非常重要的问题。在计算机通信系统中,维护电子文档的安全也成为至关重要和非常敏感的问题。为保护信息的安全,数字签名应运而生金的电子交换日益频繁,如何防止信,它是现代密码学主要研究的内容之一。目前关于数字签名的研究主要集中点是基于公钥密码体制的数字签名。在公钥密码体制中,解密和加密
5、密钥不同,解密和加密可分离,通信双方无须事先交换密钥就可建立起保密通信,因此它较好地解决了传统密码体制在网络通信中出现的问题。手写签名的每一项业务都是数字签名的潜在用场。数字签名可以提供数据完整性、真实性和不可否认性。因而当需要对某一实体进行认证、传输具有有效性的密钥以及进行密钥分配时,便可以借助数字签名来完成任务。数字签名技术在身份识别和认证、数据完整性、抵赖等方面具有其它技术无法替代的作用,它在军事、电子商务和电子政务等领域有着极广泛的应用。而在公钥体制中,RSA是一个较为完善的公钥密码算法,不仅能够同时用于加密和数字签名,而且易于理解和操作,是被广泛研究的公钥密码算法。因此,基于RSA的
6、数字签名具有较强的研究性和实际应用意义。二. RSA算法和RSA数字签名算法的基本概念和原理二.1 RSA算法的基本概念RSA公开密钥加密算法自20世纪70年代提出以来,已经得到了广泛认可和应用。发展至今,电子安全领域的各方面已经形成了较为完备的国际规范。RSA作为最重要的公开密钥算法,在各领域的应用数不胜数。RSA在硬件方面,以技术成熟的IC应用于各种消费类电子产品。RSA在软件方面的应用,主要集中在Internet上、加密连接、数字签名和数字证书的核心算法广泛使用RSA。RSA算法是一种公钥密码算法,实现RSA算法包括生成RSA密钥,加密和解密数据。RSA算法是第一个能同时用于加密和数字签
7、名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NP-C问题。RSA的缺点主要有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。B)分组长度太大,为保证安全性,n 至少也要 600 bits二.2 RSA算法的基本原理1) 随机选择两个不同的素数p和q,它们的宽度是密钥宽度的二分之一
8、。2) 计算出p和q的乘积n 。3) 在2和(n)之间随机选择一个数e , e 必须和(n)互素,整数e用做加密密钥(其中(n)=(p-1)*(q-1)。4) 从公式ed 1 mod (n)中求出解密密钥d 。5) 得公钥(e ,n ), 私钥 (d , n) 。6) 公开公钥,但不公开私钥。7) 将明文P (假设P是一个小于n的整数)加密为密文C,计算方法为:C = Pe mod n8) 将密文C解密为明文P,计算方法为:P=Cd mod n然而只根据n和e(不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密。三. RSA数字签名的设计与
9、实现三.1 RSA数字签名的总体设计三.1.1 RSA数字签名所需实现的功能在本软件中需要实现的功能有以下几个:(1)生成RSA密钥:公钥ke=(e,n),私钥kd=(d,n);(2)利用MD5算法计算出消息摘要MD;(3)数字签名的实现:用私钥d对消息摘要进行加密计算(RSA算法中的加密方法);(4)验证数字签名:用公钥e对数字签名进行解密计算(RSA算法中的解密方法),得到的解密结果与(2)步计算出的消息摘要比较,如果两个消息摘要一样则签名成功。三.1.2 本软件的总体要求和设计本软件的总体要求有:1)按要求生成非对称密钥公钥和私钥;2)按任意写入的的消息字符串(明文信息)生成所需要的消息
10、摘要MD;3)在本设计中用产生的私钥d根据RSA算法的加密原理对所生成的消息摘要进行加密运算,得到数字签名;4)在本设计中用产生的公钥e根据RSA算法的解密原理对所加密的消息摘要即数字签名进行解密运算,得到对应的消息摘要(在本设计中标示的为解密信息),比较两个消息摘要,验证数字签名者的身份的真实与否;5)提示信息完整、操作舒适、图形界面雅观。本软件的总体设计都是基于C+的开发环境,采用的是Microsoft Visual c+ 6.0的运行环境。三.2 各部分的设计实现三.2.1 密钥产生的实现在密钥的产生部分中起决定性作用的是素数的选择, 对随机数作素性检测,若通过则为素数;否则增加一个步长
11、后再做素性检测,直到找出素数。素性检测采用Fermat测试。这个算法的理论依据是费尔马小定理:如果m是一个素数,且a不是m的倍数,那么根据费尔马小定理有:a m-1=1 ( mod m)。 实际应用时:a m-1 = 1 ( mod m) a m = a ( mod m) a= a m ( mod m), 因此对于整数m,只需计算a m ( mod m),再将结果与a比较,如果两者相同,则m为素数。选取a=2,则a一定不会是任何素数的倍数。根据所选的素数的不同产生不同的密钥。密钥的理论产生模块流程图如图3-1所示:产生任意素数p和q计算n=p*q 计算ou_la=(p-1)(q-1) 选择e作
12、为公钥 计算d作为私钥 密钥产生的部分代码实现: CString str; /第一步 产生任意素数 GeneratePrimeNumbers(); /第二步 计算 n=p*q m_n = m_Prime1 * m_Prime2; /第三步 0=(p-1)(q-1) m_Undef = (m_Prime1-1) * (m_Prime2-1); /第四步 选择e SelectE(); /第五步 计算D CalculateD(); /显示公钥和私钥 /(1) 公钥 KU=e,n str.Format(%d, %d,m_e,m_n); m_public_key.SetWindowText(str);
13、/(2) 私钥KU=d,n,m_d,m_n); m_private_key.SetWindowText(str); / 选择一个 使 与 m_Undef互素/选择e的函数的实现SelectE() CString str;for(float i=2;i100000;i+) if(IsRelativePrime(float)m_Undef,(float)i) m_e=(long)i; return; /互为素数的函数的实现IsRelativePrime(float X,float Y) float R;/输入: X,Y if(XY)/如果X较小则交换两个值 X=X+Y; Y=X-Y; X=X-Y; /在这时X总是比Y大 for(;) if(Y=0) break; R=fmod(X,Y); X=Y; Y=R;if(X != 1) return false; else return true;/互素/ 计算D的函数的实现CalculateD() float d; long d_dash; for(float k=1;kk+) d=(m_Undef*k+1)/m_e; d_dash = (long)(m_Undef*k+1)/m_e); if(d = d_dash) m_d=
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1