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();
             }
         }
     }
 }

 

posted @ 2013-07-17 13:54  如.若  阅读(857)  评论(0编辑  收藏  举报