RSA加密解密等用法

rsa是非對稱加密,有公鑰和私鑰

公鑰用於加密,私鑰用於解密,私鑰無法加密,但是私鑰可以對內容簽名,公鑰可以對簽名進行驗證,這是rsa常用的使用場景

如果你想加密一小段關鍵的信息,那麼你可以用公鑰進行加密,對方收到後用私鑰進行解密。

如果你想發送一段文字,內容很長,你並不需要對內容進行加密,只是想用私鑰對內容進行數字簽名,對方收到你發的信息後,可以通過公鑰驗證簽名來證實這段信息是不是你發的,並且發的消息有沒有被篡改過。

所以這是rsa基本的兩種使用場景。

    public class RSACryption
    {
        #region RSA 加密解密

        #region RSA 的密鑰產生

        /// <summary>
        /// RSA產生密鑰
        /// </summary>
        /// <param name="xmlKeys">私鑰</param>
        /// <param name="xmlPublicKey">公鑰</param>
        public void RSAKey(out string xmlKeys, out string xmlPublicKey)
        {
            try
            {
                System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                xmlKeys = rsa.ToXmlString(true);
                xmlPublicKey = rsa.ToXmlString(false);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// 生成密鑰文件
        /// </summary>
        public void RSACreateKeyFile()
        {
            try
            {
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                using (StreamWriter writer = new StreamWriter("PrivateKey.key"))  //這個文件要保密...
                {
                    writer.WriteLine(rsa.ToXmlString(true));
                }
                using (StreamWriter writer = new StreamWriter("PublicKey.key"))
                {
                    writer.WriteLine(rsa.ToXmlString(false));
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// 讀取可執行目錄下的key文件內容
        /// </summary>
        /// <param name="directory"></param>
        /// <returns></returns>
        public string ReadKeyFile(string directory)
        {
            try
            {
                string key = string.Empty;
                //查找目錄下的.KEY後綴文件 獲取密鑰
                DirectoryInfo directoryInfo = new DirectoryInfo(directory);
                var keyFiles = directoryInfo.GetFiles("*.KEY", SearchOption.TopDirectoryOnly).OrderByDescending(m => m.CreationTime).ToList();
                if (keyFiles.Any())
                {
                    var keyFile = keyFiles[0];
                    key = ReadFile(keyFile.FullName);
                    return key;
                }
                else
                {
                    return string.Empty;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// 獲取可執行目錄下的key文件內容
        /// </summary>
        /// <param name="directory"></param>
        /// <param name="keyFileName"></param>
        /// <returns></returns>
        public string ReadKeyFile(string directory, string keyFileName)
        {
            try
            {
                string key = string.Empty;
                //查找目錄下的.KEY後綴文件 獲取密鑰
                DirectoryInfo directoryInfo = new DirectoryInfo(directory);
                var keyFiles = directoryInfo.GetFiles(keyFileName, SearchOption.TopDirectoryOnly).OrderByDescending(m => m.CreationTime).ToList();
                if (keyFiles.Any())
                {
                    var keyFile = keyFiles[0];
                    key = ReadFile(keyFile.FullName);
                    return key;
                }
                else
                {
                    return string.Empty;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        private string ReadFile(string path)
        {
            StringBuilder sb = new StringBuilder();
            try
            {
                using (StreamReader sr = new StreamReader(path))
                {
                    string line;

                    // 從文件讀取並顯示行,直到文件的末尾 
                    while ((line = sr.ReadLine()) != null)
                    {
                        sb.Append(line);
                    }
                }
                return sb.ToString();
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        #endregion

        #region RSA加密函數
        /// <summary>
        /// RSA的加密函數
        /// </summary>
        /// <param name="xmlPublicKey">公鑰</param>
        /// <param name="encryptString">待加密的字符串</param>
        /// <returns></returns>
        public string RSAEncrypt(string xmlPublicKey, string encryptString)
        {
            try
            {
                byte[] PlainTextBArray;
                byte[] CypherTextBArray;
                string Result;
                System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.FromXmlString(xmlPublicKey);
                PlainTextBArray = Encoding.UTF8.GetBytes(encryptString);
                CypherTextBArray = rsa.Encrypt(PlainTextBArray, false);
                Result = Convert.ToBase64String(CypherTextBArray);
                return Result;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// RSA的加密函數 
        /// </summary>
        /// <param name="xmlPublicKey">公鑰</param>
        /// <param name="EncryptString">待加密的字節數組</param>
        /// <returns></returns>
        public string RSAEncrypt(string xmlPublicKey, byte[] EncryptString)
        {
            try
            {
                byte[] CypherTextBArray;
                string Result;
                System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.FromXmlString(xmlPublicKey);
                CypherTextBArray = rsa.Encrypt(EncryptString, false);
                Result = Convert.ToBase64String(CypherTextBArray);
                return Result;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region RSA的解密函數        
        /// <summary>
        /// RSA的解密函數
        /// </summary>
        /// <param name="xmlPrivateKey">私鑰</param>
        /// <param name="decryptString">待解密的字符串</param>
        /// <returns></returns>
        public string RSADecrypt(string xmlPrivateKey, string decryptString)
        {
            try
            {
                byte[] PlainTextBArray;
                byte[] DypherTextBArray;
                string Result;
                System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.FromXmlString(xmlPrivateKey);
                PlainTextBArray = Convert.FromBase64String(decryptString);
                DypherTextBArray = rsa.Decrypt(PlainTextBArray, false);
                Result = Encoding.UTF8.GetString(DypherTextBArray);
                return Result;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// RSA的解密函數 
        /// </summary>
        /// <param name="xmlPrivateKey">私鑰</param>
        /// <param name="DecryptString">待解密的字節數組</param>
        /// <returns></returns>
        public string RSADecrypt(string xmlPrivateKey, byte[] DecryptString)
        {
            try
            {
                byte[] DypherTextBArray;
                string Result;
                System.Security.Cryptography.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                rsa.FromXmlString(xmlPrivateKey);
                DypherTextBArray = rsa.Decrypt(DecryptString, false);
                Result = Encoding.UTF8.GetString(DypherTextBArray);
                return Result;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion


        #region RSA數字簽名

        #region 獲取Hash描述表        
        /// <summary>
        /// 獲取Hash描述表
        /// </summary>
        /// <param name="strSource">待簽名的字符串</param>
        /// <param name="HashData">Hash描述</param>
        /// <returns></returns>
        public byte[] GetHashByte(string strSource)
        {
            try
            {
                byte[] Buffer;
                System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");
                Buffer = System.Text.Encoding.UTF8.GetBytes(strSource);
                return MD5.ComputeHash(Buffer);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// 獲取Hash描述表
        /// </summary>
        /// <param name="strSource"></param>
        /// <returns></returns>
        public string GetHashStr(string strSource)
        {
            try
            {
                //從字符串中取得Hash描述 
                byte[] Buffer;
                byte[] HashData;
                System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");
                Buffer = System.Text.Encoding.UTF8.GetBytes(strSource);
                HashData = MD5.ComputeHash(Buffer);
                return Convert.ToBase64String(HashData);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// 獲取Hash描述表
        /// </summary>
        /// <param name="objFile"></param>
        /// <returns></returns>
        public byte[] GetHashByte(System.IO.FileStream objFile)
        {
            try
            {
                //從文件中取得Hash描述 
                System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");
                byte[] HashData = MD5.ComputeHash(objFile);
                objFile.Close();
                return HashData;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// 獲取Hash描述表
        /// </summary>
        /// <param name="objFile"></param>
        /// <returns></returns>
        public string GetHashStr(System.IO.FileStream objFile)
        {
            try
            {
                //從文件中取得Hash描述 
                byte[] HashData;
                System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");
                HashData = MD5.ComputeHash(objFile);
                objFile.Close();
                return Convert.ToBase64String(HashData);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region RSA簽名


        /// <summary>
        /// RSA簽名
        /// </summary>
        /// <param name="strKeyPrivate"></param>
        /// <param name="HashbyteSignature"></param>
        /// <returns></returns>
        public string Signature(string strKeyPrivate, byte[] HashbyteSignature)
        {
            try
            {
                byte[] EncryptedSignatureData;
                System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();
                RSA.FromXmlString(strKeyPrivate);
                System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA);
                //設置簽名的算法爲MD5 
                RSAFormatter.SetHashAlgorithm("MD5");
                //執行簽名 
                EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature);
                return Convert.ToBase64String(EncryptedSignatureData);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }



        /// <summary>
        /// RSA簽名
        /// </summary>
        /// <param name="strKeyPrivate"></param>
        /// <param name="strHashbyteSignature"></param>
        /// <returns></returns>
        public string Signature(string strKeyPrivate, string strHashbyteSignature)
        {
            try
            {
                byte[] HashbyteSignature;
                byte[] EncryptedSignatureData;
                HashbyteSignature = Convert.FromBase64String(strHashbyteSignature);
                System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();
                RSA.FromXmlString(strKeyPrivate);
                System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(RSA);
                //設置簽名的算法爲MD5 
                RSAFormatter.SetHashAlgorithm("MD5");
                //執行簽名 
                EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature);
                return Convert.ToBase64String(EncryptedSignatureData);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #region RSA 簽名驗證
        /// <summary>
        /// RSA簽名驗證
        /// </summary>
        /// <param name="strKeyPublic">公鑰</param>
        /// <param name="HashbyteDeformatter">Hash描述</param>
        /// <param name="DeformatterData">簽名後的結果</param>
        /// <returns></returns>
        public bool SignatureVerify(string strKeyPublic, byte[] HashbyteDeformatter, byte[] DeformatterData)
        {
            try
            {
                System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();
                RSA.FromXmlString(strKeyPublic);
                System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA);
                //指定解密的時候HASH算法爲MD5 
                RSADeformatter.SetHashAlgorithm("MD5");
                if (RSADeformatter.VerifySignature(HashbyteDeformatter, DeformatterData))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// RSA簽名驗證
        /// </summary>
        /// <param name="strKeyPublic">公鑰</param>
        /// <param name="strHashbyteDeformatter">Hash描述</param>
        /// <param name="DeformatterData">簽名後的結果</param>
        /// <returns></returns>
        public bool SignatureVerify(string strKeyPublic, string strHashbyteDeformatter, byte[] DeformatterData)
        {
            try
            {
                byte[] HashbyteDeformatter;
                HashbyteDeformatter = Convert.FromBase64String(strHashbyteDeformatter);
                System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();
                RSA.FromXmlString(strKeyPublic);
                System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA);
                //指定解密的時候HASH算法爲MD5 
                RSADeformatter.SetHashAlgorithm("MD5");
                if (RSADeformatter.VerifySignature(HashbyteDeformatter, DeformatterData))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// RSA簽名驗證
        /// </summary>
        /// <param name="strKeyPublic">公鑰</param>
        /// <param name="HashbyteDeformatter">Hash描述</param>
        /// <param name="strDeformatterData">簽名後的結果</param>
        /// <returns></returns>
        public bool SignatureVerify(string strKeyPublic, byte[] HashbyteDeformatter, string strDeformatterData)
        {
            try
            {
                byte[] DeformatterData;
                System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();
                RSA.FromXmlString(strKeyPublic);
                System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA);
                //指定解密的時候HASH算法爲MD5 
                RSADeformatter.SetHashAlgorithm("MD5");
                DeformatterData = Convert.FromBase64String(strDeformatterData);
                if (RSADeformatter.VerifySignature(HashbyteDeformatter, DeformatterData))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// RSA簽名驗證
        /// </summary>
        /// <param name="strKeyPublic">公鑰</param>
        /// <param name="strHashbyteDeformatter">Hash描述</param>
        /// <param name="strDeformatterData">簽名後的結果</param>
        /// <returns></returns>
        public bool SignatureVerify(string strKeyPublic, string strHashbyteDeformatter, string strDeformatterData)
        {
            try
            {
                byte[] DeformatterData;
                byte[] HashbyteDeformatter;
                HashbyteDeformatter = Convert.FromBase64String(strHashbyteDeformatter);
                System.Security.Cryptography.RSACryptoServiceProvider RSA = new System.Security.Cryptography.RSACryptoServiceProvider();
                RSA.FromXmlString(strKeyPublic);
                System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(RSA);
                //指定解密的時候HASH算法爲MD5 
                RSADeformatter.SetHashAlgorithm("MD5");
                DeformatterData = Convert.FromBase64String(strDeformatterData);
                if (RSADeformatter.VerifySignature(HashbyteDeformatter, DeformatterData))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        #endregion

        #endregion
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章