在本软件中需要实现的功能有以下几个: (1)生成RSA密钥:公钥ke=(e,n),私钥kd=(d,n); 内容来自论文无忧网 www.paper51.com (2)利用MD5算法计算出消息摘要MD; paper51.com (3)数字签名的实现:用私钥d对消息摘要进行加密计算(RSA算法中的加密方法); copyright paper51.com (4)验证数字签名:用公钥e对数字签名进行解密计算(RSA算法中的解密方法),得到的解密结果与(2)步计算出的消息摘要比较,如果两个消息摘要一样则签名成功。 内容来自论文无忧网 www.paper51.com
3.1.2 本软件的总体要求和设计 内容来自论文无忧网 www.paper51.com 本软件的总体要求有: http://www.paper51.com
1)按要求生成非对称密钥——公钥和私钥; http://www.paper51.com 2)按任意写入的的消息字符串(明文信息)生成所需要的消息摘要MD; http://www.paper51.com
3)在本设计中用产生的私钥d根据RSA算法的加密原理对所生成的消息摘要进行加密运算,得到数字签名; 内容来自论文无忧网 www.paper51.com 4)在本设计中用产生的公钥e根据RSA算法的解密原理对所加密的消息摘要即数字签名进行解密运算,得到对应的消息摘要(在本设计中标示的为解密信息),比较两个消息摘要,验证数字签名者的身份的真实与否; 内容来自论文无忧网 www.paper51.com 5)提示信息完整、操作舒适、图形界面雅观。 内容来自论文无忧网 www.paper51.com 本软件的总体设计都是基于C++的开发环境,采用的是Microsoft Visual c++ 6.0的运行环境。 内容来自论文无忧网 www.paper51.com 3.2 各部分的设计实现 内容来自论文无忧网 www.paper51.com 3.2.1 密钥产生的实现 paper51.com 在密钥的产生部分中起决定性作用的是素数的选择, 对随机数作素性检测,若通过则为素数;否则增加一个步长后再做素性检测,直到找出素数。素性检测采用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一定不会是任何素数的倍数。根据所选的素数的不同产生不同的密钥。 http://www.paper51.com 密钥的理论产生模块流程图如图3-1所示: 内容来自www.paper51.com 内容来自论文无忧网 www.paper51.com 图3-1 密钥产生 copyright paper51.com 密钥产生的部分代码实现: paper51.com CString str; paper51.com //第一步 产生任意素数 内容来自www.paper51.com
GeneratePrimeNumbers(); 内容来自论文无忧网 www.paper51.com //第二步 计算 n=p*q paper51.com m_n = m_Prime1 *m_Prime2; 内容来自论文无忧网 www.paper51.com //第三步 0=(p-1)(q-1) paper51.com
m_Undef = (m_Prime1-1) *(m_Prime2-1); 内容来自www.paper51.com
//第四步 选择'e' paper51.com
SelectE(); 内容来自www.paper51.com //第五步 计算D http://www.paper51.com CalculateD(); 内容来自www.paper51.com
//显示公钥和私钥 paper51.com //(1) 公钥 KU={e,n} 内容来自www.paper51.com str.Format("{%d,%d}",m_e,m_n); 内容来自论文无忧网 www.paper51.com m_public_key.SetWindowText(str); 内容来自论文无忧网 www.paper51.com
//(2) 私钥KU={d,n} 内容来自论文无忧网 www.paper51.com str.Format("{%d,%d}",m_d,m_n); 内容来自论文无忧网 www.paper51.com
m_private_key.SetWindowText(str); 内容来自www.paper51.com // 选择一个 'e'使 'e'与 m_Undef互素 copyright paper51.com
//选择e的函数的实现 copyright paper51.com SelectE() copyright paper51.com { CString str; paper51.com
for(floati=2;i<100000;i++) 内容来自论文无忧网 www.paper51.com { paper51.com if(IsRelativePrime((float)m_Undef,(float)i)) paper51.com { 内容来自论文无忧网 www.paper51.com m_e=(long)i; 内容来自论文无忧网 www.paper51.com
return; 内容来自www.paper51.com } 内容来自论文无忧网 www.paper51.com } 内容来自www.paper51.com
} 内容来自www.paper51.com
//互为素数的函数的实现 copyright paper51.com IsRelativePrime(floatX,float Y) 内容来自www.paper51.com { float R; 内容来自www.paper51.com //输入: X,Y http://www.paper51.com
if(X<Y)//如果X较小则交换两个值 内容来自www.paper51.com
{ 内容来自论文无忧网 www.paper51.com X=X+Y; 内容来自论文无忧网 www.paper51.com Y=X-Y; copyright paper51.com
X=X-Y; 内容来自www.paper51.com
} 内容来自www.paper51.com //在这时X总是比Y大 paper51.com for(;;) 内容来自www.paper51.com { copyright paper51.com if(Y==0) 内容来自论文无忧网 www.paper51.com
break; 内容来自论文无忧网 www.paper51.com R=fmod(X,Y); 内容来自论文无忧网 www.paper51.com X=Y; copyright paper51.com Y=R; 内容来自www.paper51.com } copyright paper51.com
if(X!= 1) 内容来自论文无忧网 www.paper51.com returnfalse; paper51.com else copyright paper51.com returntrue;//互素 copyright paper51.com
} paper51.com // 计算D的函数的实现 内容来自论文无忧网 www.paper51.com CalculateD() paper51.com { http://www.paper51.com float d; 内容来自论文无忧网 www.paper51.com long d_dash; http://www.paper51.com
CString str; 内容来自www.paper51.com for(float k=1;k<100000;k++) 内容来自www.paper51.com { 内容来自www.paper51.com
d=(m_Undef*k+1)/m_e; 内容来自www.paper51.com d_dash =(long)((m_Undef*k+1)/m_e); 内容来自www.paper51.com
if(d ==d_dash) paper51.com { http://www.paper51.com m_d=d; 内容来自www.paper51.com
return; http://www.paper51.com } http://www.paper51.com } copyright paper51.com } http://www.paper51.com
//产生素数的函数的实现 http://www.paper51.com GeneratePrimeNumbers() copyright paper51.com { copyright paper51.com
CString str; 内容来自论文无忧网 www.paper51.com UpdateData(TRUE); http://www.paper51.com //通过以下两个函数可获得两个大素数,但增加了计算复杂性,为了方便,直接给定素数 内容来自论文无忧网 www.paper51.com // m_Prime1 =FindPrime(1); paper51.com // m_Prime2 =FindPrime(m_Prime1); copyright paper51.com m_Prime1=47; 内容来自论文无忧网 www.paper51.com m_Prime2=71; 内容来自论文无忧网 www.paper51.com } http://www.paper51.com |