zhengjie 1 gadu atpakaļ
vecāks
revīzija
ac667251ed
4 mainītis faili ar 61 papildinājumiem un 47 dzēšanām
  1. 19 23
      Common/SignUtils.cs
  2. 31 21
      Common/StringUtils.cs
  3. 6 3
      Helper/EncryptHelper.cs
  4. 5 0
      Helper/JsonHelper.cs

+ 19 - 23
Common/SignUtils.cs

@@ -29,50 +29,46 @@ namespace AnHuiMI.Common
 		}
 
 		// Token: 0x06000091 RID: 145 RVA: 0x00008970 File Offset: 0x00006B70
-		public static string getSignText(string chnlId, string sm4key, string data, long ts)
+		public static string getSignText(string chnlId, string sm4key, string data,string ts)
 		{
-			string value = StringUtils.SortJson(data);
 			JObject jobject = new JObject();
 			jobject.Add("appId", chnlId);
-			jobject.Add("data", value);
+			jobject.Add("data", JObject.Parse(data));
 			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("timestamp", ts); ;
 			jobject.Add("version", "2.0.1");
-			return StringUtils.Json2sign(jobject.ToString(Formatting.None, null)) + "&key=" + sm4key;
+
+			string value = StringUtils.SortJson(jobject.ToString(Formatting.None, null));
+
+			return StringUtils.Json2sign(value) + "&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);
+			string ts = DateTime.Now.ToString("yyyyMMddHHmmss");
+			string signText = SignUtils.getSignText(chnlId, sm4key, data,ts);
+			string signData = SignUtils.signSm3WithSm2(chnlId, sm4key, prvkey, signText);
+			string encData = SignUtils.sm4Encrypt(chnlId, sm4key, data);
 			JObject jobject = new JObject();
 			jobject.Add("appId", chnlId);
-			jobject.Add("encData", value2);
+			jobject.Add("encData", encData);
 			jobject.Add("encType", "SM4");
-			jobject.Add("signData", value);
+			jobject.Add("signData", signData);
 			jobject.Add("signType", "SM2");
-			jobject.Add("timestamp", Convert.ToString(num));
+			jobject.Add("timestamp", ts);
 			jobject.Add("version", "2.0.1");
-			rtSignPlain = signText;
+			rtSignPlain = signData;
+
 			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 ts = DateTime.Now.ToString("yyyyMMddHHmmss");
+			string signText = SignUtils.getSignText(chnlId, sm4key, data, ts);
 			string value = SignUtils.signSm3WithSm2(chnlId, sm4key, prvkey, signText);
 			string value2 = SignUtils.sm4Encrypt(chnlId, sm4key, data);
 			return new JObject
@@ -99,7 +95,7 @@ namespace AnHuiMI.Common
 				},
 				{
 					"timestamp",
-					Convert.ToString(num)
+					ts
 				},
 				{
 					"version",

+ 31 - 21
Common/StringUtils.cs

@@ -18,45 +18,55 @@ namespace AnHuiMI.Common
 		}
 
 		// Token: 0x06000099 RID: 153 RVA: 0x00008D28 File Offset: 0x00006F28
-		public static string SortJson(string json)
+		public static SortedDictionary<string, object> KeySort(JObject obj)
 		{
-			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)
+			var dic = new SortedDictionary<string, object>();
+			foreach (var x in obj)
 			{
-				// 判断value是不是JObject类型
-				Type t0 = typeof(JObject);
-				Type t1 = kv.Value.GetType();
-				if (t0 == t1)
+				if (x.Value is JValue) dic.Add(x.Key, x.Value);
+				else if (x.Value is JObject) dic.Add(x.Key, KeySort((JObject)x.Value));
+				else if (x.Value is JArray)
 				{
-					// value是JObject类型
-					string jsonItem = JsonConvert.SerializeObject(kv.Value);
-					jsonItem = SortJson(jsonItem);
-					keyValues[kv.Key] = JsonConvert.DeserializeObject<JObject>(jsonItem);
+					var tmp = new SortedDictionary<string, object>[x.Value.Count()];
+					for (var i = 0; i < x.Value.Count(); i++)
+					{
+						tmp[i] = KeySort((JObject)x.Value[i]);
+					}
+					dic.Add(x.Key, tmp);
 				}
 			}
+			return dic;
+
+		}
+
+		public static string SortJson(string json)
+		{
+			SortedDictionary<string, object> keyValues = KeySort(JObject.Parse(json));
+			keyValues.OrderBy(m => m.Key);
+
 			return JsonConvert.SerializeObject(keyValues);
 		}
 
-		// Token: 0x0600009B RID: 155 RVA: 0x00009080 File Offset: 0x00007280
-		public static string Json2sign(string json)
+			// 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[]
-				{
+                // 值为空不参与签名
+                //if (!string.IsNullOrEmpty(keyValuePair.Value + ""))
+                //{
+                    text = string.Concat(new object[]
+					{
 					text,
 					keyValuePair.Key,
 					"=",
 					keyValuePair.Value,
 					"&"
-				});
-			}
+					});
+                //}
+            }
 			return text.Substring(0, text.Length - 1);
 		}
 	}

+ 6 - 3
Helper/EncryptHelper.cs

@@ -16,9 +16,10 @@ namespace PTMedicalInsurance.Helper
         //private string appid = "1G94963HS03V3F60C80A00000DB330D8";
 
         //测试
-        private string ak = "1H1INA1L90OH3F60C80A00008119D616";   //appSecret 数字密钥
+        private string ak = "1H1INA1L90OH3F60C80A00008119D616";   //appSecret 数字密钥sm4
         private string sk = "APCIAgJqh3+AcK/IXL1WJD130i2q+6UblRxQzus3+sVw";     //渠道私密
         public static string appid = "1H1INA1L30OG3F60C80A0000DEE43558";    //渠道ID
+        public string pubKey = "BPwaiORlFqBIiMMTyeATozdSsLCxlGa/ N8ouTosiHKKmVeSnSWRgdIHOEXzyCVQlRzPCsKB24ZA4E3G8t9biN1E=";
 
         //正式
         //private string ak = "1H62Q1KH205K76430B0A0000BF149773";
@@ -28,7 +29,8 @@ namespace PTMedicalInsurance.Helper
 
         public string getSignText(string data)
         {
-            return SignUtils.getSignText(appid, ak, data, 0L);
+            string ts = DateTime.Now.ToString("yyyyMMddHHmmss");
+            return SignUtils.getSignText(appid, ak, data,ts);
         }
         public string encrypt(string data,ref string signText)
         {
@@ -73,7 +75,8 @@ namespace PTMedicalInsurance.Helper
             string error = "";
             try
             {
-                if (SignUtils.verifySm3WithSm2(data, ak, encryptData, sk)) return 0; else return -1;
+                string signText = getSignText(data);
+                if (SignUtils.verifySm3WithSm2(signText, ak, encryptData, pubKey)) return 0; else return -1;
             }
             catch (Exception ex)
             {

+ 5 - 0
Helper/JsonHelper.cs

@@ -244,9 +244,14 @@ namespace PTMedicalInsurance.Helper
 
             string txtData = joInput.ToString();
             string signData = "";
+
             string output = encrypt.encrypt(txtData,ref signData);
             Global.writeLog("签名:"+signData);
             Global.writeLog("加密后参数:"+output);
+            
+            int rtn  = encrypt.verify(txtData, signData);
+
+            Global.writeLog("验证结果:"+rtn);
             return output;
         }