Example #1
0
        /// <summary>
        /// 公钥验签
        /// </summary>
        /// <param name="str">待验证的字符串</param>
        /// <param name="sign">加签之后的字符串</param>
        /// <param name="publicKey">公钥</param>
        /// <param name="signAlgType">hash算法</param>
        /// <returns>签名是否符合</returns>
        public static bool Verify(string str, string sign, string publicKey, SignAlgType signAlgType)
        {
            byte[] bt      = Encoding.UTF8.GetBytes(str);
            byte[] rgbHash = null;
            switch (signAlgType)
            {
            case SignAlgType.SHA1:
            {
                var csp = SHA1.Create();
                rgbHash = csp.ComputeHash(bt);
            }
            break;

            case SignAlgType.SHA256:
            {
                var csp = SHA256.Create();
                rgbHash = csp.ComputeHash(bt);
            }
            break;

            case SignAlgType.MD5:
            {
                var csp = MD5.Create();
                rgbHash = csp.ComputeHash(bt);
            }
            break;

            default:
                break;
            }
            RSACryptoServiceProvider key = new RSACryptoServiceProvider();
            RSAHelper rs  = new RSAHelper(RSAType.RSA, Encoding.UTF8, "", publicKey);
            var       xml = rs._publicKeyRsaProvider.ToXmlString(false);

            key.FromXmlString(xml);
            RSAPKCS1SignatureDeformatter deformatter = new RSAPKCS1SignatureDeformatter(key);

            deformatter.SetHashAlgorithm(signAlgType.ToString());
            byte[] rgbSignature = Convert.FromBase64String(sign);
            if (deformatter.VerifySignature(rgbHash, rgbSignature))
            {
                return(true);
            }
            return(false);
        }
Example #2
0
        /// <summary>
        /// 私钥签名
        /// </summary>
        /// <param name="str">需签名的数据</param>
        /// <param name="privateKey">私钥</param>
        /// <param name="signAlgType">hash算法</param>
        /// <returns>签名后的值</returns>
        public static string Sign(string str, string privateKey, SignAlgType signAlgType)
        {
            //根据需要加签时的哈希算法转化成对应的hash字符节
            byte[] bt      = Encoding.UTF8.GetBytes(str);
            byte[] rgbHash = null;
            switch (signAlgType)
            {
            case SignAlgType.SHA1:
            {
                var csp = SHA1.Create();
                rgbHash = csp.ComputeHash(bt);
            }
            break;

            case SignAlgType.SHA256:
            {
                var csp = SHA256.Create();
                rgbHash = csp.ComputeHash(bt);
            }
            break;

            case SignAlgType.MD5:
            {
                var csp = MD5.Create();
                rgbHash = csp.ComputeHash(bt);
            }
            break;

            default:
                break;
            }
            RSACryptoServiceProvider key = new RSACryptoServiceProvider();

            RSAHelper rs  = new RSAHelper(RSAType.RSA, Encoding.UTF8, privateKey);
            var       xml = rs._privateKeyRsaProvider.ToXmlString(true);

            key.FromXmlString(xml);
            RSAPKCS1SignatureFormatter formatter = new RSAPKCS1SignatureFormatter(key);

            formatter.SetHashAlgorithm(signAlgType.ToString());//此处是你需要加签的hash算法,需要和上边你计算的hash值的算法一致,不然会报错。
            byte[] inArray = formatter.CreateSignature(rgbHash);
            return(Convert.ToBase64String(inArray));
        }