基于MD5+RSA的数字签名设计与实现(毕业论文+程序源码)

大家好,今天给大家介绍基于MD5+RSA的数字签名设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴,可以进入我的博客主页查看左侧最下面栏目中的自助下载方法哦

文章目录:

  • 基于MD5+RSA的数字签名设计与实现(毕业论文+程序源码)
    • 1、项目简介
    • 2、资源详情
    • 3、关键词:
    • 4、毕设简介
    • 5、资源下载

1、项目简介

  1. RSA算法是目前公认的在理论和实际应用中最为成熟和完善的一种公钥密码体制,它是第一个既能用于数据加密也能用于数字签名的算法,是公钥密码体制的代表。数字签名是起到身份认证、核准数据完整性的一种信息安全技术。它通过认证技术来辨认真伪。RSA数字签名体制使用的是RSA公开密钥密码算法进行数字签名。
  2. 本文主要研究的内容包括:第一,对RSA算法进行了全面系统的介绍,包括RSA算法的应用现状和原理—大素数的产生、密钥对的产生、对明文的加密运算和密文的解密运算,为具体实现打下了理论基础;第二,介绍了RSA数字签名的一些基本概念和数字签名的理论实现过程;第三,对MD5算法基本原理的介绍;第四,详述了RSA数字签名的设计与实现,主要实现的模块包括RSA密钥的产生(一对公钥和私钥),RSA加密算法和解密算法的实现,消息摘要MD的生成以及利用RSA算法实现数字签名和签名的验证;第五,对该系统进行了整体的测试和分析改进;第六,分析了RSA数字签名的安全性,指出了RSA数字签名的发展方向。

2、资源详情

项目难度:中等难度
适用场景:相关题目的毕业设计
配套论文字数:12189个字26页
包含内容:整套源码+完整毕业论文


3、关键词:

RSA算法;加密; 解密;MD5算法;RSA数字签名


4、毕设简介

提示:以下为毕业论文的简略介绍,项目源码及完整毕业论文下载地址见文末。

引言
1.1 研究背景
省略

RSA公钥加密算法是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也十分流行。算法的名字以发明者的姓氏首字母命名:Ron Rivest, Adi Shamir 和Leonard Adleman。虽然自1978年提出以来,RSA的安全性一直未能得到理论上的证明,但它经历了各种攻击,至今(2006年)未被完全攻破。随着越来越多的商业应用和标准化工作,RSA已经成为最具代表性的公钥加密技术。VISA、MasterCard、IBM、Microsoft等公司协力制定的安全电子交易标准(Secure Electronic Transactions,SET)就采用了标准RSA算法,这使得RSA在我们的生活中几乎无处不在。网上交易加密连接、网上银行身份验证、各种信用卡使用的数字证书、智能移动电话和存储卡的验证功能芯片等,大多数使用RSA技术。

1.2 本课题的研究意义
随着电子商务的发展,网络上资金的电子交换日益频繁,如何防止信息的伪造和欺骗成为非常重要的问题。在计算机通信系统中,维护电子文档的安全也成为至关重要和非常敏感的问题。为保护信息的安全,数字签名应运而生,它是现代密码学主要研究的内容之一。目前关于数字签名的研究主要集中点是基于公钥密码体制的数字签名。在公钥密码体制中,解密和加密密钥不同,解密和加密可分离,通信双方无须事先交换密钥就可建立起保密通信,因此它较好地解决了传统密码体制在网络通信中出现的问题。手写签名的每一项业务都是数字签名的潜在用场。数字签名可以提供数据完整性、真实性和不可否认性。因而当需要对某一实体进行认证、传输具有有效性的密钥以及进行密钥分配时,便可以借助数字签名来完成任务。数字签名技术在身份识别和认证、数据完整性、抵赖等方面具有其它技术无法替代的作用,它在军事、电子商务和电子政务等领域有着极广泛的应用。而在公钥体制中,RSA是一个较为完善的公钥密码算法,不仅能够同时用于加密和数字签名,而且易于理解和操作,是被广泛研究的公钥密码算法。因此,基于RSA的数字签名具有较强的研究性和实际应用意义。

2 RSA算法和RSA数字签名算法的基本概念和原理
2.1 RSA算法的基本概念和原理
2.1.1 RSA算法介绍与应用现状
RSA算法是一种公钥密码算法,实现RSA算法包括生成RSA密钥,加密和解密数据。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NP-C问题。RSA的缺点主要有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。B)分组长度太大,为保证安全性,n 至少也要 600 bits。

RSA算法的时间复杂性取决于它所设计的几个基本运算的时间复杂性。密钥生成过程时间主要是生成随机素数的时间及计算公钥和私钥的模乘法的时间。生成随机素数的时间在于完成对随机大数的Fermat测试的时间,Fermat测试的时间复杂度为O((log2n)3),n所测试的整数。模乘法的计算方法采取先计算两个数的乘积,再取模n,时间复杂性为O((log2n)2)。 RSA加密解密计算的时间主要是模幂运算的时间,即形式为xc mod n的函数的运算时间。模幂算法采取平方乘算法,设l是c的长度,则计算xc mod n至多需要2l次模乘法,因为 1[log2n]+1,所以模幂运算能在时间O((log2n)3)内完成。因此,RSA的加密和解密均可在多项式时间内完成。

RSA公开密钥加密算法自20世纪70年代提出以来,已经得到了广泛认可和应用。发展至今,电子安全领域的各方面已经形成了较为完备的国际规范。RSA作为最重要的公开密钥算法,在各领域的应用数不胜数。RSA在硬件方面,以技术成熟的IC应用于各种消费类电子产品。RSA在软件方面的应用,主要集中在Internet上、加密连接、数字签名和数字证书的核心算法广泛使用RSA。

2.1.2 RSA算法的实现原理

  1. 随机选择两个不同的素数p和q,它们的宽度是密钥宽度的二分之一。
  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 = P^e mod n;
  8. 将密文C解密为明文P,计算方法为:
    P=C^d mod n;
    然而只根据n和e(不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密。

2.2 RSA数字签名基本概念和RSA数字签名算法的实现原理
2.2.1 RSA数字签名基本概念
RSA数字签名体制使用了RSA公开密钥密码算法进行数字签名,鉴于RSA算法在实践中已经被证明了的安全性,RSA数字签名体制在许多安全标准中得以广泛应用。ISO/IEC 9796和ANSI X9.30-199X 以及美国联邦信息处理标准FIPS 186-2已经将RSA作为推荐的数字签名标准算法之一。

RSA数字签名算法,包括签名算法和验证签名算法。它是利用的RSA算法的加密和解密算法的原理进行的一种数字签名,实际上是通过一个哈希函数来实现的(本设计是通过的MD5算法)产生消息摘要MD来实现的所需加密的对象。

数字签名的特点是它代表了消息的特征,消息如果发生改变,数字签名的值也将发生改变,不同的消息将得到不同的数字签名。安全的数字签名使接收方可以得到保证:消息确实来自发送方。因为签名的私钥只有发送方自己保存,他人无法做一样的数字签名,如果第三方冒充发送方发出一个消息,而接收方在对数字签名进行解密时使用的是发送方的公开密钥,只要第三方不知道发送方的私有密钥,加密出来的数字签名和经过计算的数字签名必然是不相同的,这就提供了一个安全的确认发送方身份的方法,即数字签名的真实性得到了保证。

数字签名通过认证技术来辨认真伪。认证技术主要包括数字签名认证、身份认证以及公开密钥证明等。数字签名认证机制提供了一种对数字签名进行鉴别的方法;身份认证机制提供了辨别和确认通信双方真实身份的方法;公开密钥证明机制则对密钥进行验证。网络时代中,人们验证数字签名来确定你正在和谁打交道,验证你的文件是否已被黑客篡改。数据的安全性和真实性已成为网络安全中至关重要的一部分。

数字签名类似手书签名,它具有以下的性质:
1)能够验证签名产生者的身份,以及产生签名的日期和时间;
2)能用于证实被签消息内容;
3)数字签名可由第三方验证,从而能够解决通信双方的争议。
为了实现数字签名的以上性质,它就应满足下列要求:
1)签名是可信的:任何人都可以验证签名的有效性;
2)签名是不可伪造的:除了合法的签名者外,任何人伪造其签名是困难的;
3)签名是不可复制的:对一个消息的签名不能通过复制变为另一个消息的签名。如果一个消息的签名是从别处复制得到的,则任何人都可以发现消息与签名之间的不一致性,从而可以拒绝签名的消息;
4)签名的消息是不可改变的:经签名的消息不能篡改,一旦签名的消息被篡改,任何人都可以发现消息与签名之间的不一致性;
5)签名是不可抵赖的:签名者事后不能否认自己的签名。可以由第三方或仲裁方来确认双方的信息,以做出仲裁。
为了满足数字签名的这些要求,例如,通信双方在发送消息时,既要防止接收方或其他第三方伪造,又要防止发送方因对自己的不利而否认,也就是说,为了保证数字签名的真实性。

数字签名的原理是:(发送方和接收方根据要求各自产生自己的一对公钥和私钥)
1)被发送文件采用某种算法对原始消息进行运算,得到一个固定长度的数字串,称为消息摘要(MD),不同的消息得到的消息摘要各异,但是对相同的消息它的消息摘要却是唯一的;
2)发送方生成消息的消息摘要,用自己的私钥对摘要进行加密来形成发送方的数字签名;
3)这个数字签名将作为消息的附件和消息一同用接收方的公钥进行加密,将加密后的密文一起发送给接收方;
4)接收方首先把接收到的密文用自己的私钥解密,得到原始消息和数字签名,再用发送方的公钥解密数字签名,随后用同样的算法计算出消息摘要;
5)如果计算出来的消息摘要和发送方发送给他的消息摘要(通过解密数字签名得到的)是相同的,这样接收方就能确认数字签名确实是发送方的,否则就认为收到的消息是伪造的或是中途被篡改的。

数字签名的原理图如2-1所示

图2-1 数字签名的原理

2.2.2 RSA数字签名算法的实现原理
RSA数字签名算法分为以下两个步骤:
1) 签名算法(包括两步:消息摘要计算,RSA加密)
(1)消息摘要MD的计算: 消息在签名前首先通过MD5计算,生成128位的消息摘要 ;MD5函数是一种单向散列函数,它将任意长度的消息压缩成128位的消息摘要。应用MD5的单向性(即给定散列值,计算消息很难)和抗碰撞性(即给定消息M,要找到另一消息M’并满足两者的散列值很难),可以实现信息的完整性检验。另外该函数的设计不基于任何假设和密码体制而直接构造,执行的速度快,是一种被广泛认可的单向散列算法。
(2)对MD作RSA加密算法:采用签名者的私钥加密消息摘要,得到加密后的字符串即数字签名;

2)验证签名算法 (RSA解密、对消息摘要计算和比较)
验证签名算法包括两步:RSA解密得签名者的消息摘要,验证者对原消息计算摘要,比较两个消息摘要。验证签名的过程输入为消息,签名者的公钥,签名;输出为验证的结果,即是否是正确的签名。
(1)RSA解密: 签名实际是加密的消息摘要,用以上所述的RSA解密方法采用签名者的公钥对这个加密的消息摘要解密,解密的结果应为128位的消息摘要。
(2)消息摘要计算和比较: 验证者对消息用MD5算法重新计算,得到验证者自己的消息摘要。验证者比较解密得到的消息摘要和自己的消息摘要,如果两者相同,则验证成功,可以确认消息的完整性及签名确实为签名者的;否则,验证失败,确认签名被冒充或是被篡改。

2.3 MD5算法的介绍
MD5消息摘要算法(RFC 1321)是由Rivest(公开密钥密码RSA算法的设计者之一)所设计的单向散列函数,MD5不基于任何假设和密码体制,它采用了直接构造的办法,速度很快,非常实用。

MD5算法的典型应用是对一段信息(message)产生信息摘要(MD),以防止被篡改。比如,在unix下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中通常只有一行文本,大致结构如:
md5 (tanajiya.tar.gz) = 0ca175b9c0f726a831d895e269332461  
这就是tanajiya.tar.gz文件的数字签名。md5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的md5信息摘要。如果在以后传播这个文件的过程中,无论文件的内容发生了任何形式的改变(包括人为修改或者下载过程中线路不稳定引起的传输错误等),只要你对这个文件重新计算md5时就会发现信息摘要不相同,由此可以确定你得到的只是一个不正确的文件。如果再有一个第三方的认证机构,用md5还可以防止文件作者的"抵赖",这就是所谓的数字签名应用。md5还广泛用于加密和解密技术上。比如在unix系统中用户的密码就是以md5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成md5值,然后再去和保存在文件系统中的md5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。

MD5算法以任意长度的消息作为输入,产生一个128比特消息散列值(或称消息摘要)作为输出。具体的算法步骤如下:
步骤1:附加填充比特,对消息进行填充,使消息的长度(比特数)与448模512同余,即恰好为一个比512比特的倍数仅小64位的数。
步骤2:附加消息长度值,将用64比特表示的初始消息(填充前)的长度(比特数)附加在步骤1的结果后。

步骤3:初始化MD缓存,MD5算法使用了一个4个字(128比特,MD4中每个字32比特)的缓存来计算消息摘要,它们主要用来存放MD5的中间及最终结果。缓存可以看成是4个32比特的寄存器(A,B,C,D)。
步骤4:以512比特(16个字)分组处理消息,这一步是MD5算法的主循环,以512比特作为分组,在后面有详细的介绍。

3 RSA数字签名的设计与实现
3.1 RSA数字签名的总体设计
3.1.1 RSA数字签名所需实现的功能
在本软件中需要实现的功能有以下几个:
(1)生成RSA密钥:公钥ke=(e,n),私钥kd=(d,n);
(2)利用MD5算法计算出消息摘要MD;
(3)数字签名的实现:用私钥d对消息摘要进行加密计算(RSA算法中的加密方法);
(4)验证数字签名:用公钥e对数字签名进行解密计算(RSA算法中的解密方法),得到的解密结果与(2)步计算出的消息摘要比较,如果两个消息摘要一样则签名成功。

3.1.2 本软件的总体要求和设计
本软件的总体要求有:
1)按要求生成非对称密钥——公钥和私钥;
2)按任意写入的的消息字符串(明文信息)生成所需要的消息摘要MD;
3)在本设计中用产生的私钥d根据RSA算法的加密原理对所生成的消息摘要进行加密运算,得到数字签名;
4)在本设计中用产生的公钥e根据RSA算法的解密原理对所加密的消息摘要即数字签名进行解密运算,得到对应的消息摘要(在本设计中标示的为解密信息),比较两个消息摘要,验证数字签名者的身份的真实与否;
5)提示信息完整、操作舒适、图形界面雅观。
本软件的总体设计都是基于C++的开发环境,采用的是Microsoft Visual c++
6.0的运行环境。

3.2 各部分的设计实现
3.2.1 密钥产生的实现
在密钥的产生部分中起决定性作用的是素数的选择, 对随机数作素性检测,若通过则为素数;否则增加一个步长后再做素性检测,直到找出素数。素性检测采用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所示:

图3-1 密钥产生
密钥产生的部分代码实现:

CString str;//第一步 产生任意素数GeneratePrimeNumbers();//第二步 计算 n=p*qm_n = m_Prime1 * m_Prime2;//第三步 0=(p-1)(q-1)m_Undef = (m_Prime1-1) * (m_Prime2-1);//第四步 选择'e'SelectE();//第五步 计算DCalculateD();//显示公钥和私钥//(1) 公钥 KU={e,n}str.Format("{%d, %d}",m_e,m_n);m_public_key.SetWindowText(str);//(2) 私钥KU={d,n}str.Format("{%d, %d}",m_d,m_n);m_private_key.SetWindowText(str);// 选择一个 'e' 使 'e'与  m_Undef互素
//选择e的函数的实现
SelectE()
{  CString str;
for(float i=2;i<100000;i++){if(IsRelativePrime((float)m_Undef,(float)i)){m_e=(long)i;return;}}
}
//互为素数的函数的实现
IsRelativePrime(float X,float Y)
{  float R;
//输入: X,Y
if(X<Y)//如果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;CString str;for(float k=1;k<100000;k++){d=(m_Undef*k+1)/m_e;d_dash = (long)((m_Undef*k+1)/m_e);if(d == d_dash){m_d=d;return;}}
}
//产生素数的函数的实现
GeneratePrimeNumbers()
{CString str;UpdateData(TRUE);
//通过以下两个函数可获得两个大素数,但增加了计算复杂性,为了方便,直接给定素数
//      m_Prime1 = FindPrime(1);
//      m_Prime2 = FindPrime(m_Prime1);m_Prime1=47;m_Prime2=71;
}

3.2.2 产生消息摘要的设计实现
计算消息摘要的理论实现流程图如图3-2所示:

图3-2 消息摘要计算流程
在以上流程图中其中循环处理块是最重要的一步,也是MD5的核心算法,在这一步中包括了:
(1)把四个连接变量复制到了四个变量a,b,c,d中,使a=A,b =B,c =C,d=D;其中a,b,c,d组合成128位的寄存器,且在实际算法运算中保存中间结果和最终结果;
(2)将当前的512位块分解为16个子块,每个子块为32位;
(3)要循环四轮,每一轮处理一个块中的16个子块,四轮的第一步进行不同的处理,其他的相同:每一轮有16个输入子块M[0],M[1],……………M[15],或表示为M[i],其中i为0-15;t是常量数组,包含64个元素,每个元素为32位,数组t表示为t[1],t[2],………t[64],或t[k],k为1-64;

MD5的循环四轮操作过程用下式表示:

a=b+((a+proccessP(b,c,d)+M[i]+T[k])<<<s)(<<<s表示循环左移s位)
产生消息摘要的主要代码如下:int i;int Index;//初始化MD5所需常量
Init(); //计算追加长度
Append(WriteMessage.length());
//对原始信息进行补位for( i=0;i<m_AppendByte;i++){if(i==0) WriteMessage+=(unsigned char)0x80;else WriteMessage+=(unsigned char)0x0;}
//将原始信息长度附加在补位后 的数据后面
for( i=0;i<8;i++) WriteMessage+=m_MsgLen[i];//位块数组
unsigned char x[64]={0};
//循环,将原始信息以64字节为一组拆分进行处理for( i=0,Index=-1;i<WriteMessage.length();i++){x[++Index]=WriteMessage[i];if(Index==63){Index=-1;
//将64字节位转换为16个字节Transform(x);}}
//将寄存器ABCD的最终值转换为16进制返回给用户return ToHex(UpperCase);

3.2.3 数字签名的设计实现
数字签名的理论实现流程图如图3-3所示,数字签名,就是通过在数据单元上附加数据,或对数据单元进行加密变换,从而使接收者可以确认数据来源和完整性。数字签名是防止他人对传输的文件进行破坏,以及确定发信人的身份的手段。数字签名中的加密算法就是应用的RSA加密原理,而它的验证算法则是应用的RSA解密原理。

图3-3 数字签名的实现流程
RSA的加密、解密过程都为求一个整数的整数次幂,再取模。如果按其含义直接计算,则中间结果非常大,有可能超出计算机所允许的整数取值范围。为了减小中间结果和提高加、解密运算中指数运算的有效性,本设计采用了快速指数算法。它的运算过程为(假如要算a^m mod n):
1)将m表示为二进制的形式;
2)初始化c=0,d=1,c在这里表示指数的部分结果,它的终值即为指数m,d是中间结果,它的终值即为所求结果;
3)从二进制数的最高位到最低位开始对每一位都用公式1进行运算,得到的d为该步的结果,公式1:c=2c;d=fmod(dd,n);
4)若二进制数是1,则在上面的运算后继续以下运算:c=c+1;d=fmod(d*a,n);得到的结果d才为该步的最终结果。
数字签名主要实现过程的代码如下:

//消息摘要,8位为一组 一个字符一组char message[200];
//从文本框中得到消息摘要 m_message.GetWindowText(message,200);len=strlen(message);char showstr[1000]="";int NO_BITS=32;double c=0,d=1;char bits[100];double n=(double)m_n;unsigned char ch;double data;//19;long i,k=NO_BITS;int sizeof_d=sizeof(double);//将十进制数私钥d转换为二进制
D_to_B(m_d,32,bits);
//得到合适的字节GetOnlyProperBits(bits);k=NO_BITS = strlen(bits)-1;for(int ii=0;ii<len;ii++){// 从message中读取字符放入'data'中ch=message[ii];data =(double)ch;//计算 ((data)^d mod n) 快速指数算法的实现c=0;d=1;for(i=k;i>=0;i--){c=2*c;d=fmod(d*d,n);if(bits[NO_BITS-i] == '1'){c=c+1;d=fmod(data*d,n);}     }// 从'd'中读取字符放入result中result[ii]=d;//把字符串变为十六进制数后连接字符串strcat(showstr,longtohex(d));}//结束循环//显示结果m_result.SetWindowText(showstr);}
//字符串变为16进制数的函数的实现
longtohex(long x)
{char str[8];int i=0;//商int a; //余数int b;long tt=x;while(tt>=16){a=tt/16;b=tt%16;switch(b){case 0 : str[i]='0'; break;case 1 : str[i]='1'; break;case 2 : str[i]='2'; break;case 3 : str[i]='3'; break;case 4 : str[i]='4'; break;case 5 : str[i]='5'; break;case 6 : str[i]='6'; break;case 7 : str[i]='7'; break;case 8 : str[i]='8'; break;case 9 : str[i]='9'; break;case 10 : str[i]='A'; break;case 11 : str[i]='B'; break;case 12 : str[i]='C'; break;case 13 : str[i]='D'; break;case 14 : str[i]='E'; break;case 15 : str[i]='F'; break;};i++;tt=a;}str[i]='\0';strrev(str);return str;
}

3.2.4 验证数字签名的设计与实现

图3-4 验证数字签名流程
验证数字签名的正确与成功性,主要是比较得到的两次消息摘要是否一样,如果验证方用签名方的公钥解密得到消息摘要(即是本设计中得到的解密信息)和他自己计算得到的消息摘要(在本系统中为第一次计算得到的消息摘要)是一样的,则证明签名是正确的,没有被篡改或是冒充,验证签名的原理则是根据RSA的解密算法,具体的理论流程图如图3-4所示:(在本设计中签名和验证签名都在同一界面实现,不进行文件的双方传输)
验证数字签名的过程时应用的解密算法是RSA的解密原理,而RSA的解密过程也应用了求一个整数的整数次幂,再取模的运算。在此也采用了快速指数算法,具体的算法过程同RSA的加密过程中应用的快速指数算法是一样的。

验证数字签名主要实现过程的代码如下:

int NO_BITS;double c=0,d=1;char bits[100];double n=(double)m_n;double data;//19;long i,k;int sizeof_d=sizeof(double);//用于存储解密信息char message[200];//将十进制数公钥e转换为二进制D_to_B(m_e,32,bits);GetOnlyProperBits(bits);k=NO_BITS = strlen(bits)-1;for(int j=0;j<len;j++){//从result中读取字符放入 'data'中data=result[j];//计算 ((data)^e mod n) 快速指数算法的实现c=0;d=1;for(i=k;i>=0;i--){c=2*c;d=fmod(d*d,n);if(bits[NO_BITS-i] == '1'){c=c+1;d=fmod(data*d,n);}        }//结束循环//从'd'中读取字符放入message中message[j]=d;}//显示结果m_mingwen.SetWindowText(message);}

3.2.5 RSA数字签名的运行结果

图3-5 RSA数字签名的运行结果
在本软件中得到二个消息摘要:根据写入的消息(明文信息)计算出来的消息摘要、解密数字签名得到的消息摘要(即是本设计中的解密信息)。如果两个消息摘要是一样的则证明RSA数字签名者的身份的真实性,从而实现了RSA数字签名。该系统的运行结果如图3-5所示。产生的消息摘要和解密得到的消息摘要(在此处是解密信息)是完全一样的,则证明了数字签名的真实性。

4 软件的整体测试和分析改进
4.1软件的整体测试
(1)测试密钥的生成:产生密钥的前提是要有两个素数的生成,密钥的产生依赖于素数的生成,素数生成不一样则密钥也会不相同,在本设计中素数是47和71,则相对应的的密钥是公钥(3,3337)和私钥(2147,3337);
(2)测试消息摘要MD的生成:写入的消息(明文信息)不一样得到消息摘要就有所区别,但是在产生消息摘要时所使用的计算方法是一样的即MD5算法,该算法的核心是其中的四轮循环,如果四轮循环中的一个细节出了问题则所产生的MD便是相差极远,如若明文信息是dfgfhfhgjk则得到的消息摘要A4127B4881D24B01A85696477A07C17C ,若明文信息是cvnjj 则得到的消息摘要是A1E2C15FF4C9F4D407EF33D1AC56C632;
(3)测试数字签名的生成:根据RSA算法的加密原理对不同的消息摘要MD进行加密运算,得到的便是不同的数字签名DS;
若消息摘要MD是A1E2C15FF4C9F4D407EF33D1AC56C632
则得到的DS是DD6865036D64198985366C98523593F286980023D6D36411F361F050,
若消息摘要MD是66F753A8408C91EC0B16D91A1100902A
则得到的DS是1F1F98F2410D1F5931F366CD686369371D61F236CD6DD6D693936C9350D;
(4)测试数字签名的真实与否(验证数字签名):根据RSA算法的解密原理对得到的数字签名DS进行解密,得到的是消息摘要,如果得到的消息摘要与(2)中得到的消息摘要是一样,则证明该数字签名是真实的没有被冒充和篡改,数字签名DS 1F1F98F2410D1F5931F366CD686369371D61F236CD6DD6D693936C9350D 根据解密得到的消息摘要是66F753A8408C91EC0B16D91A1100902A 若根据明文信息得到的消息摘要与解密得到的消息摘要一样,则证明签名的真实。

4.2 性能分析与改进优化
经过一系列的测试,本软件存在较多的需要改进和优化的地方:
(1)在素数的任意产生时没有做到任意,本软件只产生了两个固定的素数即47和71,所以在密钥的产生时也就只有一对公钥和一对私钥,应该进行的改进是在素数的产生中增加相应的函数来实现素数的任意产生,以便生成不同的密钥;
(2)在产生消息摘要时针对的仅是一系列的字符串,即只能对字符串产生消息摘要而不能对文件产生消息摘要,进行的改进是能同时对字符串和文件都能计算出所对应的消息摘要;
(3)与(2)相关的是数字签名中的加密和解密的也仅是字符串,而不能选择所加密和解密的消息的类型(字符串和文件),为了使此类软件能在实际应用中发挥更好的作用所需要改进的一个核心就是能把文件的部分也加入该软件,使该软件能同时对字符串和文件发挥作用;
(4)该软件的签名和验证都是在同一界面实现的,而数字签名应该在两个不同的界面下完成即有发送方和接收方,则相应的改进是能实现文件的传送。

5 RSA数字签名的安全性分析与前景展望
5.1 RSA数字签名的安全性分析
对于一个完整的数字签名系统而言,安全性是其要求的第一位,RSA体制的安全性决定于RSA公开密钥密码算法的安全性,在设计RSA数字签名系统时为了保证其安全性,应注意以下几个问题:
1)根据被加密文件的重要程度和加密时间的要求来选择n的长度。因为RSA的安全性则是依赖于分解大素数的难度。随机选择足够大且相互之间差别比较大的素数p和q来提高系统的安全性(目前应在512位以上),解密密钥d相对模 n 不应过小。因为若d达到n的1/4大小,且 e比n 小,则有方法可以恢复d;
2)在使用RSA的通信网络协议中,不应该使用公共模 n ,这是因为已经知道了对于一个加密/解密密钥指数对,攻击者就能分解这个模,也就可以不分解n 来计算出别的加密/解密对;
3)不要让攻击者得到原始的解密结果;
4)相关的消息不要用相同的密钥加密;
5)在实际运用中不要对一个陌生人提交的随机消息解密,不对自己一无所知的信息签名,要先利用一个单向散列函数对消息进行散列hash(MD5)处理,尽管Hash(MD5) 算法是公开的,但是根据hash(MD5)值计算出明文在统计学上是不可能的。因此仅重视RSA的实现是不够的,实现细节也很重要。
总之,对一个数字签名系统而言,重要的是从整体上研究,而不应局限于系统的一部分。仅有一个安全的算法是不够的,整个密码系统必须是安全的。

结 论
本文讨论了RSA算法的基本原理、基本实现和消息摘要产生所需要的MD5算法以及如何利用RSA算法实现数字签名。RSA算法是一种安全技术,但是RSA算法的安全性只是一种计算安全性,绝不是无条件的安全性,这是由它的理论基础决定的。因此,在实现RSA算法的过程中,每一步都应尽量从安全性考虑,而该设计中它的安全性则依赖于素数的选择。RSA数字签名提供了一个安全的确认发送方身份的方法,即数字签名的真实性得到了保证,防止了第三方的冒充和篡改,肯定了数字签名的真实性。

本文所提到的算法及实现原理已在作为设计的安全电子邮件系统中完全实现并获得满意的效果。

参考文献
[1] 卢开澄.计算机密码学[M].北京:清华大学出版社,1998。
[2] 冯登国,裴定一.密码学导引[M]. 北京:科学出版社, 1999。
[3] 蔡乐才,张仕斌.应用密码学[M]. 北京:中国电力出版社,2005。
[4] 蔡庆华.公钥密码体制RSA算法[J].安庆师范学院学报(自然科学版),2003,(4):69-70。
[5] 赖溪松.计算机密码学及其应用[M].北京:国防工业出版社,2001。
[6] 宋震.密码学[M].北京:中国水利水电出版社,2002。
[7] 张 周.我国企业开始重视网络安全[J].计算机世界A9版,2000,(3):25-28。
[8] 张仕斌,谭三.网络安全技术[M]. 北京:清华大学出版社,2004。
[9] Mao W著,王继林等译.现代密码学理论与实践[M].北京:电子工业出版社,2004。
[10] Atreya M等著,贺军等译.数字签名[M].北京:清华大学出版社,2003。
[11] 王 勇.RSA公开密钥密码体制的密钥生成研究[J] .计算机应用研究,1998,(3):21-24。

致 谢
省略


5、资源下载

本项目源码及完整论文如下,有需要的朋友可以点击进行下载。如果链接失效可点击下方卡片扫码自助下载。

序号 毕业设计全套资源(点击下载)
本项目源码 基于MD5+RSA的数字签名设计与实现(源码+文档)_RSA_数字签名.zip

C#毕业设计——基于MD5+RSA的数字签名设计与实现(毕业论文+程序源码)——数字签名系统相关推荐

  1. [附源码]计算机毕业设计Python+uniapp基于Android校园二手交易平台设计与实现 o8k65(程序+源码+LW+远程部署)

    [附源码]计算机毕业设计Python+uniapp基于Android校园二手交易平台设计与实现 o8k65(程序+源码+LW+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 ...

  2. [附源码]计算机毕业设计Python+uniapp基于android的古诗词鉴赏设计与实现lt9y0(程序+源码+LW+远程部署)

    [附源码]计算机毕业设计Python+uniapp基于android的古诗词鉴赏设计与实现lt9y0(程序+源码+LW+远程部署) 该项目含有源码.文档.程序.数据库.配套开发软件.软件安装教程 项目 ...

  3. java毕业设计——基于java+EVENODD编码的基于纠错码的冗余技术设计与实现(毕业论文+程序源码)——基于纠错码的冗余技术

    基于java+EVENODD编码的基于纠错码的冗余技术设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+EVENODD编码的基于纠错码的冗余技术设计与实现,文章末尾附有本毕业设计的 ...

  4. 基于springboot准妈妈孕期交流平台设计实现【毕业论文、源码】

    摘 要 随着科学技术的飞速发展,社会的方方面面.各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,准妈妈孕期交流平台当然也不能排除在外.准妈妈孕期交流平台是以实际运用为开发背景,运用 ...

  5. java毕业设计基于Bootstrap的读书网站设计与实现(附源码、数据库)

    项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  6. C#毕业设计——基于C#+asp.net+C++的RSA文件加密系统设计与实现(毕业论文+程序源码)——RSA文件加密系统

    基于C#+asp.net+C++的RSA文件加密系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于C#+asp.net+C++的RSA文件加密系统设计与实现,文章末尾附有本毕业设计的论文 ...

  7. 【php毕业设计】基于php+mysql+apache的二手物品交易网站设计与实现(毕业论文+程序源码)——二手物品交易网站

    基于php+mysql+apache的二手物品交易网站设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于php+mysql+apache的二手物品交易网站设计与实现,文章末尾附有本毕业设计的 ...

  8. java毕业设计——基于Java+sqlserver的通用安全模块设计与实现(毕业论文+程序源码)——安全模块

    基于Java+sqlserver的通用安全模块设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于Java+sqlserver的通用安全模块设计与实现,文章末尾附有本毕业设计的论文和源码下载地 ...

  9. asp毕业设计——基于asp+access的网页设计辅导系统设计与实现(毕业论文+程序源码)——网页设计辅导系统

    基于asp+access的网页设计辅导系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于asp+access的网页设计辅导系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦. ...

最新文章

  1. 从天气项目看Spring Cloud微服务治理
  2. Exchange Server 2013之CAS服务器NLB负载均衡
  3. 04_SSM整合ActiveMQ支持多种类型消息
  4. 2台服务器负载均衡后synchronized_一篇有趣的负载均衡算法实现
  5. java 初始化 静态变量,关于spring:Java初始化静态变量的时间顺序
  6. 7-56 家庭房产 (25 分)
  7. 【华为云技术分享】全WEB化开发体验,开发者新利器华为云CloudIDE即将揭秘
  8. [转]用 ASP.NET 2.0 改进的 ViewState 加快网站速度
  9. 目标检测——val集的作用
  10. 彪悍榴莲姐再袭 这次一口气吃掉10斤
  11. js遍历数组和遍历对象的区别
  12. outlook qr码在哪里_胡志明市第一次将QR码附加在街道名称板上,目的是什么?
  13. vue 文件转base64方法 base64转blob路径方法 a链接下载文件 form表单下载文件
  14. 计算机英特尔显卡在哪找,Win10英特尔显卡设置图标不见了该怎么办?
  15. 堆漏洞挖掘中的malloc_consolidate与FASTBIN_CONSOLIDATION_THRESHOLD
  16. 邓俊辉数据结构与算法学习笔记-第十一章
  17. ASP.NET Core Razor官方文档踩坑
  18. 物联网平台有哪些商业模式
  19. 调取创蓝253国际短信验证码-代码示例2
  20. 医院医生护士都不愿说的医学小常识

热门文章

  1. 常用的XSS攻击手段和目的有哪些 网络安全入门教程
  2. 分享一个免费好用的桌面便签
  3. 读书笔记-命令行总结
  4. 预测性维护_工厂数据的预测性维护
  5. 三相永磁同步电机Foc的有感程序控制(总结:程序1)
  6. Conflux Studio新版教程详解
  7. 汽车汽配行业电子采购系统降低采购成本,增强企业竞争优势
  8. App启动通用流程图方案
  9. 环信是否支持html,VUE项目集成环信WebIM即时通信以及所遇到的问题
  10. 我们在400多年前成书的《封神演义》中看到了5G应用的影子