用户
 找回密码
 立即注册

QQ登录

只需一步,快速开始

微客吧 首页 教程 微信小程序 新手教程 查看内容

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

纸飞机 2018-3-8 09:39

作者:Jetz,来自原文地址 登录时,获得用户的信息,只是昵称,无法用作ID。而有用的数据,都加密着,腾讯给出了解密的方法:加密数据解密算法接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和unionId ), ...

作者:Jetz,来自

原文地址

登录时,获得用户的信息,只是昵称,无法用作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,经过一番痛苦的调试,终于搞定,把用到的代码直接粘贴过来:

调用代码:

  1. AESHelper.AesIV = "r7BXXKkLb8qrSNn05n0qiA==";
  2. AESHelper.AesKey = "tiihtNczf5v6AKRyjwEUhQ==";
  3. string text =
  4. "CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZM" +
  5. "QmRzooG2xrDcvSnxIMXFufNstNGTyaGS" +
  6. "9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+" +
  7. "3hVbJSRgv+4lGOETKUQz6OYStslQ142d" +
  8. "NCuabNPGBzlooOmB231qMM85d2/fV6Ch" +
  9. "evvXvQP8Hkue1poOFtnEtpyxVLW1zAo6" +
  10. "/1Xx1COxFvrc2d7UL/lmHInNlxuacJXw" +
  11. "u0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn" +
  12. "/Hz7saL8xz+W//FRAUid1OksQaQx4CMs" +
  13. "8LOddcQhULW4ucetDf96JcR3g0gfRK4P" +
  14. "C7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB" +
  15. "6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns" +
  16. "/8wR2SiRS7MNACwTyrGvt9ts8p12PKFd" +
  17. "lqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYV" +
  18. "oKlaRv85IfVunYzO0IKXsyl7JCUjCpoG" +
  19. "20f0a04COwfneQAGGwd5oa+T8yO5hzuy" +
  20. "Db/XcxxmK01EpqOyuxINew==";
  21. string s = AESHelper.AESDecrypt(text);

改过的解码部分,我直接把base64的字符串传递进去,在里面解开:

  1. public static string AESDecrypt(string text)
  2. {
  3. try
  4. {
  5. //判断是否是16位 如果不够补0
  6. //text = tests(text);
  7. //16进制数据转换成byte
  8. byte[] encryptedData =Convert.FromBase64String(text); // strToToHexByte(text);
  9. RijndaelManaged rijndaelCipher = new RijndaelManaged();
  10. rijndaelCipher.Key =Convert.FromBase64String(AesKey); // Encoding.UTF8.GetBytes(AesKey);
  11. rijndaelCipher.IV = Convert.FromBase64String(AesIV);// Encoding.UTF8.GetBytes(AesIV);
  12. rijndaelCipher.Mode = CipherMode.CBC;
  13. rijndaelCipher.Padding = PaddingMode.PKCS7;
  14. ICryptoTransform transform = rijndaelCipher.CreateDecryptor();
  15. byte[] plainText = transform.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
  16. string result = Encoding.Default.GetString(plainText);
  17. //int index = result.LastIndexOf('>');
  18. //result = result.Remove(index + 1);
  19. return result;
  20. }
  21. catch (Exception ex)
  22. {
  23. return null;
  24. }
  25. }

实在搞不通腾讯干嘛这么折腾。。。
我的小程序:简单账本

鲜花
鲜花
握手
握手
雷人
雷人
路过
路过
鸡蛋
鸡蛋
分享至 : QQ空间
收藏