/// <summary> /// /// </summary> /// <param name="data"></param> /// <param name="privateKey"></param> /// <param name="type"></param> /// <param name="encoding"></param> /// <returns></returns> public static string Sign(string data, string privateKey, RsaType type = RsaType.RSA, Encoding encoding = null) { if (string.IsNullOrEmpty(data)) throw new ArgumentNullException(nameof(data)); if (string.IsNullOrEmpty(privateKey)) throw new ArgumentNullException(nameof(privateKey)); if (encoding == null) encoding = Encoding.UTF8; #if netstandard using (var rsa = RSA.Create()) #else using (var rsa = new RSACryptoServiceProvider()) #endif { var rsaParameters = GetRsaParameterByPrivateKey(privateKey); rsa.ImportParameters(rsaParameters); var dataBytes = encoding.GetBytes(data); #if netstandard var hashAlgorithmName = type == RsaType.RSA ? HashAlgorithmName.SHA1 : HashAlgorithmName.SHA256; var signatureBytes = rsa.SignData(dataBytes, hashAlgorithmName, RSASignaturePadding.Pkcs1); #else var hashAlgorithmName = type == RsaType.RSA ? "SHA1" : "SHA256"; var signatureBytes = rsa.SignData(dataBytes, hashAlgorithmName); #endif var result = Convert.ToBase64String(signatureBytes); return result; } }
/// <summary> /// 签名,使用私钥签名 /// </summary> /// <param name="value">待签名的值</param> /// <param name="key">密钥</param> /// <param name="encoding">编码</param> /// <param name="type">算法类型</param> /// <param name="padding">填充方式</param> /// <returns></returns> public static string Sign(string value, string key, Encoding encoding, RsaType type, RSASignaturePadding padding) { byte[] data = encoding.GetBytes(value); var provider = CreateRsaProviderFromPrivateKey(key); var signatureBytes = provider.SignData(data, GetHashAlgorithmName(type), padding); return(Convert.ToBase64String(signatureBytes)); }
/// <summary> /// Rsa加密 /// </summary> private static string RsaSign(string value, string key, Encoding encoding, RsaType type) { if (string.IsNullOrWhiteSpace(value) || string.IsNullOrWhiteSpace(key)) { return(string.Empty); } var rsa = new RsaHelper(type, encoding, key); return(rsa.Sign(value)); }
/// <summary> /// 获取哈希算法名 /// </summary> /// <param name="type">Rsa 算法类型</param> /// <returns></returns> private static HashAlgorithmName GetHashAlgorithmName(RsaType type) { switch (type) { case RsaType.Rsa: return(HashAlgorithmName.SHA1); case RsaType.Rsa2: return(HashAlgorithmName.SHA256); default: return(HashAlgorithmName.SHA1); } }
/// <summary> /// 实例化RSAHelper /// </summary> /// <param name="rsaType">加密算法类型 RSA SHA1;RSA2 SHA256 密钥长度至少为2048</param> /// <param name="encoding">编码类型</param> /// <param name="privateKey">私钥</param> /// <param name="publicKey">公钥</param> public RsaHelper(RsaType rsaType, Encoding encoding, string privateKey, string publicKey = null) { _encoding = encoding; if (!string.IsNullOrEmpty(privateKey)) { _privateKeyRsaProvider = CreateRsaProviderFromPrivateKey(privateKey); } if (!string.IsNullOrEmpty(publicKey)) { _publicKeyRsaProvider = CreateRsaProviderFromPublicKey(publicKey); } _hashAlgorithmName = rsaType == RsaType.Rsa ? HashAlgorithmName.SHA1 : HashAlgorithmName.SHA256; }
/// <summary> /// /// </summary> /// <param name="data"></param> /// <param name="sign"></param> /// <param name="publicKey"></param> /// <param name="type"></param> /// <param name="encoding"></param> /// <returns></returns> public static bool VerifyData(string data, string sign, string publicKey, RsaType type = RsaType.RSA, Encoding encoding = null) { if (string.IsNullOrEmpty(data)) throw new ArgumentNullException(nameof(data)); if (string.IsNullOrEmpty(sign)) throw new ArgumentNullException(nameof(sign)); if (string.IsNullOrEmpty(publicKey)) throw new ArgumentNullException(nameof(publicKey)); if (encoding == null) encoding = Encoding.UTF8; byte[] dataBytes = encoding.GetBytes(data); byte[] signBytes = Convert.FromBase64String(sign); #if netstandard using (var rsa = RSA.Create()) #else using (var rsa = new RSACryptoServiceProvider() { PersistKeyInCsp = false }) #endif { RSAParameters rsaKeyInfo = GetRsaParameterByPublicKey(publicKey); rsa.ImportParameters(rsaKeyInfo); #if netstandard var hashAlgorithmName = type == RsaType.RSA ? HashAlgorithmName.SHA1 : HashAlgorithmName.SHA256; var result = rsa.VerifyData(dataBytes, signBytes, hashAlgorithmName, RSASignaturePadding.Pkcs1); #else //bool result = false; //if (type == RsaType.RSA) //{ // using (var sha1 = new SHA1CryptoServiceProvider()) // { // result = rsa.VerifyData(dataBytes, sha1, signBytes); // } //} //else //{ // result = rsa.VerifyData(dataBytes, "SHA256", signBytes); //} var hashAlgorithmName = type == RsaType.RSA ? "SHA1" : "SHA256"; var result = rsa.VerifyData(dataBytes, hashAlgorithmName, signBytes); #endif return result; } }
/// <summary> /// 实例化RSAHelper 调用方式 RSAHelper RSA = new RSAHelper(RSAType.RSA, Encoding.UTF8); /// </summary> /// <param name="rsaType">加密算法类型 RSA SHA1;RSA2 SHA256 密钥长度至少为2048</param> /// <param name="encoding">编码类型</param> /// <param name="privateKey">私钥</param> /// <param name="publicKey">公钥</param> public RsaProvider(RsaType rsaType, Encoding encoding, string privateKey = "", string publicKey = "") { if (string.IsNullOrEmpty(privateKey)) { privateKey = defaultprivateKey; } if (string.IsNullOrEmpty(publicKey)) { publicKey = defaultpublicKey; } _encoding = encoding; if (!string.IsNullOrEmpty(privateKey)) { _privateKeyRsaProvider = CreateRsaProviderFromPrivateKey(privateKey); } if (!string.IsNullOrEmpty(publicKey)) { _publicKeyRsaProvider = CreateRsaProviderFromPublicKey(publicKey); } _hashAlgorithmName = rsaType == RsaType.RSA ? HashAlgorithmName.SHA1 : HashAlgorithmName.SHA256; }
/// <summary> /// Rsa验签 /// </summary> private static bool RsaVerify(string value, string publicKey, string sign, Encoding encoding, RsaType type) { if (string.IsNullOrWhiteSpace(value) || string.IsNullOrWhiteSpace(publicKey) || string.IsNullOrWhiteSpace(sign)) { return(false); } var rsa = new RsaHelper(type, encoding, publicKey, publicKey); return(rsa.Verify(value, sign)); }
/// <summary> /// 签名,使用私钥签名 /// </summary> /// <param name="value">待签名的值</param> /// <param name="key">密钥</param> /// <param name="encoding">编码</param> /// <param name="type">算法类型</param> /// <returns></returns> public static string Sign(string value, string key, Encoding encoding, RsaType type) { return(Sign(value, key, encoding, type, RSASignaturePadding.Pkcs1)); }
/// <summary> /// 签名,使用私钥签名 /// </summary> /// <param name="value">待签名的值</param> /// <param name="key">密钥</param> /// <param name="type">算法类型,默认Rsa</param> /// <returns></returns> public static string Sign(string value, string key, RsaType type = RsaType.Rsa) { return(Sign(value, key, Encoding.UTF8, type)); }
/// <summary> /// 验签,使用公钥验证签名 /// </summary> /// <param name="value">原始数据</param> /// <param name="sign">签名</param> /// <param name="key">密钥</param> /// <param name="encoding">编码</param> /// <param name="type">算法类型</param> /// <param name="padding">填充方式</param> /// <returns></returns> public static bool Verify(string value, string sign, string key, Encoding encoding, RsaType type, RSASignaturePadding padding) { byte[] dataBytes = encoding.GetBytes(value); byte[] signBytes = Convert.FromBase64String(sign); var provider = CreateRsaProviderFromPublicKey(key); return(provider.VerifyData(dataBytes, signBytes, GetHashAlgorithmName(type), padding)); }
/// <summary> /// 验签,使用公钥验证签名 /// </summary> /// <param name="value">原始数据</param> /// <param name="sign">签名</param> /// <param name="key">密钥</param> /// <param name="encoding">编码</param> /// <param name="type">算法类型</param> /// <returns></returns> public static bool Verify(string value, string sign, string key, Encoding encoding, RsaType type) { return(Verify(value, sign, key, encoding, type, RSASignaturePadding.Pkcs1)); }
/// <summary> /// 验签,使用公钥验证签名 /// </summary> /// <param name="value">原始数据</param> /// <param name="sign">签名</param> /// <param name="key">密钥</param> /// <param name="type"></param> /// <returns></returns> public static bool Verify(string value, string sign, string key, RsaType type = RsaType.Rsa) { return(Verify(value, sign, key, Encoding.UTF8, RsaType.Rsa)); }