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
        }
  • 相关阅读:
    Atitit oil painting article list sumup s55 C:\Users\Administrator\Desktop\油画技术资料包\Atitit Atitit 图像
    Atitit 缓存实施遇到的问题与解决 s420 attilax 艾提拉总结 Atitit 缓存增加最佳实践与实施流程 1. 业务准确性问题正确性问题 1 1.1. 缓存key正确性问题 1
    Atiitt 流水线停顿问题与解决方法 1. 流水线技术方式分类 1 2. 但在实际中,会出现2种情况使流水线停顿下来或不能启动: 2 2.1. 1、多个任务在同一时间周期内争用同一个流水段 2 2
    Atitit mybatis 配置 redis 集成 attilax总结 艾提拉总结 1.1. setting name="cacheEnabled" v 1 1.2. Mapper文件 1 1.
    Atitit spring cache key的生成 与ken生成规范 1. Good key name meth.params 1 1.1. Use epl 的mode but only clss
    Atitit 获取数据库表主键功能的实现 数据库模块 艾提拉attilax总结 package com.attilax.sql; import java.sql.Connection; im
    atitit 文件搜索 映象文件夹结构模式.docxAtitit 百度网盘 文件 与跨机器 文件 搜索 查询 检索 解决方案 最小化索引法 映象文件夹结构模式. 1. 生成文件夹 结构信息 1
    Atitit 成果艺术 attilax著 艾提拉著 目录 1. 2 2. 理论类 2 2.1. xxx模型 曲线 定律 原则 曲线 2 3. 代码类成果 范例代码项目 代码类库 与代码片段
    Atitit 架构艺术 与架构常见包含的技术 1. 架构的目的是什么??解决的问题 所有的问题都能通过架构解决 2 1.1. 提高可读性 提升可维护性架构 降低技术难度 2 1.2. 提升管理性
    atitti 提升稳定性的艺术之程序代码级别稳定性的艺术 attialx著 艾提拉著 s420.docx 1. 前言 1 2. 为什么会发生稳定性问题 1 2.1. 单点故障(单点故障率较高) 1
  • 原文地址:https://www.cnblogs.com/lsqandzy/p/4275005.html
Copyright © 2011-2022 走看看