• C# 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
      
    
     第四步对加密数据的封装
    
    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();
                 }
             }
         }
     }
  • 相关阅读:
    欧几里得证明$sqrt{2}$是无理数
    博弈论和三人决斗
    数学证明和科学证明
    导电塑料入梦来
    宋朝记载的超新星爆发和光速不变
    混合溶剂中的高分子刷
    2015年总结和2016年展望
    一步一步学Silverlight 2系列(32):图形图像综合实例—“功夫之王”剧照播放
    一步一步学Silverlight 2系列(31):图形图像综合实例—实现水中倒影效果
    一步一步学Silverlight 2系列(30):使用Transform实现更炫的效果(下)
  • 原文地址:https://www.cnblogs.com/rinack/p/3195693.html
Copyright © 2020-2023  润新知