zoukankan      html  css  js  c++  java
  • 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解密

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

    ——Death、Mr
  • 相关阅读:
    Android清单文件详解(四) ---- backupAgent的用法
    Android清单文件详解(一) ---- 一切从<manifest>开始
    Android OpenGL ES(九)----构建几何物体
    Android OpenGL ES(八)----纹理编程框架
    Android OpenGL ES(七)----理解纹理与纹理过滤
    Android OpenGL ES(六)----进入三维在代码中创建投影矩阵和旋转矩阵
    Android OpenGL ES(五)----进入三维正交投影和透视投影推导
    Android OpenGL ES(四)----调整屏幕的宽高比
    获取验证码按钮点击后,一分钟内不可继续点击
    选择本地图片后,上传前显示在界面上,实现实时预览
  • 原文地址:https://www.cnblogs.com/deathmr/p/9168870.html
Copyright © 2011-2022 走看看