第三方对接加解密系列
2. 高德地图小程序OPENAPI 事件回调加解密工具.NET/C# 实现[附源码]
前言
在最近的得物开放平台加解密处理的过程中废了不少时间, 网上的代码也是各种各样, 最终终于测试出来了, 下面开放给有需要的同学.
加解密说明
AES加密模式:ECB
填充:PKCS5Padding, 对应C# PKCS7
数据块:128, C#默认的AES数据库就是128, 无需额外设置
注意:别的语言需要完成对key的处理 java中使用了SHA1PRNG , 这个对应的方法是SHA1哈希算法, 参考GetKey方法
其余语言参考
加密(从前往后):明文 -> 加密 -> base64处理 -> 密文
解密(从后往前):明文 <- 解密 <- base64处理 <- 密文
得物文档地址
测试代码
static void Main(string[] args)
{
//明文
string plainTxt = "{\"list\":[{\"applyItemNo\":\"JS570516000080113874\",\"applyNo\":\"AP1010015038937\",\"num\":1,\"orderNo\":\"110105115769884450\",\"skuId\":6039421775,\"sourceType\":\"PX_TYPE_NORMAL\",\"spuId\":1000108135}],\"originalMsgId\":2211713,\"type\":\"CONSIGN_RETURN_ON_SHELF\",\"appKey\":\"7e26470b56dd4d93a8063f1ecc76f986\",\"openId\":\"VGnFvRhQu6kwswmG\"}";
// 密文
var encryptedTxt = $"PR2ccpPboDC+cvnoMlyXOEDEgZhTNnB/HmQZHd+/ysw84BhdZ+658xLGkJbsLuC3cNj53pfp+bXBZeisxPk8lffj9XYAL0eDO7nUW5WWbimWk/ShaqyA5/0Y9ym+odylqs+HiDKCAlate/kvPuhT6E6BfAYDdCaRHqRz82f/qkq8sG3AtvdiiltaYX7T39ky3Q8jLSp7d3qOiwcfcA3jc7ICuWeEQibsZxtidq25VcsnQnOhoD3EwsSjxDUlo6GQ0QRs42aQdQf6wREjkdSt4PQPwSfetgCMLY5Hca9OsA3ru4qIU+fj4exJIuoGKmcQTd9Pps2Y/yiKrQsMBVkF+AQWo9if7w277aF7BKXoMyXwM6MhPXIyTrqkciUBNFGOB7YeHu9/ztqO9fcXpbiYu2YgwMkvdD3Y98hQwlEvXoI=";
//密钥,64位
string keys = "3f170f3943e8419c87ce4491a2b6492216f3c99a0fd14de18ae515e3c61e4214";
//加密
byte[] encryptBytes = AESEncryption.AESEncrypt(Encoding.UTF8.GetBytes(plainTxt), keys);
Console.WriteLine($"加密测试结果: {Convert.ToBase64String(encryptBytes).Equals(encryptedTxt)}");
//解密
byte[] decryptBytes = AESEncryption.AESDecrypt(Convert.FromBase64String(encryptedTxt), keys);
Console.WriteLine("解密结果:" + Encoding.UTF8.GetString(decryptBytes).Equals(plainTxt));
}
加解密算法代码
class AESEncryption
{
/// <summary>
/// AES加密算法
/// </summary>
/// <param name="plainText">明文字符串</param>
/// <param name="strKey">密钥</param>
/// <returns>返回加密后的密文字节数组</returns>
public static byte[] AESEncrypt(byte[] inputByteArray, string strKey)
{
SymmetricAlgorithm algorithm = CreateAesAlgorithm(strKey);
ICryptoTransform cTransform = algorithm.CreateEncryptor();
return cTransform.TransformFinalBlock(inputByteArray, 0, inputByteArray.Length);
}
/// <summary>
/// AES解密
/// </summary>
/// <param name="cipherText">密文字节数组</param>
/// <param name="strKey">密钥</param>
/// <returns>返回解密后的字符串</returns>
public static byte[] AESDecrypt(byte[] cipherText, string strKey)
{
SymmetricAlgorithm algorithm = CreateAesAlgorithm(strKey);
ICryptoTransform decryptor = algorithm.CreateDecryptor();
return decryptor.TransformFinalBlock(cipherText, 0, cipherText.Length);
}
private static Aes CreateAesAlgorithm(string strKey)
{
var aes = Aes.Create();
aes.Key = GetKey(strKey);
aes.BlockSize = 128;
aes.Mode = CipherMode.ECB;
aes.Padding = PaddingMode.PKCS7;
return aes;
}
public static byte[] GetKey(string aesKey)
{
using var sha1 = SHA1.Create();
byte[] hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(aesKey));
var rd = sha1.ComputeHash(hash);
return rd.Take(16).ToArray();
}
}