不得不说,现在的技术更新换代太快了,刚掌握好一个方向的技术点,一下子就被替换成了另一个框架。
.net framework框架还没用熟悉,.net core框架就马不停蹄的更新换代了
2022年05月04日前,网上还是很多停留在.net framework版本解密代码
不过,不管技术如何迭代更新,掌握原理和理解需求不会变
1、官网文档说明
地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_16&index=10
解密方式
解密步骤如下:
(1)对加密串A做base64解码,得到加密串B
(2)对商户key做md5,得到32位小写key* ( key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置 )
(3)用key*对加密串B做AES-256-ECB解密(PKCS7Padding)
2、base64解码
对加密串A做base64解码,得到加密串B
注意:此处的解码有一个前提,就是key值,这里的解码只用到了base64字符串转为byte[]字节,然后再根据第二条说明,结合key进行解码,请继续往第3点看
- 在解码前,先来了解下,base64加解密方法的使用
/// <summary>
/// 编码:字符串转为Base64,编码格式为UTF8
/// </summary>
/// <param name="content">加密内容</param>
/// <returns></returns>
public static string Base64ToEncode(string content)
{
byte[] bytes = Encoding.UTF8.GetBytes(content);
string base64_string = Convert.ToBase64String(bytes);
return base64_string;
}
/// <summary>
/// 解码:Base64转为字符串文本
/// </summary>
/// <param name="content">解密内容</param>
/// <returns></returns>
public static string Base64ToDecode(string content)
{
byte[] bytes = Convert.FromBase64String(content);
string text_string = Encoding.UTF8.GetString(bytes);
return text_string;
}
- 效果如下
string text = "<xml>test</xml>";
string base64 = Base64ToEncode(text); //PHhtbD50ZXN0PC94bWw+
string xml_text = Base64ToDecode(req_info); //
3、商户key转MD4
对商户key做md5,得到32位小写key* ( key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置 )
public static string Md5Encrypt(string text)
{
MD5 md5 = new MD5CryptoServiceProvider();
var data = Encoding.UTF8.GetBytes(text);
var encs = md5.ComputeHash(data);
return BitConverter.ToString(encs).Replace("-", "");
}
#region 程序集 netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51
// C:\Program Files\dotnet\sdk\NuGetFallbackFolder\netstandard.library\2.0.3\build\netstandard2.0\ref\netstandard.dll
#endregion
4、实际上解码方法
用key*对加密串B做AES-256-ECB解密(PKCS7Padding)
public static string DecodeAES256ECB(string str, string key)
{
string result = string.Empty;
try
{
byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key);
byte[] toEncryptArray = Convert.FromBase64String(str);
RijndaelManaged rDel = new RijndaelManaged();
rDel.Key = keyArray;
rDel.Mode = CipherMode.ECB;
rDel.Padding = PaddingMode.PKCS7;
ICryptoTransform cTransform = rDel.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
result = UTF8Encoding.UTF8.GetString(resultArray);
}
catch(Exception exception)
{
}
return result;
}
5、解码效果
温馨提示:在开发过程中若遇到疑问,可讨论解决,相互学习