using System;
namespace PaySharp.Alipay.Util.Asymmetric
{
///
/// 非对称加密算法
///
public abstract class BaseAsymmetricEncryptor : IAsymmetricEncryptor
{
///
/// 默认字符集编码。现在都推荐使用UTF-8,之前默认是GBK,保持向下兼容性
///
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 Exception(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 Exception(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 Exception(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 Exception(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();
}
}