Files

92 lines
3.1 KiB
C#
Raw Permalink Normal View History

2023-03-02 22:57:29 +08:00
using System;
using Org.BouncyCastle.Utilities.Encoders;
using System.Text;
using Newtonsoft.Json.Linq;
using System.Runtime.InteropServices;
namespace SMCryptoUtils
{
[ClassInterface(ClassInterfaceType.None)]
public class SMUtil:ISMUtil
{
private readonly static EasyGmUtils easyGmUtils = new EasyGmUtils();
private readonly static SignUtil signUtil = new SignUtil();
/**
*
*
* @param data
* @param appId
* @param appSecret
* @return
*/
public 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 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;
}
/**
*
*
* @param jsonObject
* @param appSecret
* @param privateKey
* @return
*/
public 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 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);
}
}
}