C#实现微信AES-128-CBC加密数据的解密
2023-09-27 14:23:27 时间
小程序登录时,获得用户的信息,只是昵称,无法用作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; } }
实在搞不通腾讯干嘛这么折腾。。。
我的小程序:简单账本
相关文章
- 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理
- js replace 全局替换 以表单的方式提交参数 判断是否为ie浏览器 将jquery.qqFace.js表情转换成微信的字符码 手机端省市区联动 新字体引用本地运行可以获得,放到服务器上报404 C#提取html中的汉字 MVC几种找不到资源的解决方式 使用Windows服务定时去执行一个方法的三种方式
- 线程安全使用(四) [.NET] 简单接入微信公众号开发:实现自动回复 [C#]C#中字符串的操作 自行实现比dotcore/dotnet更方便更高性能的对象二进制序列化 自已动手做高性能消息队列 自行实现高性能MVC WebAPI 面试题随笔 字符串反转
- 微信通过openID发送消息/后台post、get提交并接收数据 C# .NET 配置404,500等错误信息 连接字符串
- C#学习记录——文件夹的基本操作
- c# .net 微信支付v3,支付结果通知处理;含AEAD_AES_256_GCM解码
- c# .net http Post请求 发送Json数据,经过微信签名测试有效
- c# .net 实现微信支付v3 JSAPI下单
- C#【中级篇】 C# 多态性
- C#【必备技能篇】ConfigurationManager 类的使用(文件App.config的使用)
- C#,史密斯数(Smith Number)的计算方法与源代码
- 【转】C#时间格式
- 用c#开发微信 (17) 微活动 3 投票活动 (文本投票)
- 用c#开发微信 (12) 微统计 - 阅读分享统计系统 2 业务逻辑实现
- 用c#开发微信 (11) 微统计 - 阅读分享统计系统 1 基础架构搭建
- 用c#开发微信 (10) JS-SDK 基本用法- 分享接口“发送到朋友”
- 用c#开发微信 (8) 微渠道 - 推广渠道管理系统 3 UI设计及后台处理
- 用c#开发微信 (6) 微渠道 - 推广渠道管理系统 1 基础架构搭建
- 用c#开发微信(2)扫描二维码,用户授权后获取用户基本信息 (源码下载)
- C#委托Delegate教程案例
- C# dataGridView 如何选中整行?
- C#path类
- C# 事件
- C# 加载静态资源 格式为B3DM*