using System;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Crypto;
using System.Text;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Signers;
using Org.BouncyCastle.Security;
namespace PaySharp.Alipay.Util.Asymmetric
{
///
/// 国密SM2算法(ECC算法)加密器
/// 签名部分采用SM3算法进行摘要计算
///
public class SM2Encryptor : BaseAsymmetricEncryptor
{
///
/// SM2算法默认用户ID,目前开放平台不会使用非默认用户ID
///
public const string DEFAULT_USER_ID = "1234567812345678";
protected override string GetAsymmetricType()
{
return "SM2";
}
protected override string DoDecrypt(string cipherTextBase64, string charset, string privateKey)
{
//加载私钥参数
ICipherParameters cipherParams = BuildPrivateKeyParams(privateKey).Parameters;
//初始化SM2算法引擎
SM2Engine sm2Engine = new SM2Engine();
sm2Engine.Init(false, cipherParams);
//对输入密文进行解密
byte[] input = Convert.FromBase64String(cipherTextBase64);
byte[] output = sm2Engine.ProcessBlock(input, 0, input.Length);
//将解密后的明文按指定字符集编码后返回
return Encoding.GetEncoding(charset).GetString(output);
}
protected override string DoEncrypt(string plainText, string charset, string publicKey)
{
//加载公钥参数
ICipherParameters cipherParams = BuildPublickKeyParams(publicKey).Parameters;
ParametersWithRandom parametersWithRandom = new ParametersWithRandom(cipherParams);
//初始化SM2算法引擎
SM2Engine sm2Engine = new SM2Engine();
sm2Engine.Init(true, parametersWithRandom);
//对输入明文进行加密
byte[] input = Encoding.GetEncoding(charset).GetBytes(plainText);
byte[] output = sm2Engine.ProcessBlock(input, 0, input.Length);
//将密文Base64编码后返回
return Convert.ToBase64String(output);
}
protected override string DoSign(string content, string charset, string privateKey)
{
//加载私钥参数
ParametersWithID parametersWithID = BuildPrivateKeyParams(privateKey);
//加载签名器
SM2Signer signer = new SM2Signer();
signer.Init(true, parametersWithID);
//向签名器中输入原文
byte[] input = Encoding.GetEncoding(charset).GetBytes(content);
signer.BlockUpdate(input, 0, input.Length);
//将签名结果转换为Base64
return Convert.ToBase64String(signer.GenerateSignature());
}
protected override bool DoVerify(string content, string charset, string publicKey, string sign)
{
//加载公钥参数
ParametersWithID parametersWithID = BuildPublickKeyParams(publicKey);
//加载签名器
SM2Signer signer = new SM2Signer();
signer.Init(false, parametersWithID);
//向签名器中输入原文
byte[] input = Encoding.GetEncoding(charset).GetBytes(content);
signer.BlockUpdate(input, 0, input.Length);
//传入指定签名串进行验签并返回结果
return signer.VerifySignature(Convert.FromBase64String(sign));
}
private ParametersWithID BuildPrivateKeyParams(string privateKey)
{
AsymmetricKeyParameter key = PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey));
ParametersWithID parametersWithID = new ParametersWithID(key, Encoding.UTF8.GetBytes(DEFAULT_USER_ID));
return parametersWithID;
}
private static ParametersWithID BuildPublickKeyParams(string publicKey)
{
AsymmetricKeyParameter key = PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));
ParametersWithID parametersWithID = new ParametersWithID(key, Encoding.UTF8.GetBytes(DEFAULT_USER_ID));
return parametersWithID;
}
}
}