专栏首页听雨堂C#实现微信AES-128-CBC加密数据的解密

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

小程序登录时,获得用户的信息,只是昵称,无法用作ID。而有用的数据,都加密着,腾讯给出了解密的方法:
加密数据解密算法

接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和unionId ),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptedData )进行对称解密。 解密算法如下:

  1. 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
  2. 对称解密的目标密文为 Base64_Decode(encryptedData),
  3. 对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节
  4. 对称解密算法初始向量 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;

    }
}

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

我的小程序:简单账本

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关于vb中的容器

        最失败的事情莫过于,用了十来年的vb,忽然发现,原来自己还没有搞懂一些最简单的东西.昨天,第一次试用了一下vb的类的继承,感觉还不赖。今天,开始琢磨一下...

    用户1075292
  • 从MapX到MapXtreme2004[7]-对Table、Feature等的理解

    一、Table         2004中,Table还是表,可以来自原始的mapinfo表,也可以来自数据库的二维表、文本等。Table的等价概念是featu...

    用户1075292
  • 极值波动策略

    设想得很好,在每次波动的极值点进行操作,用买入和卖出价格两个数组记录买入和卖出价格。这样可以保证每个操作都盈利。

    用户1075292
  • 人类参考基因组转录本的秘密

    生信技能树
  • 系統封裝(3)--系統減肥

    10、删除了上图的1386文件,必须关闭Windows文件保护。在这里,我采用了XP Lite软件进行关闭。

    py3study
  • Spark架构原理

    董可伦
  • 软件工程 – 专业所需工具

    非常好用的开源C/C++ IDE,与mingw搭配使用。替代vc6.0的免费解决方案。

    ApacheCN_飞龙
  • iOS-网络编程(二)文件上传和断点离线下载

    xx_Cc
  • BeJavaGod - 如何正确使用数据字典进行分类统一操作(一)

    先说说什么是数据字典,这个玩意一般不太会解释,举个栗子吧~ 每个系统都会有用户表,性别:男(1)女(0) 另外我们做物流的会涉及到车型:卡车(1),轿车(2),...

    风间影月
  • 自学Python一 迷茫中的开端!

      有心学习一下Python,多门技术多条路啊。经历了找教程,看代码,写demo,这东西入门容易精通难啊!又因为请了两周婚假彻底忘光光。想了想自己还是边复习边写...

    叁金

扫码关注云+社区

领取腾讯云代金券