public class Sm2: IDecryption
{
private readonly string _privateKey;
private readonly Encoding _encoding;
private readonly string _publickey;
public Sm2(string privateKey,string publickey,Encoding encoding)
{
_privateKey = privateKey;
_publickey = publickey;
_encoding = encoding;
}
public static AlgKeyPair CreateKeyPair(Encoding encoding)
{
var keyPair = SM2.Instance.ecc_key_pair_generator.GenerateKeyPair();
var privateKeyParameters = (ECPrivateKeyParameters)keyPair.Private;
var publicKeyParameters = (ECPublicKeyParameters)keyPair.Public;
var d = privateKeyParameters.D;
return new AlgKeyPair(encoding.GetString(Hex.Encode(publicKeyParameters.Q.GetEncoded())).ToUpper(),
encoding.GetString(Hex.Encode(d.ToByteArray())).ToUpper());
}
/// <summary>
/// 解密
/// </summary>
/// <param name="ciphertext"></param>
/// <returns></returns>
public string Decrypt(string ciphertext)
{
return _encoding.GetString(SM2Utils.Decrypt(Hex.Decode(_privateKey),
(Hex.Decode(ciphertext))));
}
/// <summary>
/// 加密
/// </summary>
/// <param name="ciphertext"></param>
/// <returns></returns>
public string Encrypt(string ciphertext)
{
return (SM2Utils.Encrypt(Hex.Decode(_publickey),
(_encoding.GetBytes(ciphertext))));
}
private byte[] ChangeC1C3C2ToC1C2C3(byte[] data)
{
const int c1Len = 65;
const int c3Len = 32;
var result = new byte[data.Length];
Array.Copy(data, 0, result, 0, c1Len);
Array.Copy(data, c1Len + c3Len, result, c1Len, data.Length - c1Len - c3Len);
Array.Copy(data, c1Len, result, data.Length - c3Len, c3Len);
return result;
}
}