}
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 13 : str[i]='D'; break; case 14 : str[i]='E'; break; case 15 : str[i]='F'; break;
case 12 : str[i]='C'; break;
}; i++; }
str[i]='\\0'; strrev(str); return str;
tt=a;
3.2.4 验证数字签名的设计与实现
第 15 页
开始 得到数字签名 用公钥e解密数字签名 得到消息摘要(解密信息) 结束
图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];
第 16 页
//将十进制数公钥e转换为二进制
}
D_to_B(m_e,32,bits);
GetOnlyProperBits(bits); k=NO_BITS = strlen(bits)-1; for(int j=0;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数字签名的运行结果 第 17 页 图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是 第 18 页 DD6865036D64198985366C98523593F286980023D6D36411F361F050, 若消息摘要MD是66F753A8408C91EC0B16D91A1100902A 则得到的DS是 1F1F98F2410D1F5931F366CD686369371D61F236CD6DD6D693936C9350D; (4)测试数字签名的真实与否(验证数字签名):根据RSA算法的解密原理对得到的数字签名DS进行解密,得到的是消息摘要,如果得到的消息摘要与(2)中得到的消息摘要是一样,则证明该数字签名是真实的没有被冒充和篡改,数字签名DS 1F1F98F2410D1F5931F366CD686369371D61F236CD6DD6D693936C9350D 根据解密得到的消息摘要是66F753A8408C91EC0B16D91A1100902A 若根据明文信息得到的消息摘要与解密得到的消息摘要一样,则证明签名的真实。 4.2 性能分析与改进设想 经过一系列的测试,本软件存在较多的需要改进和优化的地方: (1)在素数的任意产生时没有做到任意,本软件只产生了两个固定的素数即47和71,所以在密钥的产生时也就只有一对公钥和一对私钥,应该进行的改进是在素数的产生中增加相应的函数来实现素数的任意产生,以便生成不同的密钥; (2)在产生消息摘要时针对的仅是一系列的字符串,即只能对字符串产生消息摘要而不能对文件产生消息摘要,进行的改进是能同时对字符串和文件都能计算出所对应的消息摘要; (3)与(2)相关的是数字签名中的加密和解密的也仅是字符串,而不能选择所加密和解密的消息的类型(字符串和文件),为了使此类软件能在实际应用中发挥更好的作用所需要改进的一个核心就是能把文件的部分也加入该软件,使该软件能同时对字符串和文件发挥作用; (4)该软件的签名和验证都是在同一界面实现的,而数字签名应该在两个不同的界面下完成即有发送方和接收方,则相应的改进是能实现文件的传送。 开发体会 本文讨论了RSA算法的基本原理、基本实现和消息摘要产生所需要的MD5算法以及如何利用RSA算法实现数字签名。RSA算法是一种安全技术,但是RSA算法的安全性只是一种计算安全性,绝不是无条件的安全性,这是由它的理论基础决定的。因此,在实现RSA算法的过程中,每一步都应尽量从安全性考虑,而该设计中它的安全性则依赖于素数的选择。RSA数字签名提供了一个安全的确认发送方身份的方法,即数字签名的真实性得到了保证,防止了第三方的冒充和篡改,肯定 第 19 页 了数字签名的真实性。 通过此次课题的实践,我充分了解到了RSA算法的基本原理和基本实现步骤,RSA算法,它是第一个既能用于数据加密也能用于数字签名的算法,是公钥密码体制的代表。此次开发让我系统的总结了这个学期所学的知识,同时对以前所学的知识有了更进一步的认识与运用,发现自己在代码实现运用方面还存在许多不足,今后会努力改正,加强对所学知识的理解与运用。 参考文献 [1]谭浩强.C程序设计(第四版)[M].北京:清华大学出版社,2005。 [2]张焕国,唐明密码学导引[M]. 武汉:武汉大学出版社,2015。 第 20 页