NewGaoKaoApi/PaymentSDK/AliPay/Util/Asymmetric/BaseAsymmetricEncryptor.cs

114 lines
4.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
namespace Aop.Api.Util.Asymmetric
{
/// <summary>
/// 非对称加密算法
/// </summary>
public abstract class BaseAsymmetricEncryptor : IAsymmetricEncryptor
{
/// <summary>
/// 默认字符集编码。现在都推荐使用UTF-8之前默认是GBK保持向下兼容性
/// </summary>
private static readonly string DEFAULT_CHARSET = "GBK";
public string Decrypt(string cipherTextBase64, string charset, string privateKey)
{
try
{
ArgumentValidator.CheckNotNull(cipherTextBase64, "密文不可为Null");
ArgumentValidator.CheckArgument(!String.IsNullOrEmpty(privateKey), "私钥不可为空");
if (String.IsNullOrEmpty(charset))
{
charset = DEFAULT_CHARSET;
}
return DoDecrypt(cipherTextBase64, charset, privateKey);
}
catch (Exception ex)
{
String errorMessage = GetAsymmetricType() + "非对称解密遭遇异常,请检查私钥格式是否正确。" + ex.Message +
" cipherTextBase64=" + cipherTextBase64 + "charset=" + charset + "privateKeySize=" + privateKey.Length;
Console.WriteLine(errorMessage);
throw new AopException(errorMessage, ex);
}
}
public string Encrypt(string plainText, string charset, string publicKey)
{
try
{
ArgumentValidator.CheckNotNull(plainText, "密文不可为Null");
ArgumentValidator.CheckArgument(!String.IsNullOrEmpty(publicKey), "公钥不可为空");
if (String.IsNullOrEmpty(charset))
{
charset = DEFAULT_CHARSET;
}
return DoEncrypt(plainText, charset, publicKey);
}
catch (Exception ex)
{
String errorMessage = GetAsymmetricType() + "非对称解密遭遇异常,请检查公钥格式是否正确。" + ex.Message +
" plainText=" + plainText + "charset=" + charset + "publicKey=" + publicKey;
Console.WriteLine(errorMessage);
throw new AopException(errorMessage, ex);
}
}
public string Sign(string content, string charset, string privateKey)
{
try
{
ArgumentValidator.CheckNotNull(content, "待签名内容不可为Null");
ArgumentValidator.CheckArgument(!String.IsNullOrEmpty(privateKey), "私钥不可为空");
if (String.IsNullOrEmpty(charset))
{
charset = DEFAULT_CHARSET;
}
return DoSign(content, charset, privateKey);
}
catch (Exception ex)
{
String errorMessage = GetAsymmetricType() + "签名遭遇异常,请检查私钥格式是否正确。" + ex.Message +
" content=" + content + "charset=" + charset + "privateKeySize=" + privateKey.Length;
Console.WriteLine(errorMessage);
throw new AopException(errorMessage, ex);
}
}
public bool Verify(string content, string charset, string publicKey, string sign)
{
try
{
ArgumentValidator.CheckNotNull(content, "待验签内容不可为Null");
ArgumentValidator.CheckArgument(!String.IsNullOrEmpty(publicKey), "公钥不可为空");
ArgumentValidator.CheckArgument(!String.IsNullOrEmpty(sign), "签名串不可为空");
if (String.IsNullOrEmpty(charset))
{
charset = DEFAULT_CHARSET;
}
return DoVerify(content, charset, publicKey, sign);
}
catch (Exception ex)
{
String errorMessage = GetAsymmetricType() + "验签遭遇异常,请检查公钥格式是否正确。" + ex.Message +
" content=" + content + "charset=" + charset + "publicKey=" + publicKey + "sign=" + sign;
Console.WriteLine(errorMessage);
throw new AopException(errorMessage, ex);
}
}
protected abstract string DoDecrypt(string cipherTextBase64, string charset, string privateKey);
protected abstract string DoEncrypt(string plainText, string charset, string publicKey);
protected abstract string DoSign(string content, string charset, string privateKey);
protected abstract bool DoVerify(string content, string charset, string publicKey, string sign);
protected abstract string GetAsymmetricType();
}
}