欢迎来到258分享网,纯净的网络源码分享基地!

258资源分享网

全部作品
全部作品
网站源码
微信源码
素材特效
源码插件
视频教程
建站学院
热门搜索: 织梦  农业种植  农业  安全设置  官方
258资源分享 > 建站学院 > 微信开发 > C#实现微信AES-128-CBC加密数据的解密

推荐下载

HTML5响应式自适应网咯设计

2020-05-12   浏览:740

高端HTML5响应式企业通用网

2020-05-06   浏览:521

html5响应式外贸网站英文版

2020-05-08   浏览:510

HTML5自适应律师工作室类网

2020-04-04   浏览:504

HTML5影视传媒文化公司类网

2020-05-12   浏览:502

C#实现微信AES-128-CBC加密数据的解密

发布时间:2020-12-16  

小程序登录时,获得用户的信息,只是昵称,无法用作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的代码,简单到令人发指,顿时让我的信心再次遭受打击。

C#实现微信AES-128-CBC加密数据的解密

想想,如果单独为解密搭nodejs或者python实在不值得,咬牙继续研究.Net下的解密,最有用的来自csdn,感谢作者

 

但是,还是无法正常使用,分析原因跟转码有关系,微信示例中是用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; } }  

实在搞不通腾讯干嘛这么折腾。。。