zoukankan      html  css  js  c++  java
  • C# RSA加密解密

          应用场景:开放接口给外部调用,为了防止数据被恶意篡改,或者访问的合法性 ,用RSA对数据进行加密。 RSA会生成公钥和私钥,公钥用来加密,私钥用来解密。    

          RSA加密算法是一种非对称加密算法。在公钥加密标准和电子商业中RSA被广泛使用。RSA是1977年由罗纳德李维斯特(Ron Rivest)、阿迪萨莫尔(Adi Shamir)和伦纳德阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

          RSA 具体的逻辑就不写了,网上一大堆,看着挺复杂,我了解了下原理,没深入理解,这里就不粘了。

    下面粘下具体的代码

        public static class RSACryption
        {
            #region RSA 加密解密 
    
            #region RSA 的密钥产生 
    
            /// <summary>
            /// RSA 的密钥产生 产生私钥 和公钥 
            /// </summary>
            /// <param name="xmlPrivateKey"></param>
            /// <param name="xmlPublicKey"></param>
            public static void RSAKey()
            {
                //System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                //xmlPrivateKey = rsa.ToXmlString(true);
                //xmlPublicKey = rsa.ToXmlString(false);
                string path = System.AppDomain.CurrentDomain.BaseDirectory;
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                using (StreamWriter writer = new StreamWriter(path + @"PrivateKey.xml"))  //这个文件要保密...
                {
                    writer.WriteLine(rsa.ToXmlString(true));
                }
                using (StreamWriter writer = new StreamWriter(path + @"PublicKey.xml"))
                {
                    writer.WriteLine(rsa.ToXmlString(false));
                }
            }
            #endregion
    
            #region RSA的加密函数 
            //############################################################################## 
            //RSA 方式加密 
            //说明KEY必须是XML的行式,返回的是字符串 
            //在有一点需要说明!!该加密方式有 长度 限制的!! 
            //############################################################################## 
            //RSA的加密函数 string
            public static string RSAEncrypt(string xmlPublicKey, string m_strEncryptString)
            {
    
                byte[] PlainTextBArray;
                byte[] CypherTextBArray;
                string Result;
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.FromXmlString(xmlPublicKey);
                PlainTextBArray = (new UnicodeEncoding()).GetBytes(m_strEncryptString);
                CypherTextBArray = rsa.Encrypt(PlainTextBArray, false);
                Result = Convert.ToBase64String(CypherTextBArray);
                return Result;
    
            }
            //RSA的加密函数 byte[]
            public static string RSAEncrypt(string xmlPublicKey, byte[] EncryptString)
            {
    
                byte[] CypherTextBArray;
                string Result;
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.FromXmlString(xmlPublicKey);
                CypherTextBArray = rsa.Encrypt(EncryptString, false);
                Result = Convert.ToBase64String(CypherTextBArray);
                return Result;
    
            }
            #endregion
    
            #region RSA的解密函数 
            //RSA的解密函数 string
            public static string RSADecrypt(string xmlPrivateKey, string m_strDecryptString)
            {
                byte[] PlainTextBArray;
                byte[] DypherTextBArray;
                string Result;
                System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.FromXmlString(xmlPrivateKey);
                PlainTextBArray = Convert.FromBase64String(m_strDecryptString);
                DypherTextBArray = rsa.Decrypt(PlainTextBArray, false);
                Result = (new UnicodeEncoding()).GetString(DypherTextBArray);
                return Result;
    
            }
            //RSA的解密函数 byte
            public static string RSADecrypt(string xmlPrivateKey, byte[] DecryptString)
            {
                byte[] DypherTextBArray;
                string Result;
                System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.FromXmlString(xmlPrivateKey);
                DypherTextBArray = rsa.Decrypt(DecryptString, false);
                Result = (new UnicodeEncoding()).GetString(DypherTextBArray);
                return Result;
            }
            #endregion
    
            #endregion
        }
    View Code

    一、RSA加密 

    1、加密方法

            /// <summary>
            /// 加密
            /// </summary>
            /// <param name="model"></param>
            /// <returns></returns>
            [HttpPost]
            public IHttpActionResult RSAEncrypt(RSARequest model)
            {
                string encryptionStr = RSACryption.RSAEncrypt(model.XmlPublicKey, model.StrEncryptString);
                return Ok(new
                {
                    code = ResultCode.Success,
                    encryptionStr = encryptionStr,
                    message = "加密成功!"
                });
            }
    View Code

    2、传递参数

        public class RSARequest
        {
            /// <summary>
            /// 公钥
            /// </summary>
            public string XmlPublicKey { get; set; }
            /// <summary>
            /// 加密字符串
            /// </summary>
            public string StrEncryptString { get; set; }
        }
    View Code

     3、调用结果

    二、RSA解密

    1、解密

     XmlDocument doc = new XmlDocument();
                    string path = System.AppDomain.CurrentDomain.BaseDirectory;
                    doc.Load(path + @"PrivateKey.xml");
                    string token = RSACryption.RSADecrypt(doc.InnerXml, model.AccessToken);
    View Code

     PS:需要注意的是无论是公钥还是私钥,用来加密和解密传参数的时候,需要传递的是生成的公钥和私钥的全部内容。读取全部的xml看成是一个字符串,不要试图去提取里面的参数传递,那样是不对的。

          

  • 相关阅读:
    Installutil.exe的位置和路径
    .net服务安装(转载)
    移动程序云测试中心
    如何通过web地址直接调用webservices
    VC++引用类型与指针类型
    Android模拟 HTTP multipart/formdata 请求协议信息实现图片上传
    firefox看网页的插件
    DOS下输入汉字
    电脑APK
    HDOJ 1071(球泡无线和直线区域内的面积)
  • 原文地址:https://www.cnblogs.com/zhangjd/p/10870334.html
Copyright © 2011-2022 走看看