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

    对于今天,网络安全越来越重要。其中也在公司项目中看过RSA一些加密方法。不完整。

    于是上查了一些资料,发现没有公钥和私钥的产生。所以我重密钥产生到加密,解密完整的步骤

    第一步产生密钥类 CreateKey

    View Code
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Security.Cryptography;
    using System.IO;
    
    namespace RSA
    {
        /// <summary>
        /// 创建公钥和私钥
        /// </summary>
        public static class CreateKey
        {
            #region GetPublicKey
            /// <summary>
            /// 产生公钥和私钥
            /// </summary>
            public static void GetPublicKey()
            {
                //RSA必须是一个对象,产生公钥和私钥
                using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
                {
                    using (StreamWriter writer = new StreamWriter("PrivateKey.xml"))
                    {
                        // ToXmlString中 true 表示同时包含 RSA 公钥和私钥;false 表示仅包含公钥。
                        writer.WriteLine(RSA.ToXmlString(true));
                    }
                    using (StreamWriter writer = new StreamWriter("PublicKey.xml"))
                    {
                        writer.WriteLine(RSA.ToXmlString(false));
                    }
    
                }
    
            }
            #endregion
           
    
        }
    }

    第二步是否含有公钥和密钥

    View Code
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    
    
    namespace RSA
    {
        public static  class ContainsKey
        {
            #region Contain
            /// <summary>
            /// 是否含有文件名
            /// </summary>
            /// <param name="Name">传入的文件名</param>
            /// <returns></returns>
            public  static  bool Contain(string Name)
            {
                string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
                string full=path+Name;
                full = full.Replace("\\",System.IO.Path.DirectorySeparatorChar.ToString());
               
                    if (!File.Exists(full))
                    {
                        return false;
                    }
                    return true;
            }
            #endregion 
    
            #region Create
            /// <summary>
            /// 判断是否含有,如果有返回true,如果没有创建返回true
            /// </summary>
            /// <returns></returns>
            public static bool Create()
            {
                try
                {
                    if (Contain("PrivateKey.xml"))
                    {
                        return true;
                    }
                    else
                    {
                        CreateKey.GetPublicKey();
                        return true;
                    }
                }
                catch
                {
                    return false;
                }
                
            }
            #endregion
        }
    }

    第三步读取公钥和密钥

    View Code
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Security.Cryptography;
    using System.IO;
    
    
    namespace RSA
    {
       
        public  static  class ReadKey
        {
            public static string publicKey = ReadPublicKey();
            public static string privateKey=ReadPrivateKey();
            #region ReadPublicKey
            /// <summary>
            /// 读取公钥的值
            /// </summary>
            /// <returns>公钥的值</returns>
            public static string  ReadPublicKey()
            {
                try
                {
                    using (StreamReader reader = new StreamReader("PublicKey.xml"))
                    {
                      return  reader.ReadToEnd();
                    }
    
                }
                catch
                {
                    return null;
                }
            }
            #endregion 
    
            #region ReadPrivateKey
            /// <summary>
            /// 读取私钥
            /// </summary>
            /// <returns>私钥字符串</returns>
            public static string ReadPrivateKey()
            {
                try
                {
                    using (StreamReader dr = new StreamReader("PrivateKey.xml"))
                    {
                        return dr.ReadToEnd();
                    }
                }
                catch
                {
                    return null;
                }
            }
    
            #endregion
        }
    }

     第四步对加密数据的封装

    View Code
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Security.Cryptography;
    
    namespace RSA
    {
        public static class SRSA
        {
            #region RSADeCrtypto
            /// <summary>
            /// 解密数据
            /// </summary>
            /// <param name="DataToDeCrypto">要解密的数据</param>
            /// <param name="RSAKeyInfo"></param>
            /// <param name="DoOAEPPadding"></param>
            /// <returns></returns>
            static public byte[] RSADeCrtypto(byte[] DataToDeCrypto, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
            {
                try
                {
                    RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
                    // System.Security.Cryptography.RSA 的参数。
                    RSA.ImportParameters(RSAKeyInfo);
                    //
                    // 参数:
                    //   
                    //     要解密的数据。
                    //
                    // 
                    //     如果为 true,则使用 OAEP 填充(仅在运行 Microsoft Windows XP 或更高版本的计算机上可用)执行直接的 System.Security.Cryptography.RSA
                    //     解密;否则,如果为 false,则使用 PKCS#1 1.5 版填充。
                    return RSA.Decrypt(DataToDeCrypto, DoOAEPPadding);
                }
                catch (CryptographicException e)
                {
                    Console.WriteLine(e.Message);
                    return null;
                }
            }
            #endregion
    
            #region RSAEnCrypto
            /// <summary>
            /// 加密数据
            /// </summary>
            /// <param name="DataToEnCrypto"></param>
            /// <param name="RSAKeyInfo"></param>
            /// <param name="DoOAEPPadding"></param>
            /// <returns></returns>
            static public byte[] RSAEnCrypto(byte[] DataToEnCrypto, RSAParameters RSAKeyInfo, bool DoOAEPPadding)
            {
                try
                {
                    RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
                    RSA.ImportParameters(RSAKeyInfo);
                    return RSA.Encrypt(DataToEnCrypto, DoOAEPPadding);
    
                }
                catch (CryptographicException e)
                {
                    Console.WriteLine(e.Message);
                    return null;
                }
            }
            #endregion
    
            #region Decrypt
            /// <summary>
            /// 解密数据
            /// </summary>
            /// <param name="base64code">传入加密数据</param>
            /// <returns>返回解密数据</returns>
            static public string Decrypt(string base64code)
            {
                try
                {
                    UnicodeEncoding ByteConverter = new UnicodeEncoding();
    
                    RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
                    RSA.FromXmlString(ReadKey.privateKey);
    
                    byte[] encryptedData;
                    byte[] decryptedData;
    
                    encryptedData = Convert.FromBase64String(base64code);
    
                    decryptedData = RSADeCrtypto(encryptedData, RSA.ExportParameters(true), false);
                    return ByteConverter.GetString(decryptedData);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    return null;
                }
    
    
            }
            #endregion
    
            #region Encrypt
            /// <summary>
            /// 加密数据
            /// </summary>
            /// <param name="toEncryptString">要解密的数据</param>
            /// <returns></returns>
            static public string Encrypt(string toEncryptString)
            {
                try
                {
                    UnicodeEncoding ByteConverter = new UnicodeEncoding();
    
    
                    byte[] encrypteData;
                    byte[] decrypteData;
                    decrypteData = ByteConverter.GetBytes(toEncryptString);
    
                    RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
                    RSA.FromXmlString(ReadKey.privateKey);
                    encrypteData = RSAEnCrypto(decrypteData, RSA.ExportParameters(false), false);
    
                    return Convert.ToBase64String(encrypteData);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    return null;
                }
            }
            #endregion
    
        }
    }

    演示

    View Code
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.IO;
    using System.Security.Cryptography;
    
    namespace RSA
    {
        class Program
        {
            static void Main(string[] args)
            {
                //判断是否含有私钥,如果没有创建
                if (ContainsKey.Create())
                {
                    Console.WriteLine("*********请输入输入要加密的数据************");
                    string encryptData=   Console.ReadLine();
                    Console.WriteLine("加密后的数据:{0}", SRSA.Encrypt(encryptData));
                    Console.WriteLine("解密后的数据:{0}", SRSA.Decrypt(SRSA.Encrypt(encryptData)));
                    Console.ReadLine();
                }
            }
        }
    }

    源码下载https://files.cnblogs.com/tangdacheng/RSA.zip

    这里没有详细的讲解希望大家耐性看

  • 相关阅读:
    leetcode(5)-罗马数字转整数
    leetcode(4)-整数反转
    leetcode(3)-回文数
    leetcode(2)-有效的括号
    leetcode(1)-两数之和
    HTTP基础(一)
    ubuntu 18.04安装MariaDB 10.04并通过远程navicat连接
    ubuntu18.04 root用户登录
    xshell连接ubuntu虚拟机
    ubuntu18.04使用node压缩包的安装及配置
  • 原文地址:https://www.cnblogs.com/tangdacheng/p/2813525.html
Copyright © 2011-2022 走看看