C#实现微信AES-128-CBC加密数据的解密
时间:2022-04-23
本文章向大家介绍C#实现微信AES-128-CBC加密数据的解密,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
小程序登录时,获得用户的信息,只是昵称,无法用作ID。而有用的数据,都加密着,腾讯给出了解密的方法:
加密数据解密算法
接口如果涉及敏感数据(如wx.getUserInfo
当中的 openId 和unionId ),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptedData )进行对称解密。 解密算法如下:
- 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
- 对称解密的目标密文为 Base64_Decode(encryptedData),
- 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节
- 对称解密算法初始向量 iv 会在数据接口中返回。
微信官方提供了多种编程语言的示例代码(点击下载)。每种语言类型的接口名字均一致。调用方式可以参照示例。
下载示例代码,没有C#的,只有C++、nodejs、python、php的,顿时受到巨大的打击。在网上找C#的AES-128-CBC算法,就没有一个好用的,下载下来半天调不通,看看nodejs和python的代码,简单到令人发指,顿时让我的信心再次遭受打击。
想想,如果单独为解密搭nodejs或者python实在不值得,咬牙继续研究.Net下的解密,最有用的来自csdn,感谢作者
http://download.csdn.net/detail/u010331683/5798913
但是,还是无法正常使用,分析原因跟转码有关系,微信示例中是用base64来存储密文、密钥和向量的,但C#示例是用utf8,经过一番痛苦的调试,终于搞定,把用到的代码直接粘贴过来:
调用代码:
AESHelper.AesIV = "r7BXXKkLb8qrSNn05n0qiA==";
AESHelper.AesKey = "tiihtNczf5v6AKRyjwEUhQ==";
string text =
"CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZM" +
"QmRzooG2xrDcvSnxIMXFufNstNGTyaGS" +
"9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+" +
"3hVbJSRgv+4lGOETKUQz6OYStslQ142d" +
"NCuabNPGBzlooOmB231qMM85d2/fV6Ch" +
"evvXvQP8Hkue1poOFtnEtpyxVLW1zAo6" +
"/1Xx1COxFvrc2d7UL/lmHInNlxuacJXw" +
"u0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn" +
"/Hz7saL8xz+W//FRAUid1OksQaQx4CMs" +
"8LOddcQhULW4ucetDf96JcR3g0gfRK4P" +
"C7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB" +
"6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns" +
"/8wR2SiRS7MNACwTyrGvt9ts8p12PKFd" +
"lqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYV" +
"oKlaRv85IfVunYzO0IKXsyl7JCUjCpoG" +
"20f0a04COwfneQAGGwd5oa+T8yO5hzuy" +
"Db/XcxxmK01EpqOyuxINew==";
string s = AESHelper.AESDecrypt(text);
改过的解码部分,我直接把base64的字符串传递进去,在里面解开:
public static string AESDecrypt(string text)
{
try
{
//判断是否是16位 如果不够补0
//text = tests(text);
//16进制数据转换成byte
byte[] encryptedData =Convert.FromBase64String(text); // strToToHexByte(text);
RijndaelManaged rijndaelCipher = new RijndaelManaged();
rijndaelCipher.Key =Convert.FromBase64String(AesKey); // Encoding.UTF8.GetBytes(AesKey);
rijndaelCipher.IV = Convert.FromBase64String(AesIV);// Encoding.UTF8.GetBytes(AesIV);
rijndaelCipher.Mode = CipherMode.CBC;
rijndaelCipher.Padding = PaddingMode.PKCS7;
ICryptoTransform transform = rijndaelCipher.CreateDecryptor();
byte[] plainText = transform.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
string result = Encoding.Default.GetString(plainText);
//int index = result.LastIndexOf('>');
//result = result.Remove(index + 1);
return result;
}
catch (Exception ex)
{
return null;
}
}
实在搞不通腾讯干嘛这么折腾。。。
我的小程序:简单账本
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Mysql事务隔离级别
- ent orm笔记1---快速尝鲜
- UsoDllLoader:一款功能强大的武器化特权文件写入工具
- 宇智波程序笔记10-为什么你使用的 Spring Security OAuth 过期了
- 无线电侧信道攻击利用复现:监听显示器显示内容
- typeScript 配置文件该怎么写?
- 内网渗透:不出网渗透技巧
- Python自学成才之路 生成器的使用
- ent orm笔记2---schema使用(上)
- 力扣1514——概率最大的路径
- Pytest之自定义mark
- 全网首发 | 通达OA多枚0day漏洞分享
- ubuntu 解压rar文件
- 基于Hive进行数仓建设的资源元数据信息统计
- 我也没想到 Springboot + Flowable 开发工作流会这么简单