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;

解析

  1. 首先需要知道两个质数p , q(质数:又称素数,除了1和它本身以外不再有其他因数);
  2. n = pq;
  3. fn = (p-1)(q-1);
  4. 公钥 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         }
Main
 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         }
RSA密钥产生
 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         }
RSA加密
 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         }
RSA解密

 注:以上为个人学习总结。

posted @ 2018-06-12 16:14  Death、MrZ  阅读(363)  评论(0编辑  收藏  举报