zoukankan      html  css  js  c++  java
  • 关于RSA加密

    RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。

    RSA的算法涉及三个参数,n、e1、e2。

    其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。

    e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。

    (n及e1),(n及e2)就是密钥对。 

      RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1 mod n;B=A^e2 mod n;

      e1和e2可以互换使用,即: 

      A=B^e2 mod n;B=A^e1 mod n;

    using System.Security.Cryptography;
    ///
    <summary> /// RSA加密 /// </summary> /// <param name="publickey"></param> /// <param name="content"></param> /// <returns></returns> public static string RSAEncrypt(string publickey, string content) { publickey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); byte[] cipherbytes; rsa.FromXmlString(publickey); cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false); return Convert.ToBase64String(cipherbytes); } /// <summary> /// RSA解密 /// </summary> /// <param name="privatekey"></param> /// <param name="content"></param> /// <returns></returns> public static string RSADecrypt(string privatekey, string content) { privatekey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent><P>/hf2dnK7rNfl3lbqghWcpFdu778hUpIEBixCDL5WiBtpkZdpSw90aERmHJYaW2RGvGRi6zSftLh00KHsPcNUMw==</P><Q>6Cn/jOLrPapDTEp1Fkq+uz++1Do0eeX7HYqi9rY29CqShzCeI7LEYOoSwYuAJ3xA/DuCdQENPSoJ9KFbO4Wsow==</Q><DP>ga1rHIJro8e/yhxjrKYo/nqc5ICQGhrpMNlPkD9n3CjZVPOISkWF7FzUHEzDANeJfkZhcZa21z24aG3rKo5Qnw==</DP><DQ>MNGsCB8rYlMsRZ2ek2pyQwO7h/sZT8y5ilO9wu08Dwnot/7UMiOEQfDWstY3w5XQQHnvC9WFyCfP4h4QBissyw==</DQ><InverseQ>EG02S7SADhH1EVT9DD0Z62Y0uY7gIYvxX/uq+IzKSCwB8M2G7Qv9xgZQaQlLpCaeKbux3Y59hHM+KpamGL19Kg==</InverseQ><D>vmaYHEbPAgOJvaEXQl+t8DQKFT1fudEysTy31LTyXjGu6XiltXXHUuZaa2IPyHgBz0Nd7znwsW/S44iql0Fen1kzKioEL3svANui63O3o5xdDeExVM6zOf1wUUh/oldovPweChyoAdMtUzgvCbJk1sYDJf++Nr0FeNW1RB1XG30=</D></RSAKeyValue>"; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); byte[] cipherbytes; rsa.FromXmlString(privatekey); cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false); return Encoding.UTF8.GetString(cipherbytes); }

    原文来自:

    http://www.cnblogs.com/linzheng/archive/2011/02/20/1959123.html

    公钥和密钥的生成:

     private void but()       
              {          
                  //使用默认密钥创建RSACryptoServiceProvider对象   
                  RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();     
                  //显示包含公钥/私钥对的XML表示形式,如果只显示公钥,将参数改为false即可           
                  Write_Txt(rsa.ToXmlString(false)); //这生成了公钥和密钥        
                  //将被加密的字符串转换为字节数组     
                  byte[] dataToEncrypt = Encoding.UTF8.GetBytes("hello");         
                  try           
                  {             
                      //得到加密后的字节数组      
                      byte[] encryptedData = rsa.Encrypt(dataToEncrypt, false);      
                      this.richTextBox1.AppendText(Encoding.UTF8.GetString(encryptedData)+" 
    ");    
                      //得到解密后的字节数组 
                      rsaDecrypt(encryptedData);
                      byte[] decryptedData = rsa.Decrypt(encryptedData, false);
                      this.richTextBox1.AppendText("解密"+Encoding.UTF8.GetString(decryptedData) + " 
    ");     
                  }         
                  catch (Exception err)   
                  {             
                      MessageBox.Show(err.Message);  
                  }      
              }

     封装了一下,写到一个类中。加密后的内容写到文件里。解密的时候读取:

      public class RSCEN
        {
    
          /*
           * <RSAKeyValue><Modulus>ql+LrSBSyTeRQJN24dR76iRoNi8kRs7wYlwG0FRLuujGkR62HJTD/YM/7miAxCR0lufVGx6E0Ej46OSwIRsqwQo/C2WUnvjlbs/bGiiXkD7IC9lsmzQQEvVjTyrUMVzs7NQMoXwzvIiGGPUzPrPfuXOuPDtbOD/odr3e4pOP6ts=</Modulus><Exponent>AQAB</Exponent><P>3wM9IzYsOEa3eruVG0qjZ5IL4YleDVsCcTma9LT5cQitx4vAKUhYPuljH7ILl669cEWjmt/xGLw6uuOxD3VpYQ==</P><Q>w5MGBeFi3roc+SszgOJpl3QxinxIhcXsCXA/aXYXOtTMqcXCGuV3atSS+YDaP5zt0Nrvedrr6hHaoLfzMZyRuw==</Q><DP>E9eO7f4Y6xznoETmXFpEtadZ5UQ6mQea7QYKEnGzq+nwxEtb2pB0QYy0ZBKMU3+ZnU6k4te/9Mpyk0RE8bIpoQ==</DP><DQ>T4sZtQSRcOMja5hNj0sHBUmF6LxZxsbUFJapw9v64LuyLg63vra7liC1UnM80QijlQGmytnmf8IZOKr4Z6I1hw==</DQ><InverseQ>yfjwKeVxrr8Docp69gaEkoFFY1IwTw+Jpkf/LXIW+s5IZeqbhT7VoO5AXXMvhEGLi1IreNmzqEbhNVw3CudV6Q==</InverseQ><D>SfvBoMV3ja9WoQ8oQbrOsIdsxZLFEwaL9np17wOb+ydYCu6mMFUdornbCkFRIVufUWSM8wDWtcfqZt/f6BBvCL0P2xwBRuNWLP2fY8Yw/puyIlz5p2M3VcUBQcoZ63tX9NkQ3uaqFAlOKW0VrYDjviKPx5NhcR1glkdgYfDahUE=</D></RSAKeyValue>
           * */
           
            #region 钥匙
            
            /// <summary>
            /// 公钥
            /// </summary>
            private static string publickey = @"<RSAKeyValue><Modulus>ql+LrSBSyTeRQJN24dR76iRoNi8kRs7wYlwG0FRLuujGkR62HJTD/YM/7miAxCR0lufVGx6E0Ej46OSwIRsqwQo/C2WUnvjlbs/bGiiXkD7IC9lsmzQQEvVjTyrUMVzs7NQMoXwzvIiGGPUzPrPfuXOuPDtbOD/odr3e4pOP6ts=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
            /// <summary>
            /// 密钥
            /// </summary>
            private static string privatekey = @"<RSAKeyValue><Modulus>ql+LrSBSyTeRQJN24dR76iRoNi8kRs7wYlwG0FRLuujGkR62HJTD/YM/7miAxCR0lufVGx6E0Ej46OSwIRsqwQo/C2WUnvjlbs/bGiiXkD7IC9lsmzQQEvVjTyrUMVzs7NQMoXwzvIiGGPUzPrPfuXOuPDtbOD/odr3e4pOP6ts=</Modulus><Exponent>AQAB</Exponent><P>3wM9IzYsOEa3eruVG0qjZ5IL4YleDVsCcTma9LT5cQitx4vAKUhYPuljH7ILl669cEWjmt/xGLw6uuOxD3VpYQ==</P><Q>w5MGBeFi3roc+SszgOJpl3QxinxIhcXsCXA/aXYXOtTMqcXCGuV3atSS+YDaP5zt0Nrvedrr6hHaoLfzMZyRuw==</Q><DP>E9eO7f4Y6xznoETmXFpEtadZ5UQ6mQea7QYKEnGzq+nwxEtb2pB0QYy0ZBKMU3+ZnU6k4te/9Mpyk0RE8bIpoQ==</DP><DQ>T4sZtQSRcOMja5hNj0sHBUmF6LxZxsbUFJapw9v64LuyLg63vra7liC1UnM80QijlQGmytnmf8IZOKr4Z6I1hw==</DQ><InverseQ>yfjwKeVxrr8Docp69gaEkoFFY1IwTw+Jpkf/LXIW+s5IZeqbhT7VoO5AXXMvhEGLi1IreNmzqEbhNVw3CudV6Q==</InverseQ><D>SfvBoMV3ja9WoQ8oQbrOsIdsxZLFEwaL9np17wOb+ydYCu6mMFUdornbCkFRIVufUWSM8wDWtcfqZt/f6BBvCL0P2xwBRuNWLP2fY8Yw/puyIlz5p2M3VcUBQcoZ63tX9NkQ3uaqFAlOKW0VrYDjviKPx5NhcR1glkdgYfDahUE=</D></RSAKeyValue>";
            #endregion
            /// <summary>
            /// 加密保存文件
            /// </summary>
            public static bool RSAEn(string message)
            {  
                try
                {
                    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(message.Length*8+11);
                   //string ddd= rsa.ToXmlString(true);
                    rsa.FromXmlString(publickey);
                    byte[] dataToEncrypt = Encoding.UTF8.GetBytes(message);               
                    byte[] encryptedData = rsa.Encrypt(dataToEncrypt,false);
                    return Write_Txt(encryptedData);                   
                }
                catch (Exception err)
                {
                    return false;
                }
            }
            /// <summary>
            /// 获取解密后的文件内容
            /// </summary>
            /// <returns>-1标示解密过程中出现了异常,-2标示物理文件读取失败</returns>
            public static string RSADe()
            {
                try
                {
                    string temp = Read_txt();
                    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(temp.Length * 8 + 11);
                    rsa.FromXmlString(privatekey);
                    
                    switch (temp)
                    {
                        case "-2":
                            return "-2";
                        default:
                    
                            byte[] encryptedData = rsa.Decrypt(Convert.FromBase64String(temp), false);
    
                            return Encoding.UTF8.GetString(encryptedData);
                    }               
                }
                catch (Exception)
                {
                    return "-1";
                }
            }
            #region 写文件
            private static string path = System.Environment.CurrentDirectory + "\type.data";
            /// <summary>
            /// 写入文件
            /// </summary>
            /// <param name="bytes"></param>
            /// <returns></returns>
            static protected bool Write_Txt(byte[] bytes)
            {
                  
                try
                {                
                    File.WriteAllText(path,Convert.ToBase64String(bytes));               
                    return true;
                }
                catch (Exception ex)
                {
                  
                    return false;
                }
            }
            #endregion
            #region 读文件
            /// <summary>
            /// 读取文件
            /// </summary>
            /// <returns></returns>
            static string Read_txt()
            {
                try
                {
                    return File.ReadAllText(path, Encoding.UTF8);
                }
                catch (Exception ex)
                {
                    return "-2";
                }
            }
            #endregion
        }
  • 相关阅读:
    Connection with Web.config
    sp_user_no(參數數的oracle_sp)及fn_test(有返回值的oracle參數)
    xml學習心得
    OOP 术语:Attributes(特性)与 Properties(属性)的区别(转载)
    asp.net 4.0 新特性(转载)
    详解C#中Attribute特性应用 (转载)
    保存web.config文件(转载)
    OOP 术语:Arguments(参量)和 Parameters(参数)的区别(转载)
    HTTP调试工具:Fiddler,httpwatch 介绍(转)
    C# 4.0新特性dynamic有何用处?(转载)
  • 原文地址:https://www.cnblogs.com/lsqandzy/p/4275005.html
Copyright © 2011-2022 走看看