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; } }