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