瀏覽代碼

feat:优化移动支付加密算法

zhengjie 1 年之前
父節點
當前提交
10b3b5fbe8
共有 11 個文件被更改,包括 822 次插入1015 次删除
  1. 9 12
      Business/MobilePay.cs
  2. 570 0
      Common/GmUtil.cs
  3. 0 899
      Common/SMCipher.cs
  4. 132 0
      Common/SignUtils.cs
  5. 63 0
      Common/StringUtils.cs
  6. 11 5
      HeFeiMI.csproj
  7. 29 75
      Helper/EncryptHelper.cs
  8. 6 20
      Helper/JsonHelper.cs
  9. 1 1
      Properties/Resources.Designer.cs
  10. 1 1
      Properties/Settings.Designer.cs
  11. 0 2
      packages.config

+ 9 - 12
Business/MobilePay.cs

@@ -53,7 +53,6 @@ namespace PTMedicalInsurance.Business
             try
             {
 
-                //EncryptHelper eh = new EncryptHelper();
                 if (GetPatientInfo(out errMsg) != 0)
                 {
                     outPar = errMsg;
@@ -67,12 +66,12 @@ namespace PTMedicalInsurance.Business
                     return -1;
                 }
                 setPatientInsuInfo(jo1194Rtn);
+
                 if (Get6201Inpar(out errMsg) != 0)
                 {
                     outPar = errMsg;
                     return -1;
                 }
-                Global.writeLog(errMsg);
                 M6201Inpar = errMsg;
                 JObject joM6201Rtn = invoker.invokeMPService("6201", errMsg);
                 if (JsonHelper.parseMPRtnValue(joM6201Rtn, out errMsg) != 0)
@@ -81,7 +80,6 @@ namespace PTMedicalInsurance.Business
                     return -1;
                 }
                 JObject joEncData = JObject.Parse(errMsg);
-                Global.writeLog(JsonHelper.Compress(joEncData));
                 //设置
                 setPatientBy6201Rtn(joEncData);
                 //存入MI 患者表,登记表,费用表
@@ -489,11 +487,11 @@ namespace PTMedicalInsurance.Business
                     JObject joTmp = new JObject();
                     joTmp.Add("act_purc_pric", jaFeedetailList[i]["pric"]);
                     joTmp.Add("sin_dos", jaFeedetailList[i]["sinDosDscr"]);
-                    joTmp.Add("medins_list_name", jaFeedetailList[i]["medListName"]);
-                    ((JObject)jaFeedetailList[i]).Property("chrgBchno").Remove();
-                    ((JObject)jaFeedetailList[i]).Property("diseCodg").Remove();
+                    //joTmp.Add("medins_list_name", jaFeedetailList[i]["medListName"]);
+                    //((JObject)jaFeedetailList[i]).Property("chrgBchno").Remove();
+                    //((JObject)jaFeedetailList[i]).Property("diseCodg").Remove();
                     ((JObject)jaFeedetailList[i]).Property("rxno").Remove();
-                    ((JObject)jaFeedetailList[i]).Property("feeOcurTime").Remove();
+                    //((JObject)jaFeedetailList[i]).Property("feeOcurTime").Remove();
                     ((JObject)jaFeedetailList[i]).Property("sinDosDscr").Remove();
                     ((JObject)jaFeedetailList[i]).Property("usedFrquDscr").Remove();
                     ((JObject)jaFeedetailList[i]).Property("prdDays").Remove();
@@ -512,13 +510,12 @@ namespace PTMedicalInsurance.Business
                     ((JObject)jaFeedetailList[i]).Property("medType").Remove();
                     ((JObject)jaFeedetailList[i]).Property("memo").Remove();
                     //((JObject)jaFeedetailList[i]).Property("expContent").Remove();
-                    ((JObject)jaFeedetailList[i]).Property("medListName").Remove();
-                    ((JObject)jaFeedetailList[i]).Property("medListSpc").Remove();
+                    //((JObject)jaFeedetailList[i]).Property("medListName").Remove();
+                    //((JObject)jaFeedetailList[i]).Property("medListSpc").Remove();
                     ((JObject)jaFeedetailList[i]).Property("combNo").Remove();
                     //jaFeedetailList[i]["chrgBchno"] = MPat.adm_Dr.ToString();
                     jaFeedetailList[i]["expContent"] = joTmp.ToString();
                     jaFeedetailList[i]["medType"] = JsonHelper.getDestValue(joInsuAdmObj, "medType");
-                    jaFeedetailList[i]["psnNo"] = new JObject();
                     jaFeedetailList[i]["psnNo"] = MPat.psn_no;
                 }
                 //入参
@@ -527,8 +524,8 @@ namespace PTMedicalInsurance.Business
                 joInpar.Add("psnNo", MPat.psn_no);//人员编号
                 joInpar.Add("insutype", MPat.insuType);//险种类型
                 joInpar.Add("medOrgOrd", MPat.recordID);//医疗机构订单号  前端传入
-                //joInpar.Add("initRxOrd", JsonHelper.getDestValue(joInsuAdmObj, "initRxOrd"));//要续方的原处方流水 前端传入
-                //joInpar.Add("rxCircFlag", JsonHelper.getDestValue(joInsuAdmObj, "rxCircFlag"));//电子处方流转标志 前端传入
+                joInpar.Add("initRxOrd", JsonHelper.getDestValue(joInsuAdmObj, "initRxOrd"));//要续方的原处方流水 前端传入
+                joInpar.Add("rxCircFlag", JsonHelper.getDestValue(joInsuAdmObj, "rxCircFlag"));//电子处方流转标志 前端传入
                 MSettl.settlTime = Convert.ToDateTime(JsonHelper.getDestValue(joMdtrtinfo, "begntime"));
                 joInpar.Add("begntime", JsonHelper.getDestValue(joMdtrtinfo, "begntime"));//开始时间
                 joInpar.Add("idNo", JsonHelper.getDestValue(joPatBaseInfo, "credNo"));//证件号码

+ 570 - 0
Common/GmUtil.cs

@@ -0,0 +1,570 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using Org.BouncyCastle.Asn1;
+using Org.BouncyCastle.Asn1.GM;
+using Org.BouncyCastle.Asn1.X9;
+using Org.BouncyCastle.Crypto;
+using Org.BouncyCastle.Crypto.Digests;
+using Org.BouncyCastle.Crypto.Engines;
+using Org.BouncyCastle.Crypto.Generators;
+using Org.BouncyCastle.Crypto.Parameters;
+using Org.BouncyCastle.Math;
+using Org.BouncyCastle.Math.EC;
+using Org.BouncyCastle.Security;
+using Org.BouncyCastle.Utilities;
+using Org.BouncyCastle.Utilities.Encoders;
+using Org.BouncyCastle.X509;
+
+namespace AnHuiMI.Common
+{
+	public class GmUtil
+	{
+		// Token: 0x06000006 RID: 6 RVA: 0x0000217E File Offset: 0x0000037E
+		public static byte[] SignSm3WithSm2(byte[] msg, byte[] userId, AsymmetricKeyParameter privateKey)
+		{
+			return GmUtil.RsAsn1ToPlainByteArray(GmUtil.SignSm3WithSm2Asn1Rs(msg, userId, privateKey));
+		}
+
+		// Token: 0x06000007 RID: 7 RVA: 0x00002190 File Offset: 0x00000390
+		public static byte[] SignSm3WithSm2Asn1Rs(byte[] msg, byte[] userId, AsymmetricKeyParameter privateKey)
+		{
+			byte[] result;
+			try
+			{
+				ISigner signer = SignerUtilities.GetSigner("SM3withSM2");
+				signer.Init(true, new ParametersWithRandom(privateKey));
+				signer.BlockUpdate(msg, 0, msg.Length);
+				result = signer.GenerateSignature();
+			}
+			catch (Exception)
+			{
+				result = null;
+			}
+			return result;
+		}
+
+		// Token: 0x06000008 RID: 8 RVA: 0x000021E0 File Offset: 0x000003E0
+		public static bool VerifySm3WithSm2(byte[] msg, byte[] userId, byte[] rs, AsymmetricKeyParameter publicKey)
+		{
+			return rs != null && msg != null && userId != null && rs.Length == 64 && GmUtil.VerifySm3WithSm2Asn1Rs(msg, userId, GmUtil.RsPlainByteArrayToAsn1(rs), publicKey);
+		}
+
+		// Token: 0x06000009 RID: 9 RVA: 0x00002204 File Offset: 0x00000404
+		public static bool VerifySm3WithSm2Asn1Rs(byte[] msg, byte[] userId, byte[] sign, AsymmetricKeyParameter publicKey)
+		{
+			bool result;
+			try
+			{
+				ISigner signer = SignerUtilities.GetSigner("SM3withSM2");
+				signer.Init(false, publicKey);
+				signer.BlockUpdate(msg, 0, msg.Length);
+				result = signer.VerifySignature(sign);
+			}
+			catch (Exception)
+			{
+				result = false;
+			}
+			return result;
+		}
+
+		// Token: 0x0600000A RID: 10 RVA: 0x00002250 File Offset: 0x00000450
+		private static byte[] ChangeC1C2C3ToC1C3C2(byte[] c1c2c3)
+		{
+			int num = (GmUtil.x9ECParameters.Curve.FieldSize + 7) / 8 * 2 + 1;
+			byte[] array = new byte[c1c2c3.Length];
+			Buffer.BlockCopy(c1c2c3, 0, array, 0, num);
+			Buffer.BlockCopy(c1c2c3, c1c2c3.Length - 32, array, num, 32);
+			Buffer.BlockCopy(c1c2c3, num, array, num + 32, c1c2c3.Length - num - 32);
+			return array;
+		}
+
+		// Token: 0x0600000B RID: 11 RVA: 0x000022B0 File Offset: 0x000004B0
+		private static byte[] ChangeC1C3C2ToC1C2C3(byte[] c1c3c2)
+		{
+			int num = (GmUtil.x9ECParameters.Curve.FieldSize + 7) / 8 * 2 + 1;
+			byte[] array = new byte[c1c3c2.Length];
+			Buffer.BlockCopy(c1c3c2, 0, array, 0, num);
+			Buffer.BlockCopy(c1c3c2, num + 32, array, num, c1c3c2.Length - num - 32);
+			Buffer.BlockCopy(c1c3c2, num, array, c1c3c2.Length - 32, 32);
+			return array;
+		}
+
+		// Token: 0x0600000C RID: 12 RVA: 0x0000230D File Offset: 0x0000050D
+		public static byte[] Sm2Decrypt(byte[] data, AsymmetricKeyParameter key)
+		{
+			return GmUtil.Sm2DecryptOld(GmUtil.ChangeC1C3C2ToC1C2C3(data), key);
+		}
+
+		// Token: 0x0600000D RID: 13 RVA: 0x0000231B File Offset: 0x0000051B
+		public static byte[] Sm2Encrypt(byte[] data, AsymmetricKeyParameter key)
+		{
+			return GmUtil.ChangeC1C2C3ToC1C3C2(GmUtil.Sm2EncryptOld(data, key));
+		}
+
+		// Token: 0x0600000E RID: 14 RVA: 0x0000232C File Offset: 0x0000052C
+		public static byte[] Sm2EncryptOld(byte[] data, AsymmetricKeyParameter pubkey)
+		{
+			byte[] result;
+			try
+			{
+				SM2Engine sm2Engine = new SM2Engine();
+				sm2Engine.Init(true, new ParametersWithRandom(pubkey, new SecureRandom()));
+				result = sm2Engine.ProcessBlock(data, 0, data.Length);
+			}
+			catch (Exception)
+			{
+				result = null;
+			}
+			return result;
+		}
+
+		// Token: 0x0600000F RID: 15 RVA: 0x00002374 File Offset: 0x00000574
+		public static byte[] Sm2DecryptOld(byte[] data, AsymmetricKeyParameter key)
+		{
+			byte[] result;
+			try
+			{
+				SM2Engine sm2Engine = new SM2Engine();
+				sm2Engine.Init(false, key);
+				result = sm2Engine.ProcessBlock(data, 0, data.Length);
+			}
+			catch (Exception)
+			{
+				result = null;
+			}
+			return result;
+		}
+
+		// Token: 0x06000010 RID: 16 RVA: 0x000023B4 File Offset: 0x000005B4
+		public static byte[] Sm3(byte[] bytes)
+		{
+			byte[] result;
+			try
+			{
+				SM3Digest sm3Digest = new SM3Digest();
+				sm3Digest.BlockUpdate(bytes, 0, bytes.Length);
+				result = DigestUtilities.DoFinal(sm3Digest);
+			}
+			catch (Exception)
+			{
+				result = null;
+			}
+			return result;
+		}
+
+		// Token: 0x06000011 RID: 17 RVA: 0x000023F0 File Offset: 0x000005F0
+		private static byte[] BigIntToFixexLengthBytes(BigInteger rOrS)
+		{
+			byte[] array = rOrS.ToByteArray();
+			if (array.Length == 32)
+			{
+				return array;
+			}
+			if (array.Length == 33 && array[0] == 0)
+			{
+				return Arrays.CopyOfRange(array, 1, 33);
+			}
+			if (array.Length < 32)
+			{
+				byte[] array2 = new byte[32];
+				Arrays.Fill(array2, 0);
+				Buffer.BlockCopy(array, 0, array2, 32 - array.Length, array.Length);
+				return array2;
+			}
+			throw new ArgumentException("err rs: " + Hex.ToHexString(array));
+		}
+
+		// Token: 0x06000012 RID: 18 RVA: 0x00002464 File Offset: 0x00000664
+		private static byte[] RsAsn1ToPlainByteArray(byte[] rsDer)
+		{
+			Asn1Sequence instance = Asn1Sequence.GetInstance(rsDer);
+			byte[] array = GmUtil.BigIntToFixexLengthBytes(DerInteger.GetInstance(instance[0]).Value);
+			byte[] array2 = GmUtil.BigIntToFixexLengthBytes(DerInteger.GetInstance(instance[1]).Value);
+			byte[] array3 = new byte[64];
+			Buffer.BlockCopy(array, 0, array3, 0, array.Length);
+			Buffer.BlockCopy(array2, 0, array3, 32, array2.Length);
+			return array3;
+		}
+
+		// Token: 0x06000013 RID: 19 RVA: 0x000024C8 File Offset: 0x000006C8
+		private static byte[] RsPlainByteArrayToAsn1(byte[] sign)
+		{
+			if (sign.Length != 64)
+			{
+				throw new ArgumentException("err rs. ");
+			}
+			BigInteger value = new BigInteger(1, Arrays.CopyOfRange(sign, 0, 32));
+			BigInteger value2 = new BigInteger(1, Arrays.CopyOfRange(sign, 32, 64));
+			Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector();
+			asn1EncodableVector.Add(new DerInteger(value));
+			asn1EncodableVector.Add(new DerInteger(value2));
+			byte[] result;
+			try
+			{
+				result = new DerSequence(asn1EncodableVector).GetEncoded("DER");
+			}
+			catch (IOException)
+			{
+				result = null;
+			}
+			return result;
+		}
+
+		// Token: 0x06000014 RID: 20 RVA: 0x00002550 File Offset: 0x00000750
+		public static AsymmetricCipherKeyPair GenerateKeyPair()
+		{
+			AsymmetricCipherKeyPair result;
+			try
+			{
+				ECKeyPairGenerator eckeyPairGenerator = new ECKeyPairGenerator();
+				eckeyPairGenerator.Init(new ECKeyGenerationParameters(GmUtil.ecDomainParameters, new SecureRandom()));
+				result = eckeyPairGenerator.GenerateKeyPair();
+			}
+			catch (Exception)
+			{
+				result = null;
+			}
+			return result;
+		}
+
+		// Token: 0x06000015 RID: 21 RVA: 0x00002598 File Offset: 0x00000798
+		public static ECPrivateKeyParameters GetPrivatekeyFromD(BigInteger d)
+		{
+			return new ECPrivateKeyParameters(d, GmUtil.ecDomainParameters);
+		}
+
+		// Token: 0x06000016 RID: 22 RVA: 0x000025A8 File Offset: 0x000007A8
+		public static ECPublicKeyParameters GetPublickeyFromXY(byte[] pubkey)
+		{
+			ECPoint q = GMNamedCurves.GetByName("SM2P256V1").Curve.DecodePoint(pubkey);
+			ECDomainParameters parameters = new ECDomainParameters(GmUtil.x9ECParameters.Curve, GmUtil.x9ECParameters.G, GmUtil.x9ECParameters.N);
+			return new ECPublicKeyParameters(q, parameters);
+		}
+
+		// Token: 0x06000017 RID: 23 RVA: 0x000025F4 File Offset: 0x000007F4
+		public static ECPublicKeyParameters GetPublickeyFromXY(BigInteger x, BigInteger y)
+		{
+			return new ECPublicKeyParameters(GmUtil.x9ECParameters.Curve.CreatePoint(x, y), GmUtil.ecDomainParameters);
+		}
+
+		// Token: 0x06000018 RID: 24 RVA: 0x00002614 File Offset: 0x00000814
+		public static AsymmetricKeyParameter GetPublickeyFromX509File(FileInfo file)
+		{
+			FileStream fileStream = null;
+			try
+			{
+				fileStream = new FileStream(file.FullName, FileMode.Open, FileAccess.Read);
+				return new X509CertificateParser().ReadCertificate(fileStream).GetPublicKey();
+			}
+			catch (Exception)
+			{
+			}
+			finally
+			{
+				if (fileStream != null)
+				{
+					fileStream.Close();
+				}
+			}
+			return null;
+		}
+
+		// Token: 0x06000019 RID: 25 RVA: 0x00002670 File Offset: 0x00000870
+		private static byte[] ToByteArray(int i)
+		{
+			return new byte[]
+			{
+				(byte)(i >> 24),
+				(byte)((i & 16777215) >> 16),
+				(byte)((i & 65535) >> 8),
+				(byte)(i & 255)
+			};
+		}
+
+		// Token: 0x0600001A RID: 26 RVA: 0x000026A8 File Offset: 0x000008A8
+		private static byte[] Join(params byte[][] byteArrays)
+		{
+			List<byte> list = new List<byte>();
+			for (int i = 0; i < byteArrays.Length; i++)
+			{
+				list.AddRange(byteArrays[i]);
+			}
+			return list.ToArray();
+		}
+
+		// Token: 0x0600001B RID: 27 RVA: 0x000026D8 File Offset: 0x000008D8
+		private static byte[] KDF(byte[] Z, int klen)
+		{
+			int num = 1;
+			int num2 = (int)Math.Ceiling((double)klen * 1.0 / 32.0);
+			List<byte> list = new List<byte>();
+			try
+			{
+				for (int i = 1; i < num2; i++)
+				{
+					list.AddRange(GmUtil.Sm3(GmUtil.Join(new byte[][]
+					{
+						Z,
+						GmUtil.ToByteArray(num)
+					})));
+					num++;
+				}
+				byte[] array = GmUtil.Sm3(GmUtil.Join(new byte[][]
+				{
+					Z,
+					GmUtil.ToByteArray(num)
+				}));
+				if (klen % 32 == 0)
+				{
+					list.AddRange(array);
+				}
+				else
+				{
+					list.AddRange(Arrays.CopyOfRange(array, 0, klen % 32));
+				}
+				return list.ToArray();
+			}
+			catch (Exception)
+			{
+			}
+			return null;
+		}
+
+		// Token: 0x0600001C RID: 28 RVA: 0x000027A0 File Offset: 0x000009A0
+		public static byte[] Sm4DecryptCBC(byte[] keyBytes, byte[] cipher, byte[] iv, string algo)
+		{
+			if (keyBytes.Length != 16)
+			{
+				throw new ArgumentException("err key length");
+			}
+			if (cipher.Length % 16 != 0)
+			{
+				throw new ArgumentException("err data length");
+			}
+			byte[] result;
+			try
+			{
+				KeyParameter parameters = ParameterUtilities.CreateKeyParameter("SM4", keyBytes);
+				IBufferedCipher cipher2 = CipherUtilities.GetCipher(algo);
+				if (iv == null)
+				{
+					iv = GmUtil.ZeroIv(algo);
+				}
+				cipher2.Init(false, new ParametersWithIV(parameters, iv));
+				result = cipher2.DoFinal(cipher);
+			}
+			catch (Exception)
+			{
+				result = null;
+			}
+			return result;
+		}
+
+		// Token: 0x0600001D RID: 29 RVA: 0x00002820 File Offset: 0x00000A20
+		public static byte[] Sm4EncryptCBC(byte[] keyBytes, byte[] plain, byte[] iv, string algo)
+		{
+			if (keyBytes.Length != 16)
+			{
+				throw new ArgumentException("err key length");
+			}
+			if (plain.Length % 16 != 0)
+			{
+				throw new ArgumentException("err data length");
+			}
+			byte[] result;
+			try
+			{
+				KeyParameter parameters = ParameterUtilities.CreateKeyParameter("SM4", keyBytes);
+				IBufferedCipher cipher = CipherUtilities.GetCipher(algo);
+				if (iv == null)
+				{
+					iv = GmUtil.ZeroIv(algo);
+				}
+				cipher.Init(true, new ParametersWithIV(parameters, iv));
+				result = cipher.DoFinal(plain);
+			}
+			catch (Exception)
+			{
+				result = null;
+			}
+			return result;
+		}
+
+		// Token: 0x0600001E RID: 30 RVA: 0x000028A0 File Offset: 0x00000AA0
+		public static byte[] Sm4EncryptECB(byte[] keyBytes, byte[] plain, string algo)
+		{
+			if (keyBytes.Length != 16)
+			{
+				throw new ArgumentException("err key length");
+			}
+			byte[] result;
+			try
+			{
+				KeyParameter parameters = ParameterUtilities.CreateKeyParameter("SM4", keyBytes);
+				IBufferedCipher cipher = CipherUtilities.GetCipher(algo);
+				cipher.Init(true, parameters);
+				result = cipher.DoFinal(plain);
+			}
+			catch (Exception)
+			{
+				result = null;
+			}
+			return result;
+		}
+
+		// Token: 0x0600001F RID: 31 RVA: 0x000028FC File Offset: 0x00000AFC
+		public static byte[] Sm4DecryptECB(byte[] keyBytes, byte[] cipher, string algo)
+		{
+			if (cipher.Length % 16 != 0)
+			{
+				throw new ArgumentException("err data length");
+			}
+			byte[] result;
+			try
+			{
+				KeyParameter parameters = ParameterUtilities.CreateKeyParameter("SM4", keyBytes);
+				IBufferedCipher cipher2 = CipherUtilities.GetCipher(algo);
+				cipher2.Init(false, parameters);
+				result = cipher2.DoFinal(cipher);
+			}
+			catch (Exception)
+			{
+				result = null;
+			}
+			return result;
+		}
+
+		// Token: 0x06000020 RID: 32 RVA: 0x00002958 File Offset: 0x00000B58
+		public static GmUtil.Sm2Cert readSm2File(byte[] pem, string pwd)
+		{
+			GmUtil.Sm2Cert sm2Cert = new GmUtil.Sm2Cert();
+			GmUtil.Sm2Cert result;
+			try
+			{
+				Asn1Sequence asn1Sequence = (Asn1Sequence)Asn1Object.FromByteArray(pem);
+				Asn1Sequence asn1Sequence2 = (Asn1Sequence)asn1Sequence[1];
+				Asn1Sequence asn1Sequence3 = (Asn1Sequence)asn1Sequence[2];
+				Asn1OctetString asn1OctetString = (Asn1OctetString)asn1Sequence2[2];
+				byte[] data = GmUtil.KDF(Encoding.UTF8.GetBytes(pwd), 32);
+				byte[] bytes = GmUtil.Sm4DecryptCBC(Arrays.CopyOfRange(data, 16, 32), asn1OctetString.GetOctets(), Arrays.CopyOfRange(data, 0, 16), "SM4/CBC/PKCS7Padding");
+				sm2Cert.privateKey = GmUtil.GetPrivatekeyFromD(new BigInteger(1, bytes));
+				Asn1OctetString asn1OctetString2 = (Asn1OctetString)asn1Sequence3[1];
+				X509Certificate x509Certificate = new X509CertificateParser().ReadCertificate(asn1OctetString2.GetOctets());
+				sm2Cert.publicKey = x509Certificate.GetPublicKey();
+				sm2Cert.certId = x509Certificate.SerialNumber.ToString(10);
+				result = sm2Cert;
+			}
+			catch (Exception)
+			{
+				result = null;
+			}
+			return result;
+		}
+
+		// Token: 0x06000021 RID: 33 RVA: 0x00002A4C File Offset: 0x00000C4C
+		public static GmUtil.Sm2Cert ReadSm2X509Cert(byte[] cert)
+		{
+			GmUtil.Sm2Cert sm2Cert = new GmUtil.Sm2Cert();
+			GmUtil.Sm2Cert result;
+			try
+			{
+				X509Certificate x509Certificate = new X509CertificateParser().ReadCertificate(cert);
+				sm2Cert.publicKey = x509Certificate.GetPublicKey();
+				sm2Cert.certId = x509Certificate.SerialNumber.ToString(10);
+				result = sm2Cert;
+			}
+			catch (Exception)
+			{
+				result = null;
+			}
+			return result;
+		}
+
+		// Token: 0x06000022 RID: 34 RVA: 0x00002AA4 File Offset: 0x00000CA4
+		public static byte[] ZeroIv(string algo)
+		{
+			byte[] result;
+			try
+			{
+				byte[] array = new byte[CipherUtilities.GetCipher(algo).GetBlockSize()];
+				Arrays.Fill(array, 0);
+				result = array;
+			}
+			catch (Exception)
+			{
+				result = null;
+			}
+			return result;
+		}
+
+		// Token: 0x06000023 RID: 35 RVA: 0x00002AE4 File Offset: 0x00000CE4
+		public static void Main2(string[] s)
+		{
+			foreach (object obj in GMNamedCurves.Names)
+			{
+				string text = (string)obj;
+			}
+			AsymmetricCipherKeyPair asymmetricCipherKeyPair = GmUtil.GenerateKeyPair();
+			byte[] bytes = Encoding.UTF8.GetBytes("message digest");
+			byte[] bytes2 = Encoding.UTF8.GetBytes("userId");
+			GmUtil.SignSm3WithSm2(bytes, bytes2, asymmetricCipherKeyPair.Private);
+			GmUtil.GetPrivatekeyFromD(new BigInteger("097b5230ef27c7df0fa768289d13ad4e8a96266f0fcb8de40d5942af4293a54a", 16));
+			GmUtil.GetPublickeyFromX509File(new FileInfo("d:/certs/69629141652.cer"));
+			GmUtil.GetPublickeyFromXY(new BigInteger("59cf9940ea0809a97b1cbffbb3e9d96d0fe842c1335418280bfc51dd4e08a5d4", 16), new BigInteger("9a7f77c578644050e09a9adc4245d1e6eba97554bc8ffd4fe15a78f37f891ff8", 16));
+			AsymmetricCipherKeyPair asymmetricCipherKeyPair2 = GmUtil.GenerateKeyPair();
+			AsymmetricKeyParameter @public = asymmetricCipherKeyPair2.Public;
+			AsymmetricKeyParameter @private = asymmetricCipherKeyPair2.Private;
+			byte[] array = GmUtil.Sm2Encrypt(Encoding.UTF8.GetBytes("s"), @public);
+			array = GmUtil.Sm2Decrypt(array, @private);
+			byte[] plain = Hex.Decode("0123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba9876543210");
+			byte[] keyBytes = Hex.Decode("0123456789abcdeffedcba9876543210");
+			Hex.Decode("595298c7c6fd271f0402f804c33d3f66");
+			array = GmUtil.Sm4EncryptECB(keyBytes, plain, "SM4/ECB/NoPadding");
+			array = GmUtil.Sm4DecryptECB(keyBytes, array, "SM4/ECB/NoPadding");
+			array = Convert.FromBase64String("MIIDHQIBATBHBgoqgRzPVQYBBAIBBgcqgRzPVQFoBDDW5/I9kZhObxXE9Vh1CzHdZhIhxn+3byBU\nUrzmGRKbDRMgI3hJKdvpqWkM5G4LNcIwggLNBgoqgRzPVQYBBAIBBIICvTCCArkwggJdoAMCAQIC\nBRA2QSlgMAwGCCqBHM9VAYN1BQAwXDELMAkGA1UEBhMCQ04xMDAuBgNVBAoMJ0NoaW5hIEZpbmFu\nY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEbMBkGA1UEAwwSQ0ZDQSBURVNUIFNNMiBPQ0Ex\nMB4XDTE4MTEyNjEwMTQxNVoXDTIwMTEyNjEwMTQxNVowcjELMAkGA1UEBhMCY24xEjAQBgNVBAoM\nCUNGQ0EgT0NBMTEOMAwGA1UECwwFQ1VQUkExFDASBgNVBAsMC0VudGVycHJpc2VzMSkwJwYDVQQD\nDCAwNDFAWnRlc3RAMDAwMTAwMDA6U0lHTkAwMDAwMDAwMTBZMBMGByqGSM49AgEGCCqBHM9VAYIt\nA0IABDRNKhvnjaMUShsM4MJ330WhyOwpZEHoAGfqxFGX+rcL9x069dyrmiF3+2ezwSNh1/6YqfFZ\nX9koM9zE5RG4USmjgfMwgfAwHwYDVR0jBBgwFoAUa/4Y2o9COqa4bbMuiIM6NKLBMOEwSAYDVR0g\nBEEwPzA9BghggRyG7yoBATAxMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmNmY2EuY29tLmNuL3Vz\nL3VzLTE0Lmh0bTA4BgNVHR8EMTAvMC2gK6AphidodHRwOi8vdWNybC5jZmNhLmNvbS5jbi9TTTIv\nY3JsNDI4NS5jcmwwCwYDVR0PBAQDAgPoMB0GA1UdDgQWBBREhx9VlDdMIdIbhAxKnGhPx8FcHDAd\nBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwDAYIKoEcz1UBg3UFAANIADBFAiEAgWvQi3h6\niW4jgF4huuXfhWInJmTTYr2EIAdG8V4M8fYCIBixygdmfPL9szcK2pzCYmIb6CBzo5SMv50Odycc\nVfY6");
+			string pwd = "cfca1234";
+			GmUtil.Sm2Cert sm2Cert = GmUtil.readSm2File(array, pwd);
+			array = GmUtil.Sm2Encrypt(Encoding.UTF8.GetBytes("s"), (ECPublicKeyParameters)sm2Cert.publicKey);
+			array = GmUtil.Sm2Decrypt(array, (ECPrivateKeyParameters)sm2Cert.privateKey);
+			byte[] bytes3 = Encoding.UTF8.GetBytes("message digest");
+			bytes2 = Encoding.UTF8.GetBytes("userId");
+			GmUtil.SignSm3WithSm2(bytes3, bytes2, (ECPrivateKeyParameters)sm2Cert.privateKey);
+		}
+
+		// Token: 0x04000003 RID: 3
+		private static X9ECParameters x9ECParameters = GMNamedCurves.GetByName("sm2p256v1");
+
+		// Token: 0x04000004 RID: 4
+		private static ECDomainParameters ecDomainParameters = new ECDomainParameters(GmUtil.x9ECParameters.Curve, GmUtil.x9ECParameters.G, GmUtil.x9ECParameters.N);
+
+		// Token: 0x04000005 RID: 5
+		private const int RS_LEN = 32;
+
+		// Token: 0x04000006 RID: 6
+		public const string SM4_ECB_NOPADDING = "SM4/ECB/NoPadding";
+
+		// Token: 0x04000007 RID: 7
+		public const string SM4_ECB_PKCS7PADDING = "SM4/ECB/PKCS7Padding";
+
+		// Token: 0x04000008 RID: 8
+		public const string SM4_CBC_NOPADDING = "SM4/CBC/NoPadding";
+
+		// Token: 0x04000009 RID: 9
+		public const string SM4_CBC_PKCS7PADDING = "SM4/CBC/PKCS7Padding";
+
+		// Token: 0x02000011 RID: 17
+		public class Sm2Cert
+		{
+			// Token: 0x04000073 RID: 115
+			public AsymmetricKeyParameter privateKey;
+
+			// Token: 0x04000074 RID: 116
+			public AsymmetricKeyParameter publicKey;
+
+			// Token: 0x04000075 RID: 117
+			public string certId;
+		}
+	}
+}

+ 0 - 899
Common/SMCipher.cs

@@ -1,899 +0,0 @@
-using Org.BouncyCastle.Crypto;
-using Org.BouncyCastle.Crypto.Digests;
-using Org.BouncyCastle.Crypto.Generators;
-using Org.BouncyCastle.Crypto.Parameters;
-using Org.BouncyCastle.Math;
-using Org.BouncyCastle.Math.EC;
-using Org.BouncyCastle.Security;
-using Org.BouncyCastle.Utilities.Encoders;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace AnHuiMI.Common
-{
-    /// <summary>
-    /// 密码计算
-    /// </summary>
-    public class Cipher
-    {
-        private int ct = 1;
-
-
-        /// <summary>
-        /// 椭圆曲线E上点P2
-        /// </summary>
-        private ECPoint p2;
-        private SM3Digest sm3keybase;
-        private SM3Digest sm3c3;
-
-
-        private readonly byte[] key = new byte[32];
-        private byte keyOff = 0;
-
-
-        public Cipher()
-        {
-        }
-
-
-        private void Reset()
-        {
-            sm3keybase = new SM3Digest();
-            sm3c3 = new SM3Digest();
-
-
-            byte[] p;
-
-            p = p2.Normalize().XCoord.ToBigInteger().ToByteArray();
-            sm3keybase.BlockUpdate(p, 0, p.Length);
-            sm3c3.BlockUpdate(p, 0, p.Length);
-
-
-            p = p2.Normalize().YCoord.ToBigInteger().ToByteArray();
-            sm3keybase.BlockUpdate(p, 0, p.Length);
-
-
-            ct = 1;
-            NextKey();
-        }
-
-
-        private void NextKey()
-        {
-            SM3Digest sm3keycur = new SM3Digest(sm3keybase);
-            sm3keycur.Update((byte)(ct >> 24 & 0x00ff));
-            sm3keycur.Update((byte)(ct >> 16 & 0x00ff));
-            sm3keycur.Update((byte)(ct >> 8 & 0x00ff));
-            sm3keycur.Update((byte)(ct & 0x00ff));
-            sm3keycur.DoFinal(key, 0);
-            keyOff = 0;
-            ct++;
-        }
-
-
-        public virtual ECPoint InitEnc(SM2 sm2, ECPoint userKey)
-        {
-            AsymmetricCipherKeyPair key = sm2.EccKeyPairGenerator.GenerateKeyPair();
-            ECPrivateKeyParameters ecpriv = (ECPrivateKeyParameters)key.Private;
-            ECPublicKeyParameters ecpub = (ECPublicKeyParameters)key.Public;
-            BigInteger k = ecpriv.D;
-            ECPoint c1 = ecpub.Q;
-
-
-            p2 = userKey.Multiply(k);
-            Reset();
-
-
-            return c1;
-        }
-
-
-        public virtual void Encrypt(byte[] data)
-        {
-            //p2.Normalize();
-            sm3c3.BlockUpdate(data, 0, data.Length);
-            for (int i = 0; i < data.Length; i++)
-            {
-                if (keyOff == key.Length)
-                    NextKey();
-
-
-                data[i] ^= key[keyOff++];
-            }
-        }
-
-
-        public virtual void InitDec(BigInteger userD, ECPoint c1)
-        {
-            p2 = c1.Multiply(userD);
-            Reset();
-        }
-
-
-        public virtual void Decrypt(byte[] data)
-        {
-            for (int i = 0; i < data.Length; i++)
-            {
-                if (keyOff == key.Length)
-                    NextKey();
-
-
-                data[i] ^= key[keyOff++];
-            }
-            sm3c3.BlockUpdate(data, 0, data.Length);
-        }
-
-        public virtual void Dofinal(byte[] c3)
-        {
-            byte[] p = p2.Normalize().YCoord.ToBigInteger().ToByteArray();
-            sm3c3.BlockUpdate(p, 0, p.Length);
-            sm3c3.DoFinal(c3, 0);
-            Reset();
-        }
-
-    }
-
-    /// <summary>
-    /// 加密处理中心
-    /// </summary>
-    public class SM2
-    {
-        public static SM2 Instance
-        {
-            get
-            {
-                return new SM2();
-            }
-
-        }
-        public static SM2 InstanceTest
-        {
-            get
-            {
-                return new SM2();
-            }
-
-        }
-
-        #region 曲线参数
-        /// <summary>
-        /// 曲线参数
-        /// </summary>
-        public static readonly string[] CurveParameter = {
-            "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF",// p,0
-            "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC",// a,1
-            "28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93",// b,2
-            "FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123",// n,3
-            "32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7",// gx,4
-            "BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0" // gy,5
-        };
-        /// <summary>
-        /// 椭圆曲线参数
-        /// </summary>
-        public string[] EccParam = CurveParameter;
-        /// <summary>
-        /// 椭圆曲线参数P
-        /// </summary>
-        public readonly BigInteger EccP;
-        /// <summary>
-        /// 椭圆曲线参数A
-        /// </summary>
-        public readonly BigInteger EccA;
-        /// <summary>
-        /// 椭圆曲线参数B
-        /// </summary>
-        public readonly BigInteger EccB;
-        /// <summary>
-        /// 椭圆曲线参数N
-        /// </summary>
-        public readonly BigInteger EccN;
-        /// <summary>
-        /// 椭圆曲线参数Gx
-        /// </summary>
-        public readonly BigInteger EccGx;
-        /// <summary>
-        /// 椭圆曲线参数Gy
-        /// </summary>
-        public readonly BigInteger EccGy;
-        #endregion
-        /// <summary>
-        /// 椭圆曲线
-        /// </summary>
-        public readonly ECCurve EccCurve;
-        /// <summary>
-        /// 椭圆曲线的点G
-        /// </summary>
-        public readonly ECPoint EccPointG;
-        /// <summary>
-        /// 椭圆曲线 bc规范
-        /// </summary>
-        public readonly ECDomainParameters EccBcSpec;
-        /// <summary>
-        /// 椭圆曲线密钥对生成器
-        /// </summary>
-        public readonly ECKeyPairGenerator EccKeyPairGenerator;
-
-        private SM2()
-        {
-            EccParam = CurveParameter;
-
-
-            EccP = new BigInteger(EccParam[0], 16);
-            EccA = new BigInteger(EccParam[1], 16);
-            EccB = new BigInteger(EccParam[2], 16);
-            EccN = new BigInteger(EccParam[3], 16);
-            EccGx = new BigInteger(EccParam[4], 16);
-            EccGy = new BigInteger(EccParam[5], 16);
-
-
-            ECFieldElement ecc_gx_fieldelement = new FpFieldElement(EccP, EccGx);
-            ECFieldElement ecc_gy_fieldelement = new FpFieldElement(EccP, EccGy);
-
-            EccCurve = new FpCurve(EccP, EccA, EccB);
-            EccPointG = new FpPoint(EccCurve, ecc_gx_fieldelement, ecc_gy_fieldelement);
-
-            EccBcSpec = new ECDomainParameters(EccCurve, EccPointG, EccN);
-
-            ECKeyGenerationParameters ecc_ecgenparam;
-            ecc_ecgenparam = new ECKeyGenerationParameters(EccBcSpec, new SecureRandom());
-
-            EccKeyPairGenerator = new ECKeyPairGenerator();
-            EccKeyPairGenerator.Init(ecc_ecgenparam);
-        }
-
-        /// <summary>
-        /// 获取杂凑值H
-        /// </summary>
-        /// <param name="z">Z值</param>
-        /// <param name="data">待签名消息</param>
-        /// <returns></returns>
-        public virtual byte[] Sm2GetH(byte[] z, byte[] data)
-        {
-            SM3Digest sm3 = new SM3Digest();
-            //Z
-            sm3.BlockUpdate(z, 0, z.Length);
-
-            //待签名消息
-            sm3.BlockUpdate(data, 0, data.Length);
-
-            // H
-            byte[] md = new byte[sm3.GetDigestSize()];
-            sm3.DoFinal(md, 0);
-
-            return md;
-        }
-
-        /// <summary>
-        /// 获取Z值
-        /// Z=SM3(ENTL∣∣userId∣∣a∣∣b∣∣gx∣∣gy ∣∣x∣∣y) 
-        /// </summary>
-        /// <param name="userId">签名方的用户身份标识</param>
-        /// <param name="userKey">签名方公钥</param>
-        /// <returns></returns>
-        public virtual byte[] Sm2GetZ(byte[] userId, ECPoint userKey)
-        {
-            SM3Digest sm3 = new SM3Digest();
-            byte[] p;
-            // ENTL由2个字节标识的ID的比特长度 
-            int len = userId.Length * 8;
-            sm3.Update((byte)(len >> 8 & 0x00ff));
-            sm3.Update((byte)(len & 0x00ff));
-
-            // userId用户身份标识ID
-            sm3.BlockUpdate(userId, 0, userId.Length);
-
-            // a,b为系统曲线参数;
-            p = EccA.ToByteArray();
-            sm3.BlockUpdate(p, 0, p.Length);
-            p = EccB.ToByteArray();
-            sm3.BlockUpdate(p, 0, p.Length);
-            //  gx、gy为基点
-            p = EccGx.ToByteArray();
-            sm3.BlockUpdate(p, 0, p.Length);
-            p = EccGy.ToByteArray();
-            sm3.BlockUpdate(p, 0, p.Length);
-
-            // x,y用户的公钥的X和Y
-            p = userKey.Normalize().XCoord.ToBigInteger().ToByteArray();
-            sm3.BlockUpdate(p, 0, p.Length);
-            p = userKey.Normalize().YCoord.ToBigInteger().ToByteArray();
-            sm3.BlockUpdate(p, 0, p.Length);
-
-            // Z
-            byte[] md = new byte[sm3.GetDigestSize()];
-            sm3.DoFinal(md, 0);
-
-            return md;
-        }
-    }
-
-    /// <summary>
-    /// Sm2算法   
-    /// 对标国际RSA算法
-    /// </summary>
-    public class Sm2Crypto
-    {
-        /// <summary>
-        /// 数据
-        /// </summary>
-        public string Str { get; set; }
-        /// <summary>
-        /// 数据
-        /// </summary>
-        public byte[] Data { get; set; }
-        /// <summary>
-        /// 公钥
-        /// </summary>
-        public string PublicKey { get; set; }
-        /// <summary>
-        /// 私钥
-        /// </summary>
-        public string PrivateKey { get; set; }
-        /// <summary>
-        /// 获取密钥
-        /// </summary>
-        /// <param name="privateKey">私钥</param>
-        /// <param name="publicKey">公钥</param>
-        public static void GetKey(out string privateKey, out string publicKey)
-        {
-            SM2 sm2 = SM2.Instance;
-            AsymmetricCipherKeyPair key = sm2.EccKeyPairGenerator.GenerateKeyPair();
-            ECPrivateKeyParameters ecpriv = (ECPrivateKeyParameters)key.Private;
-            ECPublicKeyParameters ecpub = (ECPublicKeyParameters)key.Public;
-            publicKey = Encoding.Default.GetString(Hex.Encode(ecpub.Q.GetEncoded())).ToUpper();
-            privateKey = Encoding.Default.GetString(Hex.Encode(ecpriv.D.ToByteArray())).ToUpper();
-        }
-
-        #region 解密
-        public object Decrypt(Sm2Crypto entity)
-        {
-            var data = !string.IsNullOrEmpty(entity.Str) ?
-                Hex.Decode(entity.Str) :
-                entity.Data;
-            return Encoding.Default.GetString(Decrypt(Hex.Decode(entity.PrivateKey), data));
-        }
-        /// <summary>
-        /// 解密
-        /// </summary>
-        /// <param name="privateKey"></param>
-        /// <param name="encryptedData"></param>
-        /// <returns></returns>
-        private 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.Default.GetString(Hex.Encode(encryptedData));
-
-            byte[] c1Bytes = Hex.Decode(Encoding.Default.GetBytes(data.Substring(0, 130)));
-            int c2Len = encryptedData.Length - 97;
-            byte[] c2 = Hex.Decode(Encoding.Default.GetBytes(data.Substring(130, 2 * c2Len)));
-            byte[] c3 = Hex.Decode(Encoding.Default.GetBytes(data.Substring(130 + 2 * c2Len, 64)));
-
-            SM2 sm2 = SM2.Instance;
-            BigInteger userD = new BigInteger(1, privateKey);
-
-            ECPoint c1 = sm2.EccCurve.DecodePoint(c1Bytes);
-            //c1.Normalize();
-            Cipher cipher = new Cipher();
-            cipher.InitDec(userD, c1);
-            cipher.Decrypt(c2);
-            cipher.Dofinal(c3);
-
-            return c2;
-        }
-        #endregion
-
-        #region 加密
-        public string Encrypt(Sm2Crypto entity)
-        {
-            var data = !string.IsNullOrEmpty(entity.Str) ?
-                Encoding.Default.GetBytes(entity.Str) :
-                entity.Data;
-            return Encrypt(Hex.Decode(entity.PublicKey), data);
-        }
-
-        /// <summary>
-        /// 默认加密
-        /// </summary>
-        /// <returns></returns>
-        public string Encrypt()
-        {
-            var data = !string.IsNullOrEmpty(this.Str) ?
-                Encoding.Default.GetBytes(this.Str) :
-                this.Data;
-            return Encrypt(Hex.Decode(this.PublicKey), data);
-        }
-
-        /// <summary>
-        /// 加密
-        /// </summary>
-        /// <param name="publicKey"></param>
-        /// <param name="data"></param>
-        /// <returns></returns>
-        private 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.EccCurve.DecodePoint(publicKey);
-            //userKey.Normalize();
-            ECPoint c1 = cipher.InitEnc(sm2, userKey);
-            cipher.Encrypt(source);
-
-            byte[] c3 = new byte[32];
-            cipher.Dofinal(c3);
-
-            string sc1 = Encoding.Default.GetString(Hex.Encode(c1.GetEncoded()));
-            string sc2 = Encoding.Default.GetString(Hex.Encode(source));
-            string sc3 = Encoding.Default.GetString(Hex.Encode(c3));
-
-            return (sc1 + sc2 + sc3).ToUpper();
-        }
-        #endregion
-
-    }
-
-    class SM4
-    {
-        public const int SM4_ENCRYPT = 1;
-        public const int SM4_DECRYPT = 0;
-
-        private long GET_ULONG_BE(byte[] b, int i)
-        {
-            long n = (long)(b[i] & 0xff) << 24 | (long)((b[i + 1] & 0xff) << 16) | (long)((b[i + 2] & 0xff) << 8) | (long)(b[i + 3] & 0xff) & 0xffffffffL;
-            return n;
-        }
-
-        private void PUT_ULONG_BE(long n, byte[] b, int i)
-        {
-            b[i] = (byte)(int)(0xFF & n >> 24);
-            b[i + 1] = (byte)(int)(0xFF & n >> 16);
-            b[i + 2] = (byte)(int)(0xFF & n >> 8);
-            b[i + 3] = (byte)(int)(0xFF & n);
-        }
-
-        private long SHL(long x, int n)
-        {
-            return (x & 0xFFFFFFFF) << n;
-        }
-
-        private long ROTL(long x, int n)
-        {
-            return SHL(x, n) | x >> (32 - n);
-        }
-
-        private void SWAP(long[] sk, int i)
-        {
-            long t = sk[i];
-            sk[i] = sk[(31 - i)];
-            sk[(31 - i)] = t;
-        }
-
-        public byte[] SboxTable = new byte[] { (byte) 0xd6, (byte) 0x90, (byte) 0xe9, (byte) 0xfe,
-            (byte) 0xcc, (byte) 0xe1, 0x3d, (byte) 0xb7, 0x16, (byte) 0xb6,
-            0x14, (byte) 0xc2, 0x28, (byte) 0xfb, 0x2c, 0x05, 0x2b, 0x67,
-            (byte) 0x9a, 0x76, 0x2a, (byte) 0xbe, 0x04, (byte) 0xc3,
-            (byte) 0xaa, 0x44, 0x13, 0x26, 0x49, (byte) 0x86, 0x06,
-            (byte) 0x99, (byte) 0x9c, 0x42, 0x50, (byte) 0xf4, (byte) 0x91,
-            (byte) 0xef, (byte) 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43,
-            (byte) 0xed, (byte) 0xcf, (byte) 0xac, 0x62, (byte) 0xe4,
-            (byte) 0xb3, 0x1c, (byte) 0xa9, (byte) 0xc9, 0x08, (byte) 0xe8,
-            (byte) 0x95, (byte) 0x80, (byte) 0xdf, (byte) 0x94, (byte) 0xfa,
-            0x75, (byte) 0x8f, 0x3f, (byte) 0xa6, 0x47, 0x07, (byte) 0xa7,
-            (byte) 0xfc, (byte) 0xf3, 0x73, 0x17, (byte) 0xba, (byte) 0x83,
-            0x59, 0x3c, 0x19, (byte) 0xe6, (byte) 0x85, 0x4f, (byte) 0xa8,
-            0x68, 0x6b, (byte) 0x81, (byte) 0xb2, 0x71, 0x64, (byte) 0xda,
-            (byte) 0x8b, (byte) 0xf8, (byte) 0xeb, 0x0f, 0x4b, 0x70, 0x56,
-            (byte) 0x9d, 0x35, 0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, (byte) 0xd1,
-            (byte) 0xa2, 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, (byte) 0x87,
-            (byte) 0xd4, 0x00, 0x46, 0x57, (byte) 0x9f, (byte) 0xd3, 0x27,
-            0x52, 0x4c, 0x36, 0x02, (byte) 0xe7, (byte) 0xa0, (byte) 0xc4,
-            (byte) 0xc8, (byte) 0x9e, (byte) 0xea, (byte) 0xbf, (byte) 0x8a,
-            (byte) 0xd2, 0x40, (byte) 0xc7, 0x38, (byte) 0xb5, (byte) 0xa3,
-            (byte) 0xf7, (byte) 0xf2, (byte) 0xce, (byte) 0xf9, 0x61, 0x15,
-            (byte) 0xa1, (byte) 0xe0, (byte) 0xae, 0x5d, (byte) 0xa4,
-            (byte) 0x9b, 0x34, 0x1a, 0x55, (byte) 0xad, (byte) 0x93, 0x32,
-            0x30, (byte) 0xf5, (byte) 0x8c, (byte) 0xb1, (byte) 0xe3, 0x1d,
-            (byte) 0xf6, (byte) 0xe2, 0x2e, (byte) 0x82, 0x66, (byte) 0xca,
-            0x60, (byte) 0xc0, 0x29, 0x23, (byte) 0xab, 0x0d, 0x53, 0x4e, 0x6f,
-            (byte) 0xd5, (byte) 0xdb, 0x37, 0x45, (byte) 0xde, (byte) 0xfd,
-            (byte) 0x8e, 0x2f, 0x03, (byte) 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b,
-            0x51, (byte) 0x8d, 0x1b, (byte) 0xaf, (byte) 0x92, (byte) 0xbb,
-            (byte) 0xdd, (byte) 0xbc, 0x7f, 0x11, (byte) 0xd9, 0x5c, 0x41,
-            0x1f, 0x10, 0x5a, (byte) 0xd8, 0x0a, (byte) 0xc1, 0x31,
-            (byte) 0x88, (byte) 0xa5, (byte) 0xcd, 0x7b, (byte) 0xbd, 0x2d,
-            0x74, (byte) 0xd0, 0x12, (byte) 0xb8, (byte) 0xe5, (byte) 0xb4,
-            (byte) 0xb0, (byte) 0x89, 0x69, (byte) 0x97, 0x4a, 0x0c,
-            (byte) 0x96, 0x77, 0x7e, 0x65, (byte) 0xb9, (byte) 0xf1, 0x09,
-            (byte) 0xc5, 0x6e, (byte) 0xc6, (byte) 0x84, 0x18, (byte) 0xf0,
-            0x7d, (byte) 0xec, 0x3a, (byte) 0xdc, 0x4d, 0x20, 0x79,
-            (byte) 0xee, 0x5f, 0x3e, (byte) 0xd7, (byte) 0xcb, 0x39, 0x48 };
-
-        public uint[] FK = { 0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dc };
-
-        public uint[] CK = { 0x00070e15,0x1c232a31,0x383f464d,0x545b6269,
-                                        0x70777e85,0x8c939aa1,0xa8afb6bd,0xc4cbd2d9,
-                                        0xe0e7eef5,0xfc030a11,0x181f262d,0x343b4249,
-                                        0x50575e65,0x6c737a81,0x888f969d,0xa4abb2b9,
-                                        0xc0c7ced5,0xdce3eaf1,0xf8ff060d,0x141b2229,
-                                        0x30373e45,0x4c535a61,0x686f767d,0x848b9299,
-                                        0xa0a7aeb5,0xbcc3cad1,0xd8dfe6ed,0xf4fb0209,
-                                        0x10171e25,0x2c333a41,0x484f565d,0x646b7279 };
-
-        private byte sm4Sbox(byte inch)
-        {
-            int i = inch & 0xFF;
-            byte retVal = SboxTable[i];
-            return retVal;
-        }
-
-        private long sm4Lt(long ka)
-        {
-            long bb = 0L;
-            long c = 0L;
-            byte[] a = new byte[4];
-            byte[] b = new byte[4];
-            PUT_ULONG_BE(ka, a, 0);
-            b[0] = sm4Sbox(a[0]);
-            b[1] = sm4Sbox(a[1]);
-            b[2] = sm4Sbox(a[2]);
-            b[3] = sm4Sbox(a[3]);
-            bb = GET_ULONG_BE(b, 0);
-            c = bb ^ ROTL(bb, 2) ^ ROTL(bb, 10) ^ ROTL(bb, 18) ^ ROTL(bb, 24);
-            return c;
-        }
-
-        private long sm4F(long x0, long x1, long x2, long x3, long rk)
-        {
-            return x0 ^ sm4Lt(x1 ^ x2 ^ x3 ^ rk);
-        }
-
-        private long sm4CalciRK(long ka)
-        {
-            long bb = 0L;
-            long rk = 0L;
-            byte[] a = new byte[4];
-            byte[] b = new byte[4];
-            PUT_ULONG_BE(ka, a, 0);
-            b[0] = sm4Sbox(a[0]);
-            b[1] = sm4Sbox(a[1]);
-            b[2] = sm4Sbox(a[2]);
-            b[3] = sm4Sbox(a[3]);
-            bb = GET_ULONG_BE(b, 0);
-            rk = bb ^ ROTL(bb, 13) ^ ROTL(bb, 23);
-            return rk;
-        }
-
-        private void sm4_setkey(long[] SK, byte[] key)
-        {
-            long[] MK = new long[4];
-            long[] k = new long[36];
-            int i = 0;
-            MK[0] = GET_ULONG_BE(key, 0);
-            MK[1] = GET_ULONG_BE(key, 4);
-            MK[2] = GET_ULONG_BE(key, 8);
-            MK[3] = GET_ULONG_BE(key, 12);
-            k[0] = MK[0] ^ (long)FK[0];
-            k[1] = MK[1] ^ (long)FK[1];
-            k[2] = MK[2] ^ (long)FK[2];
-            k[3] = MK[3] ^ (long)FK[3];
-            for (; i < 32; i++)
-            {
-                k[(i + 4)] = (k[i] ^ sm4CalciRK(k[(i + 1)] ^ k[(i + 2)] ^ k[(i + 3)] ^ (long)CK[i]));
-                SK[i] = k[(i + 4)];
-            }
-        }
-
-        private void sm4_one_round(long[] sk, byte[] input, byte[] output)
-        {
-            int i = 0;
-            long[] ulbuf = new long[36];
-            ulbuf[0] = GET_ULONG_BE(input, 0);
-            ulbuf[1] = GET_ULONG_BE(input, 4);
-            ulbuf[2] = GET_ULONG_BE(input, 8);
-            ulbuf[3] = GET_ULONG_BE(input, 12);
-            while (i < 32)
-            {
-                ulbuf[(i + 4)] = sm4F(ulbuf[i], ulbuf[(i + 1)], ulbuf[(i + 2)], ulbuf[(i + 3)], sk[i]);
-                i++;
-            }
-            PUT_ULONG_BE(ulbuf[35], output, 0);
-            PUT_ULONG_BE(ulbuf[34], output, 4);
-            PUT_ULONG_BE(ulbuf[33], output, 8);
-            PUT_ULONG_BE(ulbuf[32], output, 12);
-        }
-
-        private byte[] padding(byte[] input, int mode)
-        {
-            if (input == null)
-            {
-                return null;
-            }
-
-            byte[] ret = (byte[])null;
-            if (mode == SM4_ENCRYPT)
-            {
-                int p = 16 - input.Length % 16;
-                ret = new byte[input.Length + p];
-                Array.Copy(input, 0, ret, 0, input.Length);
-                for (int i = 0; i < p; i++)
-                {
-                    ret[input.Length + i] = (byte)p;
-                }
-            }
-            else
-            {
-                int p = input[input.Length - 1];
-                ret = new byte[input.Length - p];
-                Array.Copy(input, 0, ret, 0, input.Length - p);
-            }
-            return ret;
-        }
-
-        public void sm4_setkey_enc(SM4_Context ctx, byte[] key)
-        {
-            ctx.mode = SM4_ENCRYPT;
-            sm4_setkey(ctx.sk, key);
-        }
-
-        public void sm4_setkey_dec(SM4_Context ctx, byte[] key)
-        {
-            int i = 0;
-            ctx.mode = SM4_DECRYPT;
-            sm4_setkey(ctx.sk, key);
-            for (i = 0; i < 16; i++)
-            {
-                SWAP(ctx.sk, i);
-            }
-        }
-
-        public byte[] sm4_crypt_ecb(SM4_Context ctx, byte[] input)
-        {
-            if ((ctx.isPadding) && (ctx.mode == SM4_ENCRYPT))
-            {
-                input = padding(input, SM4_ENCRYPT);
-            }
-
-            int length = input.Length;
-            byte[] bins = new byte[length];
-            Array.Copy(input, 0, bins, 0, length);
-            byte[] bous = new byte[length];
-            for (int i = 0; length > 0; length -= 16, i++)
-            {
-                byte[] inBytes = new byte[16];
-                byte[] outBytes = new byte[16];
-                Array.Copy(bins, i * 16, inBytes, 0, length > 16 ? 16 : length);
-                sm4_one_round(ctx.sk, inBytes, outBytes);
-                Array.Copy(outBytes, 0, bous, i * 16, length > 16 ? 16 : length);
-            }
-
-            if (ctx.isPadding && ctx.mode == SM4_DECRYPT)
-            {
-                bous = padding(bous, SM4_DECRYPT);
-            }
-            return bous;
-        }
-
-        public byte[] sm4_crypt_cbc(SM4_Context ctx, byte[] iv, byte[] input)
-        {
-            if (ctx.isPadding && ctx.mode == SM4_ENCRYPT)
-            {
-                input = padding(input, SM4_ENCRYPT);
-            }
-
-            int i = 0;
-            int length = input.Length;
-            byte[] bins = new byte[length];
-            Array.Copy(input, 0, bins, 0, length);
-            byte[] bous = null;
-            List<byte> bousList = new List<byte>();
-            if (ctx.mode == SM4_ENCRYPT)
-            {
-                for (int j = 0; length > 0; length -= 16, j++)
-                {
-                    byte[] inBytes = new byte[16];
-                    byte[] outBytes = new byte[16];
-                    byte[] out1 = new byte[16];
-
-                    Array.Copy(bins, i * 16, inBytes, 0, length > 16 ? 16 : length);
-                    for (i = 0; i < 16; i++)
-                    {
-                        outBytes[i] = ((byte)(inBytes[i] ^ iv[i]));
-                    }
-                    sm4_one_round(ctx.sk, outBytes, out1);
-                    Array.Copy(out1, 0, iv, 0, 16);
-                    for (int k = 0; k < 16; k++)
-                    {
-                        bousList.Add(out1[k]);
-                    }
-                }
-            }
-            else
-            {
-                byte[] temp = new byte[16];
-                for (int j = 0; length > 0; length -= 16, j++)
-                {
-                    byte[] inBytes = new byte[16];
-                    byte[] outBytes = new byte[16];
-                    byte[] out1 = new byte[16];
-
-                    Array.Copy(bins, i * 16, inBytes, 0, length > 16 ? 16 : length);
-                    Array.Copy(inBytes, 0, temp, 0, 16);
-                    sm4_one_round(ctx.sk, inBytes, outBytes);
-                    for (i = 0; i < 16; i++)
-                    {
-                        out1[i] = ((byte)(outBytes[i] ^ iv[i]));
-                    }
-                    Array.Copy(temp, 0, iv, 0, 16);
-                    for (int k = 0; k < 16; k++)
-                    {
-                        bousList.Add(out1[k]);
-                    }
-                }
-
-            }
-
-            if (ctx.isPadding && ctx.mode == SM4_DECRYPT)
-            {
-                bous = padding(bousList.ToArray(), SM4_DECRYPT);
-                return bous;
-            }
-            else
-            {
-                return bousList.ToArray();
-            }
-        }
-    }
-
-    class SM4_Context
-    {
-        public int mode;
-
-        public long[] sk;
-
-        public bool isPadding;
-
-        public SM4_Context()
-        {
-            this.mode = 1;
-            this.isPadding = true;
-            this.sk = new long[32];
-        }
-    }
-
-    class SM4Utils
-    {
-        public string secretKey = "";
-        public string iv = "";
-        public bool hexstring = false;
-
-        public string Encrypt_ECB(string plainText,string key)
-        {
-            this.secretKey = key;
-            return Encrypt_ECB(plainText);
-        }
-        public string Encrypt_ECB(string plainText)
-        {
-            SM4_Context ctx = new SM4_Context();
-            ctx.isPadding = true;
-            ctx.mode = SM4.SM4_ENCRYPT;
-
-            byte[] keyBytes;
-            if (hexstring)
-            {
-                keyBytes = Hex.Decode(secretKey);
-            }
-            else
-            {
-                keyBytes = Encoding.Default.GetBytes(secretKey);
-            }
-
-            SM4 sm4 = new SM4();
-            sm4.sm4_setkey_enc(ctx, keyBytes);
-            byte[] encrypted = sm4.sm4_crypt_ecb(ctx, Encoding.Default.GetBytes(plainText));
-
-            string cipherText = Encoding.Default.GetString(Hex.Encode(encrypted));
-            return cipherText;
-        }
-        public string Decrypt_ECB(string cipherText,string key)
-        {
-            this.secretKey = key;
-            return Decrypt_ECB(cipherText);
-        }
-        public string Decrypt_ECB(string cipherText)
-        {
-            SM4_Context ctx = new SM4_Context();
-            ctx.isPadding = true;
-            ctx.mode = SM4.SM4_DECRYPT;
-
-            byte[] keyBytes;
-            if (hexstring)
-            {
-                keyBytes = Hex.Decode(secretKey);
-            }
-            else
-            {
-                keyBytes = Encoding.Default.GetBytes(secretKey);
-            }
-
-            SM4 sm4 = new SM4();
-            sm4.sm4_setkey_dec(ctx, keyBytes);
-            byte[] decrypted = sm4.sm4_crypt_ecb(ctx, Hex.Decode(cipherText));
-            return Encoding.Default.GetString(decrypted);
-        }
-        public string Encrypt_CBC(string plainText)
-        {
-            SM4_Context ctx = new SM4_Context();
-            ctx.isPadding = true;
-            ctx.mode = SM4.SM4_ENCRYPT;
-
-            byte[] keyBytes;
-            byte[] ivBytes;
-            if (hexstring)
-            {
-                keyBytes = Hex.Decode(secretKey);
-                ivBytes = Hex.Decode(iv);
-            }
-            else
-            {
-                keyBytes = Encoding.Default.GetBytes(secretKey);
-                ivBytes = Encoding.Default.GetBytes(iv);
-            }
-
-            SM4 sm4 = new SM4();
-            sm4.sm4_setkey_enc(ctx, keyBytes);
-            byte[] encrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, Encoding.Default.GetBytes(plainText));
-
-            string cipherText = Encoding.Default.GetString(Hex.Encode(encrypted));
-            return cipherText;
-        }
-
-        public string Decrypt_CBC(string cipherText)
-        {
-            SM4_Context ctx = new SM4_Context();
-            ctx.isPadding = true;
-            ctx.mode = SM4.SM4_DECRYPT;
-
-            byte[] keyBytes;
-            byte[] ivBytes;
-            if (hexstring)
-            {
-                keyBytes = Hex.Decode(secretKey);
-                ivBytes = Hex.Decode(iv);
-            }
-            else
-            {
-                keyBytes = Encoding.Default.GetBytes(secretKey);
-                ivBytes = Encoding.Default.GetBytes(iv);
-            }
-
-            SM4 sm4 = new SM4();
-            sm4.sm4_setkey_dec(ctx, keyBytes);
-            byte[] decrypted = sm4.sm4_crypt_cbc(ctx, ivBytes, Hex.Decode(cipherText));
-            return Encoding.Default.GetString(decrypted);
-        }
-    }
-     
-}

+ 132 - 0
Common/SignUtils.cs

@@ -0,0 +1,132 @@
+using System;
+using System.Text;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using Org.BouncyCastle.Crypto;
+using Org.BouncyCastle.Crypto.Parameters;
+using Org.BouncyCastle.Math;
+using Org.BouncyCastle.Utilities.Encoders;
+
+namespace AnHuiMI.Common
+{
+    class SignUtils
+    {
+		// Token: 0x0600008F RID: 143 RVA: 0x000088EC File Offset: 0x00006AEC
+		public static string signSm3WithSm2(string chnlId, string sm4key, string prvkey, string data)
+		{
+			ECPrivateKeyParameters privatekeyFromD = GmUtil.GetPrivatekeyFromD(new BigInteger(Convert.FromBase64String(prvkey)));
+			return Convert.ToBase64String(GmUtil.SignSm3WithSm2(Encoding.UTF8.GetBytes(data), Encoding.UTF8.GetBytes(sm4key), privatekeyFromD));
+		}
+
+		// Token: 0x06000090 RID: 144 RVA: 0x0000892C File Offset: 0x00006B2C
+		public static bool verifySm3WithSm2(string msg, string sm4key, string signData, string pubKey)
+		{
+			byte[] array = Convert.FromBase64String(pubKey);
+			BitConverter.ToString(array);
+			AsymmetricKeyParameter publickeyFromXY = GmUtil.GetPublickeyFromXY(array);
+			byte[] rs = Convert.FromBase64String(signData);
+			return GmUtil.VerifySm3WithSm2(Encoding.UTF8.GetBytes(msg), Encoding.UTF8.GetBytes(sm4key), rs, publickeyFromXY);
+		}
+
+		// Token: 0x06000091 RID: 145 RVA: 0x00008970 File Offset: 0x00006B70
+		public static string getSignText(string chnlId, string sm4key, string data, long ts)
+		{
+			string value = StringUtils.SortJson(data);
+			JObject jobject = new JObject();
+			jobject.Add("appId", chnlId);
+			jobject.Add("data", value);
+			jobject.Add("encType", "SM4");
+			jobject.Add("signType", "SM2");
+			if (ts == 0L)
+			{
+				jobject.Add("timestamp", Convert.ToString(StringUtils.CurrentTimeStamp(true)));
+			}
+			else
+			{
+				jobject.Add("timestamp", Convert.ToString(ts));
+			}
+			jobject.Add("version", "2.0.1");
+			return StringUtils.Json2sign(jobject.ToString(Formatting.None, null)) + "&key=" + sm4key;
+		}
+
+		// Token: 0x06000092 RID: 146 RVA: 0x00008A3C File Offset: 0x00006C3C
+		public static string encryptMsg(string chnlId, string sm4key, string prvkey, string data, ref string rtSignPlain)
+		{
+			long num = StringUtils.CurrentTimeStamp(true);
+			string signText = SignUtils.getSignText(chnlId, sm4key, data, num);
+			string value = SignUtils.signSm3WithSm2(chnlId, sm4key, prvkey, signText);
+			string value2 = SignUtils.sm4Encrypt(chnlId, sm4key, data);
+			JObject jobject = new JObject();
+			jobject.Add("appId", chnlId);
+			jobject.Add("encData", value2);
+			jobject.Add("encType", "SM4");
+			jobject.Add("signData", value);
+			jobject.Add("signType", "SM2");
+			jobject.Add("timestamp", Convert.ToString(num));
+			jobject.Add("version", "2.0.1");
+			rtSignPlain = signText;
+			return jobject.ToString(Formatting.None, null);
+		}
+
+		// Token: 0x06000093 RID: 147 RVA: 0x00008B08 File Offset: 0x00006D08
+		public static string encryptMsg(string chnlId, string sm4key, string prvkey, string data)
+		{
+			long num = StringUtils.CurrentTimeStamp(true);
+			string signText = SignUtils.getSignText(chnlId, sm4key, data, num);
+			string value = SignUtils.signSm3WithSm2(chnlId, sm4key, prvkey, signText);
+			string value2 = SignUtils.sm4Encrypt(chnlId, sm4key, data);
+			return new JObject
+			{
+				{
+					"appId",
+					chnlId
+				},
+				{
+					"encData",
+					value2
+				},
+				{
+					"encType",
+					"SM4"
+				},
+				{
+					"signData",
+					value
+				},
+				{
+					"signType",
+					"SM2"
+				},
+				{
+					"timestamp",
+					Convert.ToString(num)
+				},
+				{
+					"version",
+					"2.0.1"
+				}
+			}.ToString(Formatting.None, null);
+		}
+
+		// Token: 0x06000094 RID: 148 RVA: 0x00008BD0 File Offset: 0x00006DD0
+		public static string sm4Encrypt(string chnlId, string sm4key, string message)
+		{
+			byte[] bytes = Encoding.UTF8.GetBytes(chnlId.Substring(0, 16));
+			byte[] bytes2 = Encoding.UTF8.GetBytes(sm4key);
+			byte[] bytes3 = Encoding.UTF8.GetBytes(message);
+			string text = Hex.ToHexString(GmUtil.Sm4EncryptECB(bytes, bytes2, "SM4/ECB/PKCS7Padding")).ToUpper();
+			return Hex.ToHexString(GmUtil.Sm4EncryptECB(Encoding.UTF8.GetBytes(text.Substring(0, 16)), bytes3, "SM4/ECB/PKCS7Padding"));
+		}
+
+		// Token: 0x06000095 RID: 149 RVA: 0x00008C44 File Offset: 0x00006E44
+		public static string sm4Decrypt(string chnlId, string sm4key, string message)
+		{
+			byte[] bytes = Encoding.UTF8.GetBytes(chnlId.Substring(0, 16));
+			byte[] bytes2 = Encoding.UTF8.GetBytes(sm4key);
+			byte[] cipher = Hex.Decode(message);
+			string text = BitConverter.ToString(GmUtil.Sm4EncryptECB(bytes, bytes2, "SM4/ECB/PKCS7Padding"), 0).Replace("-", string.Empty).ToUpper();
+			byte[] bytes3 = GmUtil.Sm4DecryptECB(Encoding.UTF8.GetBytes(text.Substring(0, 16)), cipher, "SM4/ECB/PKCS7Padding");
+			return Encoding.UTF8.GetString(bytes3);
+		}
+	}
+}

+ 63 - 0
Common/StringUtils.cs

@@ -0,0 +1,63 @@
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace AnHuiMI.Common
+{
+	class StringUtils
+	{
+		// Token: 0x06000098 RID: 152 RVA: 0x00008CE8 File Offset: 0x00006EE8
+		public static long CurrentTimeStamp(bool isMinseconds = false)
+		{
+			TimeSpan timeSpan = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
+			return Convert.ToInt64(isMinseconds ? timeSpan.TotalMilliseconds : timeSpan.TotalSeconds);
+		}
+
+		// Token: 0x06000099 RID: 153 RVA: 0x00008D28 File Offset: 0x00006F28
+		public static string SortJson(string json)
+		{
+			var dic = JsonConvert.DeserializeObject<SortedDictionary<string, object>>(json);
+			SortedDictionary<string, object> keyValues = new SortedDictionary<string, object>(dic);
+			keyValues.OrderBy(m => m.Key);//升序 把Key换成Value 就是对Value进行排序
+										  //keyValues.OrderByDescending(m => m.Key);//降序
+			SortedDictionary<string, object> tempKeyValues = new SortedDictionary<string, object>(keyValues);
+			foreach (KeyValuePair<string, object> kv in tempKeyValues)
+			{
+				// 判断value是不是JObject类型
+				Type t0 = typeof(JObject);
+				Type t1 = kv.Value.GetType();
+				if (t0 == t1)
+				{
+					// value是JObject类型
+					string jsonItem = JsonConvert.SerializeObject(kv.Value);
+					jsonItem = SortJson(jsonItem);
+					keyValues[kv.Key] = JsonConvert.DeserializeObject<JObject>(jsonItem);
+				}
+			}
+			return JsonConvert.SerializeObject(keyValues);
+		}
+
+		// Token: 0x0600009B RID: 155 RVA: 0x00009080 File Offset: 0x00007280
+		public static string Json2sign(string json)
+		{
+			Dictionary<string, object> dictionary = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);
+			string text = "";
+			foreach (KeyValuePair<string, object> keyValuePair in dictionary)
+			{
+				text = string.Concat(new object[]
+				{
+					text,
+					keyValuePair.Key,
+					"=",
+					keyValuePair.Value,
+					"&"
+				});
+			}
+			return text.Substring(0, text.Length - 1);
+		}
+	}
+}

+ 11 - 5
HeFeiMI.csproj

@@ -32,8 +32,8 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="BouncyCastle.Crypto, Version=1.9.0.0, Culture=neutral, PublicKeyToken=0e99375e54769942, processorArchitecture=MSIL">
-      <HintPath>packages\Portable.BouncyCastle.1.9.0\lib\net40\BouncyCastle.Crypto.dll</HintPath>
+    <Reference Include="BouncyCastle.Crypto">
+      <HintPath>..\hefei\packages\framework\BouncyCastle.Crypto.dll</HintPath>
     </Reference>
     <Reference Include="FastReport, Version=2023.1.8.0, Culture=neutral, PublicKeyToken=db7e5ce63278458c, processorArchitecture=MSIL">
       <SpecificVersion>False</SpecificVersion>
@@ -43,12 +43,16 @@
       <SpecificVersion>False</SpecificVersion>
       <HintPath>bin\Debug\FastReportFrom.dll</HintPath>
     </Reference>
+    <Reference Include="GMUtilLib">
+      <HintPath>..\hefei\packages\framework\GMUtilLib.dll</HintPath>
+    </Reference>
     <Reference Include="Microsoft.Office.Interop.Excel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c, processorArchitecture=MSIL">
       <HintPath>packages\Microsoft.Office.Interop.Excel.15.0.4795.1001\lib\net20\Microsoft.Office.Interop.Excel.dll</HintPath>
       <EmbedInteropTypes>True</EmbedInteropTypes>
     </Reference>
-    <Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
-      <HintPath>packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
+    <Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
+      <SpecificVersion>False</SpecificVersion>
+      <HintPath>..\Demo\bin\Debug-ChongQing\Newtonsoft.Json.dll</HintPath>
     </Reference>
     <Reference Include="Office, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c, processorArchitecture=MSIL">
       <HintPath>packages\Microsoft.Office.Excel.14.0.4760.1000\lib\net20\Office.dll</HintPath>
@@ -96,7 +100,9 @@
     <Compile Include="Common\ECTokenReader.cs" />
     <Compile Include="Common\Encrypt.cs" />
     <Compile Include="Common\ExPortToExcel.cs" />
-    <Compile Include="Common\SMCipher.cs" />
+    <Compile Include="Common\GmUtil.cs" />
+    <Compile Include="Common\SignUtils.cs" />
+    <Compile Include="Common\StringUtils.cs" />
     <Compile Include="Common\Utils.cs" />
     <Compile Include="FormSetter\ComboxSetter.cs" />
     <Compile Include="FormSetter\DataTableSetter.cs" />

+ 29 - 75
Helper/EncryptHelper.cs

@@ -5,24 +5,37 @@ using System.Text;
 using System.Threading.Tasks;
 using AnHuiMI.Common;
 using Newtonsoft.Json.Linq;
-//using GMUtilLib;
 using PTMedicalInsurance.Variables;
 
 namespace PTMedicalInsurance.Helper
 {
     class EncryptHelper
     {
+        //private string ak = "1G94963I20403F60C80A00005FF7A699";
+        //private string sk = "APyE9G1D+C8g3qV3Z6VshXztOa55YJBgwN+P4WqU5n0x";
+        //private string appid = "1G94963HS03V3F60C80A00000DB330D8";
 
-        private string appSecret = "1H1INA1L90OH3F60C80A00008119D616";
-        private string appid = "1H1INA1L30OG3F60C80A0000DEE43558";
-        public string encrypt(string data)
+        //测试
+        private string ak = "1H1INA1L90OH3F60C80A00008119D616";   //appSecret 数字密钥
+        private string sk = "APCIAgJqh3+AcK/IXL1WJD130i2q+6UblRxQzus3+sVw";     //渠道私密
+        public static string appid = "1H1INA1L30OG3F60C80A0000DEE43558";    //渠道ID
+
+        //正式
+        //private string ak = "1H62Q1KH205K76430B0A0000BF149773";
+        //private string sk = "YbNObZNMdUgwgLUEyK4ixNSkaCF9OPtCdDth9APWYKU=";
+        //private string appid = "1H62Q1KGP05J76430B0A00007144E257";
+
+
+        public string getSignText(string data)
+        {
+            return SignUtils.getSignText(appid, ak, data, 0L);
+        }
+        public string encrypt(string data,ref string signText)
         {
             string encryptData = "";
             try
             { 
-                SM4Utils sm4 = new SM4Utils();
-                string newKey = sm4.Encrypt_ECB(appSecret,appid);
-                encryptData = sm4.Encrypt_ECB(data,newKey.Substring(0,32));
+                encryptData = SignUtils.encryptMsg(appid, ak, sk, data,ref signText);
                 return encryptData;
             }
             catch (Exception ex)
@@ -32,7 +45,7 @@ namespace PTMedicalInsurance.Helper
             }
             finally
             {
-                Global.writeLog(";appid:" + appid,data,encryptData);
+                Global.writeLog("ak:" + ak + ";sk:" + sk + ";appid:" + appid, data, encryptData);
             }
         }
 
@@ -41,9 +54,7 @@ namespace PTMedicalInsurance.Helper
             string encryptData = "";
             try
             {
-                SM4Utils sm4 = new SM4Utils();
-                string newKey = sm4.Encrypt_ECB(appSecret, appid);
-                encryptData = sm4.Decrypt_ECB(data, newKey.Substring(0, 32));
+                encryptData = SignUtils.signSm3WithSm2(appid, ak, sk, data);
                 return encryptData;
             }
             catch (Exception ex)
@@ -53,71 +64,16 @@ namespace PTMedicalInsurance.Helper
             }
             finally
             {
-                Global.writeLog(";appid:" + appid, data, encryptData);
+                Global.writeLog("ak:" + ak + ";sk:" + sk + ";appid:" + appid, data, encryptData);
             }
         }
 
-        public string signWithSM2(JObject obj)
-        {
-            JObject joSign = JObject.Parse(JsonHelper.toJsonString(obj));
-            Global.writeLog("去除空值:" + joSign.ToString());
-
-            string data = sortKeys(joSign);
-            Global.writeLog("排序:"+data);
-
-            data += "&key="+appSecret;
-            Global.writeLog("加secret:" + data);
-
-            Sm2Crypto crypto = new Sm2Crypto();
-            string publicKey = "", privateKey = "";
-            //string publicKey = "BPwaiORlFqBIiMMTyeATozdSsLCxlGa/8ouTosiHKKmVeSnSWRgdIHOEXzyCVQlRzPCsKB24ZA4E3G8t9biN1E=", privateKey = "APCIAgJqh3+AcK/IXL1WJD130i2q+6UblRxQzus3+sVw";
-            Sm2Crypto.GetKey(out privateKey, out publicKey);
-
-            crypto.PublicKey = publicKey;
-            crypto.PrivateKey = privateKey;
-
-            crypto.Str = data;
-            string ret = crypto.Encrypt();
-            // base64
-            return Convert.ToBase64String(Encoding.UTF8.GetBytes(ret));
-        }
-
-        public string sortKeys(JObject obj) {
-
-            StringBuilder sb = new StringBuilder();
-            Dictionary<string, string> dict = new Dictionary<string, string>();
-            foreach (var p in obj.Properties())
-            {
-                dict.Add(p.Name, p.Value.ToString());
-            }
-            string[] keys = dict.Keys.ToArray();
-            Array.Sort(keys, string.CompareOrdinal);
-            foreach (var k in keys)
-            {
-                if (sb.Length > 1)
-                {
-                    sb.Append("&");
-                }
-                sb.Append(k);
-                sb.Append("=");
-                sb.Append(dict[k]);
-            }
-            return sb.ToString();
-        }
-        public int verify(string data,string encryptData)
+        public int verify(string data, string encryptData)
         {
-            string error ="";
+            string error = "";
             try
             {
-                //if (GMUtilLib.SignUtil.verifySm3WithSm2(data, ak, encryptData, sk))
-                //{
-                //    return 0;
-                //}
-                //else
-                //{
-                //    return -1;
-                //}
-                return 0;
+                if (SignUtils.verifySm3WithSm2(data, ak, encryptData, sk)) return 0; else return -1;
             }
             catch (Exception ex)
             {
@@ -126,7 +82,7 @@ namespace PTMedicalInsurance.Helper
             }
             finally
             {
-                Global.writeLog(";appid:" + appid, data + ";" + encryptData, error);
+                Global.writeLog("ak:" + ak + ";sk:" + sk + ";appid:" + appid, data + ";" + encryptData, error);
             }
         }
 
@@ -135,9 +91,7 @@ namespace PTMedicalInsurance.Helper
             string data = "";
             try
             {
-                SM4Utils sm4 = new SM4Utils();
-                string newKey = sm4.Encrypt_ECB(appSecret, appid);
-                data = sm4.Decrypt_ECB(encryptData, newKey.Substring(0, 32));
+                data = SignUtils.sm4Decrypt(ak, sk, encryptData);
                 return data;
             }
             catch (Exception ex)
@@ -147,7 +101,7 @@ namespace PTMedicalInsurance.Helper
             }
             finally
             {
-                Global.writeLog(";appid:" + appid, encryptData, data);
+                Global.writeLog("ak:" + ak + ";sk:" + sk + ";appid:" + appid, encryptData, data);
             }
         }
     }

+ 6 - 20
Helper/JsonHelper.cs

@@ -240,28 +240,14 @@ namespace PTMedicalInsurance.Helper
         /// <returns></returns>
         public static string setMPCenterInpar(string infno, JObject joInput)
         {
-            dynamic Jo = new JObject();
-            Jo.appId = "1H1INA1L30OG3F60C80A0000DEE43558";
-            //Global.curEvt.msgid = Global.inf.hospitalNO + DateTime.Now.ToString("yyyyMMddHHmmssffff");
-            //Jo.msgid = Global.curEvt.msgid;
-            Jo.data = joInput;
-            Jo.encType = "SM4";
-            Jo.signtype = "SM2";
-            Jo.version = "2.0.1";
-            Jo.timestamp = DateTime.Now.ToString("yyyyMMddHHmmss");
-
             EncryptHelper encrypt = new EncryptHelper();
-            // 签名
-            string signData = encrypt.signWithSM2(Jo);
-            Global.writeLog("签名结果:"+signData);
-            // 加密
-            string encryptData = encrypt.encrypt(joInput.ToString());
-            Global.writeLog("加密:" + encryptData);
-
-            Jo.signData =  signData;
-            Jo.encData = encryptData;
 
-            return Jo.ToString();
+            string txtData = joInput.ToString();
+            string signData = "";
+            string output = encrypt.encrypt(txtData,ref signData);
+            Global.writeLog("签名:"+signData);
+            Global.writeLog("加密后参数:"+output);
+            return output;
         }
 
         /// <summary>

+ 1 - 1
Properties/Resources.Designer.cs

@@ -19,7 +19,7 @@ namespace AnHuiMI.Properties {
     // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
     // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
     // (以 /str 作为命令选项),或重新生成 VS 项目。
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
     internal class Resources {

+ 1 - 1
Properties/Settings.Designer.cs

@@ -12,7 +12,7 @@ namespace AnHuiMI.Properties {
     
     
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
-    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.4.0.0")]
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.10.0.0")]
     internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
         
         private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));

+ 0 - 2
packages.config

@@ -3,8 +3,6 @@
   <package id="Datatable.Activities.UiPath" version="1.0.1" targetFramework="net45" />
   <package id="Microsoft.Office.Excel" version="14.0.4760.1000" targetFramework="net45" />
   <package id="Microsoft.Office.Interop.Excel" version="15.0.4795.1001" targetFramework="net45" />
-  <package id="Newtonsoft.Json" version="12.0.1" targetFramework="net45" />
-  <package id="Portable.BouncyCastle" version="1.9.0" targetFramework="net461" />
   <package id="SunnyUI" version="3.1.5" targetFramework="net472" />
   <package id="SunnyUI.Common" version="3.1.2" targetFramework="net472" />
 </packages>