RSA加密解密及RSA簽名和驗證


1.RSA加密解密:
 (1)獲取密鑰,這里是產生密鑰,實際應用中可以從各種存儲介質上讀取密鑰 (2)加密 (3)解密
2.RSA簽名和驗證
 (1)獲取密鑰,這里是產生密鑰,實際應用中可以從各種存儲介質上讀取密鑰 (2)獲取待簽名的Hash碼 (3)獲取簽名的字符串 (4)驗證

3.公鑰與私鑰的理解:
 (1)私鑰用來進行解密和簽名,是給自己用的。
 (2)公鑰由本人公開,用於加密和驗證簽名,是給別人用的。
   (3)當該用戶發送文件時,用私鑰簽名,別人用他給的公鑰驗證簽名,可以保證該信息是由他發送的。當該用戶接受文件時,別人用他的公鑰加密,他用私鑰解密,可以保證該信息只能由他接收到。

 

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;
        }
    }
    #endregion

    #region RSA加密函數
    //############################################################################## 
    //RSA 方式加密 
    //KEY必須是XML的形式,返回的是字符串 
    //該加密方式有長度限制的!
    //############################################################################## 
       
    /// <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 = (new UnicodeEncoding()).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 = (new UnicodeEncoding()).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 = (new UnicodeEncoding()).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 bool GetHash(string strSource, ref byte[] HashData)
    {
        try
        {               
            byte[] Buffer;
            System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");
            Buffer = System.Text.Encoding.GetEncoding("GB2312").GetBytes(strSource);
            HashData = MD5.ComputeHash(Buffer);
            return true;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    /// <summary>
    /// 獲取Hash描述表
    /// </summary>
    /// <param name="strSource">待簽名的字符串</param>
    /// <param name="strHashData">Hash描述</param>
    /// <returns></returns>
    public bool GetHash(string strSource, ref string strHashData)
    {
        try
        {
            //從字符串中取得Hash描述 
            byte[] Buffer;
            byte[] HashData;
            System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");
            Buffer = System.Text.Encoding.GetEncoding("GB2312").GetBytes(strSource);
            HashData = MD5.ComputeHash(Buffer);
            strHashData = Convert.ToBase64String(HashData);
            return true;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

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

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

    #region RSA簽名
    /// <summary>
    /// RSA簽名
    /// </summary>
    /// <param name="strKeyPrivate">私鑰</param>
    /// <param name="HashbyteSignature">待簽名Hash描述</param>
    /// <param name="EncryptedSignatureData">簽名后的結果</param>
    /// <returns></returns>
    public bool SignatureFormatter(string strKeyPrivate, byte[] HashbyteSignature, ref byte[] EncryptedSignatureData)
    {
        try
        {
            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 true;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    /// <summary>
    /// RSA簽名
    /// </summary>
    /// <param name="strKeyPrivate">私鑰</param>
    /// <param name="HashbyteSignature">待簽名Hash描述</param>
    /// <param name="m_strEncryptedSignatureData">簽名后的結果</param>
    /// <returns></returns>
    public bool SignatureFormatter(string strKeyPrivate, byte[] HashbyteSignature, ref string strEncryptedSignatureData)
    {
        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);
            strEncryptedSignatureData = Convert.ToBase64String(EncryptedSignatureData);
            return true;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    /// <summary>
    /// RSA簽名
    /// </summary>
    /// <param name="strKeyPrivate">私鑰</param>
    /// <param name="strHashbyteSignature">待簽名Hash描述</param>
    /// <param name="EncryptedSignatureData">簽名后的結果</param>
    /// <returns></returns>
    public bool SignatureFormatter(string strKeyPrivate, string strHashbyteSignature, ref byte[] EncryptedSignatureData)
    {
        try
        {
            byte[] HashbyteSignature;

            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 true;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    /// <summary>
    /// RSA簽名
    /// </summary>
    /// <param name="strKeyPrivate">私鑰</param>
    /// <param name="strHashbyteSignature">待簽名Hash描述</param>
    /// <param name="strEncryptedSignatureData">簽名后的結果</param>
    /// <returns></returns>
    public bool SignatureFormatter(string strKeyPrivate, string strHashbyteSignature, ref string strEncryptedSignatureData)
    {
        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);
            strEncryptedSignatureData = Convert.ToBase64String(EncryptedSignatureData);
            return true;
        }
        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 SignatureDeformatter(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 SignatureDeformatter(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 SignatureDeformatter(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 SignatureDeformatter(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 

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM