RSA非对称加密算法
算法由来
RSA加密算法是一种非对称加密算法,它是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
算法原理(附图如下)
叙述理解
目的:A 将 m 传递给B
- B需要先生成公钥e 和 私钥d ,并将公钥e 以公开的方式传给A;
- m(A)通过 +e 的方式进行加密,并得到c;
- A再将c以公开的方式传给B;
- c(B)通过 -d 的方式进行解密,并得到m;
解析
- 首先需要知道两个质数p , q(质数:又称素数,除了1和它本身以外不再有其他因数);
- n = pq;
- fn = (p-1)(q-1);
- 公钥 e: 1 < e < fn ,并且e 与 fn 互质(除了1以外没有其它公因数);
私钥 d:ed 除以fn 余 1;
加密:m的e次幂,除以n ,求余 得到c;
解密:c的d次幂,除以n,求余 得到m;
示例代码
1 static void Main(string[] args) 2 { 3 var content = "pass123"; 4 5 var privateKey = string.Empty; 6 var publicKey = string.Empty; 7 8 RSAKey(out privateKey, out publicKey); 9 10 var ret = RSAEncrypt(publicKey, content); 11 12 var ret2 = RSADecrypt(privateKey, ret); // ret2 = "pass123" 13 14 Console.ReadLine(); 15 }
1 /// <summary> 2 /// RSA产生密钥 3 /// </summary> 4 /// <param name="xmlKeys">私钥</param> 5 /// <param name="xmlPublicKey">公钥</param> 6 public static void RSAKey(out string xmlKeys, out string xmlPublicKey) 7 { 8 try 9 { 10 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 11 xmlKeys = rsa.ToXmlString(true); 12 xmlPublicKey = rsa.ToXmlString(false); 13 } 14 catch (Exception ex) 15 { 16 throw ex; 17 } 18 }
1 /// <summary> 2 /// RSA加密 3 /// </summary> 4 /// <param name="publickey"></param> 5 /// <param name="content"></param> 6 /// <returns></returns> 7 public static string RSAEncrypt(string publickey, string content) 8 { 9 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 10 rsa.FromXmlString(publickey); 11 var cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false); 12 return Convert.ToBase64String(cipherbytes); 13 }
1 /// <summary> 2 /// RSA解密 3 /// </summary> 4 /// <param name="privatekey"></param> 5 /// <param name="content"></param> 6 /// <returns></returns> 7 public static string RSADecrypt(string privatekey, string content) 8 { 9 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 10 byte[] cipherbytes; 11 rsa.FromXmlString(privatekey); 12 cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false); 13 return Encoding.UTF8.GetString(cipherbytes); 14 }
注:以上为个人学习总结。
——Death、Mr