把一些加密解密的代码,简单整理成一个类,做了一个加密解密的小工具,可以实现MD5加密,DES加密解密,RSA加密解密。
使用的是 System.Security.Cryptography; 命名空间提供的相关类。
RSA加密算法:
RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
公钥与私钥的产生
假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息。她可以用以下的方式来产生一个公钥和一个私钥:
随意选择两个大的质数p和q,p不等于q,计算N=pq。
根据欧拉函数,求得r= φ(N) = φ(p)φ(q) = (p-1)(q-1)
选择一个小于r的整数e,求得e关于模r的模反元素,命名为d。(模反元素存在,当且仅当e与r互质)
将p和q的记录销毁。
(N,e)是公钥,(N,d)是私钥。Alice将她的公钥(N,e)传给Bob,而将她的私钥(N,d)藏起来。
加密消息
假设Bob想给Alice送一个消息m,他知道Alice产生的N和e。他使用起先与Alice约好的格式将m转换为一个小于N的整数n,比如他可以将每一个字转换为这个字的Unicode码,然后将这些数字连在一起组成一个数字。假如他的信息非常长的话,他可以将这个信息分为几段,然后将每一段转换为n。用下面这个公式他可以将n加密为c:
n^e \equiv c\ (\mathrm{mod}\ N)
计算c并不复杂。Bob算出c后就可以将它传递给Alice。
解密消息
Alice得到Bob的消息c后就可以利用她的密钥d来解码。她可以用以下这个公式来将c转换为n:
c^d \equiv n\ (\mathrm{mod}\ N)
得到n后,她可以将原来的信息m重新复原。
解码的原理是
c^d \equiv n^{e \cdot d}\ (\mathrm{mod}\ N)
以及ed ≡ 1 (mod p-1)和ed ≡ 1 (mod q-1)。由费马小定理可证明(因为p和q是质数)
n^{e \cdot d} \equiv n\ (\mathrm{mod}\ p) 和 n^{e \cdot d} \equiv n\ (\mathrm{mod}\ q)
这说明(因为p和q是不同的质数,所以p和q互质)
n^{e \cdot d} \equiv n\ (\mathrm{mod}\ pq)