/* * @Description: * @Author: ylz-lichong * @Date: 2022-06-16 17:46:23 */ using Org.BouncyCastle.Utilities.Encoders; using System; using System.Text; using Newtonsoft.Json.Linq; using Newtonsoft.Json; using PTMedicalInsurance.Forms; using System.IO; using System.Security.Cryptography; namespace GMCrypto.Lib { class SMUtil { /** * 加密 * * @param data * @param appId * @param appSecret * @return */ public static String encrypt(String data, String appId, String appSecret) { //加密流程 //用appId加密appSecret获取新秘钥 byte[] appSecretEncData = EasyGmUtils.sm4Encrypt(Encoding.UTF8.GetBytes(appId.Substring(0, 16)), Encoding.UTF8.GetBytes(appSecret)); //新秘钥串 byte[] secKey = Encoding.UTF8.GetBytes(Hex.ToHexString(appSecretEncData).ToUpper().Substring(0, 16)); //加密0数据 String encryptDataStr = Hex.ToHexString(EasyGmUtils.sm4Encrypt(secKey, Encoding.UTF8.GetBytes(data))).ToUpper(); return encryptDataStr; } /** * 解密 * * @param data * @param appId * @param appSecret * @return */ public static String decrypt(String data, String appId, String appSecret) { byte[] appSecretEncDataDecode = EasyGmUtils.sm4Encrypt(Encoding.UTF8.GetBytes(appId.Substring(0, 16)), Encoding.UTF8.GetBytes(appSecret)); byte[] secKeyDecode = Encoding.UTF8.GetBytes(Hex.ToHexString(appSecretEncDataDecode).ToUpper().Substring(0, 16)); String decryptDataStr = Encoding.UTF8.GetString(EasyGmUtils.sm4Decrypt(secKeyDecode, Hex.Decode(data))); return decryptDataStr; } /** * 解密 AES ECB/ 编码:Base64/字符集 utf8 / 解密密钥 * * @param data * @param appId * @param appSecret * @return */ public static string AESDecrypt(string cipherText, string key) { using (Aes aesAlg = Aes.Create()) { aesAlg.Key = Encoding.UTF8.GetBytes(key); aesAlg.Mode = CipherMode.ECB; // 使用ECB模式 aesAlg.Padding = PaddingMode.PKCS7; // 使用PKCS7填充 ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV); byte[] encryptedBytes = Convert.FromBase64String(cipherText); // Base64解码 using (MemoryStream msDecrypt = new MemoryStream(encryptedBytes)) { using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) { using (StreamReader srDecrypt = new StreamReader(csDecrypt)) { return srDecrypt.ReadToEnd(); } } } } } /** * 签名 * * @param jsonObject * @param appSecret * @param privateKey * @return */ public static String sign(JObject jsonObject, String appSecret, String privateKey) { // 获取签名串 byte[] signText = Encoding.UTF8.GetBytes(SignUtil.getSignText(jsonObject, appSecret)); byte[] userId = Encoding.UTF8.GetBytes(appSecret); byte[] prvkey = Base64.Decode(privateKey); String responseSign = Base64.ToBase64String(EasyGmUtils.signSm3WithSm2(signText, userId, prvkey)); return responseSign; } /** * 验签 * * @param jsonObject * @param appSecret * @param publicKey * @param responseSign * @return */ public static Boolean verify(JObject jsonObject, String appSecret, String publicKey, String responseSign) { //验签 byte[] msg = Encoding.UTF8.GetBytes(SignUtil.getSignText(jsonObject, appSecret)); byte[] userIdDecode = Encoding.UTF8.GetBytes(appSecret); byte[] pubkey = Base64.Decode(publicKey); byte[] signData = Base64.Decode(responseSign); return EasyGmUtils.verifySm3WithSm2(msg, userIdDecode, signData, pubkey); } /** * 签名 * * @param jsonObject * @param appSecret * @param privateKey * @return */ public static String sign(String jsonString, String appSecret, String privateKey) { JObject jsonObject = (JObject)JObject.Parse(jsonString); // 获取签名串 byte[] signText = Encoding.UTF8.GetBytes(SignUtil.getSignText(jsonObject, appSecret)); byte[] userId = Encoding.UTF8.GetBytes(appSecret); byte[] prvkey = Base64.Decode(privateKey); String responseSign = Base64.ToBase64String(EasyGmUtils.signSm3WithSm2(signText, userId, prvkey)); return responseSign; } /** * 验签 * * @param jsonObject * @param appSecret * @param publicKey * @param responseSign * @return */ public static Boolean verify(String jsonString, String appSecret, String publicKey, String responseSign) { JObject jsonObject = (JObject)JObject.Parse(jsonString); //验签 byte[] msg = Encoding.UTF8.GetBytes(SignUtil.getSignText(jsonObject, appSecret)); byte[] userIdDecode = Encoding.UTF8.GetBytes(appSecret); byte[] pubkey = Base64.Decode(publicKey); byte[] signData = Base64.Decode(responseSign); return EasyGmUtils.verifySm3WithSm2(msg, userIdDecode, signData, pubkey); } } }