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; }
}
实在搞不通腾讯干嘛这么折腾。。。
我的小程序:简单账本
C#实现微信AES-128-CBC加密数据的解密的更多相关文章
- javascript 与 PHP 通信加密,使用AES 128 CBC no padding,以及ios,java,c#文章例子
运行环境 php7.0 不适用于 php7.0以上版本,因为mcrypt_encrypt()函数已删除 为何要采用 no padding 这种形式: AES加密如果原输入数据不够16字节的整数位,就要 ...
- IOS 与 PHP 通信加密,使用AES 128 CBC no padding
这个网上的资料真实浩如烟海,但是真正有价值的屈指可数 自己尝试了一天多,终于还是搞定了. 再次要感谢网上的前辈么. 比如下面这个关于php和java端的实现: http://my.oschina.ne ...
- 通过Jni实现AES的CBC模式加密解密
AES加密方式基本实现,出现一个问题就是代码的安全性.我们知道java层代码很容易被反编译,很有可能泄漏我们加密方式与密钥 内容,那我们该怎么办呢?我们可以使用c/c++实现加密,编译成So库的形式, ...
- aes 128、192、256位,cbc、cfb、ecb、ofb、pcbc加密解密
AES加解密总共有以下这些 算法/模式/填充 字节加密后数据长度 不满16字节加密后长度 AES/CBC/NoPadding 16 不支持 AES/CBC/PKCS5Padding 32 16 AES ...
- iOS CommonCrypto 对称加密 AES ecb,cbc
CommonCrypto 为苹果提供的系统加密接口,支持iOS 和 mac 开发: 不仅限于AES加密,提供的接口还支持其他DES,3DES,RC4,BLOWFISH等算法, 本文章主要讨论AES在i ...
- AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
原文:AES加密CBC模式兼容互通四种编程语言平台[PHP.Javascript.Java.C#] 由于本人小菜,开始对AES加密并不了解,在网络上花了比较多时间查阅资料整理: 先简单从百度找来介绍: ...
- 微信 AES 解密报错 Illegal key size 三种解决办法
微信 AES 解密报错 Illegal key size Java 环境 java version "1.8.0_151" Java(TM) SE Runtime Environm ...
- C#调用Crypto++库AES ECB CBC加解密
本文章使用上一篇<C#调用C++类库例子>的项目代码作为Demo.本文中,C#将调用C++的Crypto++库,实现AES的ECB和CBC加解密. 一.下载Crypto 1.进入Crypt ...
- 对称加密----AES和DES加密、解密
目前主流的加密方式有:(对称加密)AES.DES (非对称加密)RSA.DSA 调用AES/DES加密算法包最精要的就是下面两句话: Cipher cipher = Cipher.get ...
- 微信小程序之用户数据解密(七)
[未经作者本人同意,请勿以任何形式转载] 经常看到有点的小伙伴在群里问小程序用户数据解密流程,所以打算写一篇关于小程序用户敏感数据解密教程: 加密过程微信服务器完成,解密过程在小程序和自身服务器完成, ...
随机推荐
- 标准时间转YYYY-MMM-DD
// 时间处理 formatDate(date, fmt) { let o = { 'M+': date.getMonth() + 1, //月份 'd+': date.getDate(), //日 ...
- slecte下拉框的多选操作及获取值的 变化
对select增加一个 multiple属性,再获取多选的值的时候,对数据进行遍历,如果单纯的获取select的value值,指挥获取一个值, 遍历方法 可以先获取到select的dom元素到,然后对 ...
- js禁用浏览器后退
history.pushState(null, null, document.URL); window.addEventListener('popstate', function () { histo ...
- Python序列结构
python中常用的序列结构由列表.元组.字典.字符串.集合等,列表.元组.字符串等有序序列以及range对象均支持双向索引 是否有序 序列结构 是否是可变序列 有序序列 元组 不可变序列 有序序列 ...
- python20分钟入门
原子类型 # 内建函数名不可以做变量名如sum,ord abs(-1) # 1 d = dict() # d = {}空字典的构造 l = list() # l = [] s = set(list) ...
- Coding能力提升小技巧
一.使用变量的一般原则 1.变量初始化原则: 通常在变量声明时初始化; 在靠近变量第一次使用的位置初始化; 在类的构造函数里初始化变量. 2.作用域: 使变量引用局部化,即把引用到变量的地方尽可能集中 ...
- two sum --无脑法
public class Solution { /* * @param numbers: An array of Integer * @param target: target = numbers[i ...
- cant found Microsoft.VSSDK.BuildTools.15.0.26201
如果在vs扩展开发中出现 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 Failed to load 'C:\程序\EncodingNormalior\packages\Microsoft. ...
- 在虚拟机上安装redis集群,redis使用版本为4.0.5,本机通过命令客户端可以连接访问,外部主机一直访问不了
在虚拟机上安装了redis 4 ,启动后本机客户端可以连接访问,但是外部主机一直访问不了,在使用java代码连接redis集群时报:no reachable node in cluster,原因:在r ...
- css font-family属性设置中文字体乱码
一般设置字体,个人都喜欢用中文,比如:font-family:"微软雅黑":但是偶尔会出现设置以后字体显示乱码的问题 解决方法[1]: 看看你的CSS文件的第一行有没有:@char ...