/// <summary> /// 解密 /// </summary> /// <param name="privateKey"></param> /// <param name="encryptedData"></param> /// <returns></returns> public static byte[] Decrypt(byte[] privateKey, byte[] encryptedData) { if (null == privateKey || privateKey.Length == 0) { return(null); } if (encryptedData == null || encryptedData.Length == 0) { return(null); } string data = Encoding.ASCII.GetString(Hex.Encode(encryptedData)); byte[] c1Bytes = Hex.Decode(Encoding.ASCII.GetBytes(data.Substring(0, 130))); int c2Len = encryptedData.Length - 97; byte[] c2 = Hex.Decode(Encoding.ASCII.GetBytes(data.Substring(130, 2 * c2Len))); byte[] c3 = Hex.Decode(Encoding.ASCII.GetBytes(data.Substring(130 + 2 * c2Len, 64))); SM2 sm2 = SM2.Instance; BigInteger userD = new BigInteger(1, privateKey); ECPoint c1 = sm2.ecc_curve.DecodePoint(c1Bytes); Cipher cipher = new Cipher(); cipher.Init_dec(userD, c1); cipher.Decrypt(c2); cipher.Dofinal(c3); return(c2); }
/// <summary> /// 加密 /// </summary> /// <param name="publicKey"></param> /// <param name="data"></param> /// <returns></returns> public static string Encrypt(byte[] publicKey, byte[] data) { if (null == publicKey || publicKey.Length == 0) { return(null); } if (data == null || data.Length == 0) { return(null); } byte[] source = new byte[data.Length]; Array.Copy(data, 0, source, 0, data.Length); Cipher cipher = new Cipher(); SM2 sm2 = SM2.Instance; ECPoint userKey = sm2.ecc_curve.DecodePoint(publicKey); ECPoint c1 = cipher.Init_enc(sm2, userKey); cipher.Encrypt(source); byte[] c3 = new byte[32]; cipher.Dofinal(c3); string sc1 = Encoding.ASCII.GetString(Hex.Encode(c1.GetEncoded())); string sc2 = Encoding.ASCII.GetString(Hex.Encode(source)); string sc3 = Encoding.ASCII.GetString(Hex.Encode(c3)); return((sc1 + sc2 + sc3).ToUpper()); }
public ECPoint Init_enc(SM2 sm2, ECPoint userKey) { AsymmetricCipherKeyPair key = sm2.ecc_key_pair_generator.GenerateKeyPair(); ECPrivateKeyParameters ecpriv = (ECPrivateKeyParameters)key.Private; ECPublicKeyParameters ecpub = (ECPublicKeyParameters)key.Public; BigInteger k = ecpriv.D; ECPoint c1 = ecpub.Q; this.p2 = userKey.Multiply(k); Reset(); return(c1); }