/// <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); }
/// <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)); }