【轉】C# RSA 加密,解密與簽名,驗證簽名


這是一篇轉載合並文章,主要內容來自一下兩篇:

使用的庫 bouncycastle


加密解密

加密解密相關的代碼,見:

簽名,驗證簽名


        #region 加簽      
        /// <summary>  
        /// 基於BouncyCastle的RSA簽名  
        /// </summary>  
        /// <param name="data"></param>  
        /// <param name="privateKeyJava"></param>  
        /// <param name="hashAlgorithm">JAVA的和.NET的不一樣,如:MD5(.NET)等同於MD5withRSA(JAVA)</param>  
        /// <param name="encoding"></param>  
        /// <returns></returns>  
        public static string RSASignJavaBouncyCastle(string data, string privateKeyJava, string hashAlgorithm = "MD5withRSA", string encoding = "UTF-8")  
        {  
            RsaKeyParameters privateKeyParam = (RsaKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKeyJava));  
            ISigner signer = SignerUtilities.GetSigner(hashAlgorithm);  
            signer.Init(true, privateKeyParam);//參數為true驗簽,參數為false加簽  
            var dataByte = Encoding.GetEncoding(encoding).GetBytes(data);  
            signer.BlockUpdate(dataByte, 0, dataByte.Length);  
            //return Encoding.GetEncoding(encoding).GetString(signer.GenerateSignature()); //簽名結果 非Base64String  
            return Convert.ToBase64String(signer.GenerateSignature());  
        }  
        #endregion  

        #region 驗簽  
        /// <summary>  
        /// 基於BouncyCastle的RSA簽名  
        /// </summary>  
        /// <param name="data">源數據</param>  
        /// <param name="publicKeyJava"></param>  
        /// <param name="signature">base64簽名</param>  
        /// <param name="hashAlgorithm">JAVA的和.NET的不一樣,如:MD5(.NET)等同於MD5withRSA(JAVA)</param>  
        /// <param name="encoding"></param>  
        /// <returns></returns>  
        public static bool VerifyJavaBouncyCastle(string data, string publicKeyJava, string signature, string hashAlgorithm = "MD5withRSA", string encoding = "UTF-8")  
        {  
            RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKeyJava));  
            ISigner signer = SignerUtilities.GetSigner(hashAlgorithm);  
            signer.Init(false, publicKeyParam);  
            byte[] dataByte = Encoding.GetEncoding(encoding).GetBytes(data);             
            signer.BlockUpdate(dataByte, 0, dataByte.Length);  
            //byte[] signatureByte = Encoding.GetEncoding(encoding).GetBytes(signature);// 非Base64String  
            byte[] signatureByte = Convert.FromBase64String(signature);  
            return signer.VerifySignature(signatureByte);  
        }  

hash 算法如果使用 SHA256,則使用 SHA256withRSA


C# 原生自帶的類,不支持 OpenSSL 生成的密鑰。
rsa - C# 如何使用OpenSSL生成的公鑰秘鑰對進行加密解密? - SegmentFault 思否


END

原文鏈接:https://www.cnblogs.com/jasongrass/p/12871621.html


免責聲明!

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



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