C# RSA 加簽和驗簽


最近自己在弄RSA的加簽和驗簽相關的東西,也感謝網上各位大牛提供的代碼,自己在巨人的肩膀上再留下一些自己的一些踩過坑的經驗。

public class RSAHelper
    {
        public string privateKey { get; set; }

        public string publicKey { get; set; }
        public RSAHelper()
        {
            //初始化時生成公鑰和私鑰
            RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
            privateKey=provider.ToXmlString(true);//生成私鑰
            publicKey=provider.ToXmlString(false);//生成公鑰
        }

        /// <summary>
        /// 生成公鑰、私鑰
        /// </summary>
        /// <param name="PrivateKeyPath">私鑰文件保存路徑,包含文件名</param>
        /// <param name="PublicKeyPath">公鑰文件保存路徑,包含文件名</param>
        public void RSAKey()
        {
            RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
            provider.ToXmlString(true);//生成私鑰文件
            provider.ToXmlString(false);//生成公鑰文件
        }

        /// <summary>
        /// 簽名
        /// </summary>
        /// <param name="str">需簽名的數據</param>
        /// <returns>簽名后的值</returns>
        public string Sign(string str)
        {
            //根據需要加簽時的哈希算法轉化成對應的hash字符節
            byte[] bt = Encoding.GetEncoding("utf-8").GetBytes(str);
            var sha256 = new SHA256CryptoServiceProvider();
            byte[] rgbHash = sha256.ComputeHash(bt);

            RSACryptoServiceProvider key = new RSACryptoServiceProvider();
            key.FromXmlString(privateKey);
            RSAPKCS1SignatureFormatter formatter = new RSAPKCS1SignatureFormatter(key);
            formatter.SetHashAlgorithm("SHA256");//此處是你需要加簽的hash算法,需要和上邊你計算的hash值的算法一致,不然會報錯。
            byte[] inArray = formatter.CreateSignature(rgbHash);
            return Convert.ToBase64String(inArray);
        }

        /// <summary>
        /// 簽名驗證
        /// </summary>
        /// <param name="str">待驗證的字符串</param>
        /// <param name="sign">加簽之后的字符串</param>
        /// <returns>簽名是否符合</returns>
        public bool SignCheck(string str, string sign)
        {
            try
            {
                byte[] bt = Encoding.GetEncoding("utf-8").GetBytes(str);
                var sha256 = new SHA256CryptoServiceProvider();
                byte[] rgbHash = sha256.ComputeHash(bt);

                RSACryptoServiceProvider key = new RSACryptoServiceProvider();
                key.FromXmlString(publicKey);
                RSAPKCS1SignatureDeformatter deformatter = new RSAPKCS1SignatureDeformatter(key);
                deformatter.SetHashAlgorithm("SHA256");
                byte[] rgbSignature = Convert.FromBase64String(sign);
                if (deformatter.VerifySignature(rgbHash, rgbSignature))
                {
                    return true;
                }
                return false;
            }
            catch
            {
                return false;
            }
        }
    }

借鑒與:https://www.cnblogs.com/lijialong/archive/2010/07/12/rsa.html


免責聲明!

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



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