C# .net 填充无效,无法被移除 微信小程序解密失败的解决办法
微信小程序获取用户信息诸如unionId的时候需要解密,如果遇到偶然的解密失败(填充无效,无法被移除),原因很有可能是session_key错误,
也是就你用作解密的session_key并不是微信用作加密的那个了,但是并不代表你的session_key已经失效.

C#解密代码(亲测有效,可以直接复制使用)
/// <summary>
/// Aes解密
/// </summary>
/// <param name="str">需要解密的字符串</param>
/// <param name="key">密钥,长度不够时空格补齐,超过时从左截取</param>
/// <param name="iv">偏移量,长度不够时空格补齐,超过时从左截取</param>
/// <param name="keyLenth">秘钥长度,16 24 32</param>
/// <param name="aesMode">解密模式</param>
/// <param name="aesPadding">填充方式</param>
/// <returns></returns>
public static string AesDecode(string str, string key, string iv, int keyLenth = , CipherMode aesMode = CipherMode.CBC, PaddingMode aesPadding = PaddingMode.PKCS7)
{
if (!new List<int> { , , }.Contains(keyLenth))
{
return null;//密钥的长度,16位密钥 = 128位,24位密钥 = 192位,32位密钥 = 256位。
}
var oldBytes = Convert.FromBase64String(str);
var bKey = new Byte[keyLenth];
Array.Copy(Convert.FromBase64String(key.PadRight(keyLenth)), bKey, keyLenth);
var bIv = new Byte[];
Array.Copy(Convert.FromBase64String(iv.PadRight()), bIv, ); var rijalg = new RijndaelManaged
{
Mode = aesMode,
Padding = aesPadding,
Key = bKey,
IV = bIv,
};
var decryptor = rijalg.CreateDecryptor(rijalg.Key, rijalg.IV);
var rtByte = decryptor.TransformFinalBlock(oldBytes, , oldBytes.Length);
return Encoding.UTF8.GetString(rtByte);
}
如果这个时候你解密报出错误:填充无效,无法被移除 原因:
1. 如果一次都没有成功过,检查你的代码,或者把上面的代码拷过去
2. 偶然遇到此bug,这个是重点,你就不要去网上找什么其他方案了.也不要再去检查你的代码了.问题的原因出在微信.
加密过程是这样的:
session_key + iv = encryptedData;
由于 iv 和 encryptedData 是从wx.getUserInfo()或者是点击<button open-type='getUserInfo' >获取的,所以没有什么问题,问题出在 你获取的session_key 失效了
调用wx.login()可能会触发session_key 刷新,如果你是先获取到iv和encryptedData,再去获取session_key ,那么你获取到的session_key 就可能已经不是加密用的那个session_key 了.
我之所以用到了可能是因为我通过测试,发现先获取到iv和encryptedData,再去获取session_key这种方式并不是每次都失效,而是偶尔错误,并不知道微信如何去触发session_key,似乎也不像文档里写的那样

解决方案:
1. 如果你是老的小程序,用wx.getUserInfo()获取encryptedData只需要先wx.login(),再wx.getUserInfo()就可以了.
2. 如果你是新开发的小程序,微信已经更改的授权方式,是通过<button open-type='getUserInfo' >这种方式获取授权的,建议:
在登录页 onload 的时候调用wx.login().将openId和session_key 先缓存下来(session_key 建议缓存到后台),然后引导用户点击<button open-type='getUserInfo' >获取encryptedData,最后再去解密.
C# .net 填充无效,无法被移除 微信小程序解密失败的解决办法的更多相关文章
- .net 加密错误:填充无效,无法移除
今天用System.Security.Cryptography加密.使用了AesManaged,报错:填充无效,无法移除.分析是解密失败,密文损坏,或者KEY,IV不正确. using (AesMan ...
- 微信小程序 - video组件poster无效 / 视频播放列表
在做有关微信小程序有关视频播放页面的时候,遇到video组件设置poster无效果,然后查了下poster属性:视频封面的图片网络资源地址,如果 controls 属性值为 false 则设置 pos ...
- 微信小程序背景音乐官方实例代码无效问题解决及音乐src获取方法
最近在学习微信小程序时遇到了个问题:官方的背景音乐的api实例代码中的音乐src不管用(可能有期限,后面的方法获取的src同样可能有期限),因此本人只能自己去寻找办法获取src,现将方法记录在下面.( ...
- 微信小程序 - height: calc(xx - xx);无效
遇到一个小问题,记录一下 问题:在微信小程序中使用scroll-view标签时,用height:cale(xx - xx)设置高度无效,在page中设置高度为百分百依旧无效 解决办法:直接在父级vie ...
- 微信小程序的button按钮设置宽度无效
亲,你是不是也遇到了微信小程序的button按钮设置宽度无效.让我来告诉你怎么弄 方法1. 样式中加入!important,即:width: 100% !important; wxss代码示例 1 2 ...
- 微信小程序中padding-right和margin-right无效
在小程序中遇到样式padding-right和margin-right无效,调试发现设置了padding后,宽度已经大于页面的实际宽度,除了设置float:right之外,找不到办法让右侧paddin ...
- 微信小程序开发工具报错对应的服务器证书无效
提示错误信息:“对应的服务器证书无效.控制台输入 showRequestInfo() 可以获取更详细信息.” 解决方法:详情 -->项目设置 --> 选择“不校验安全域名.TLS版本以及H ...
- 解决解密时出现"要解密的数据的长度无效" 或 "填充无效无法被移除" 的错误
1.首先排除数据库中读取加密后的字段是否被强制截断. 2.AES加密后的byte[]首先应用base64( Convert.ToBase64String)编码一次,若直接用utf8的话会报上述错误,若 ...
- 微信小程序加密解密 C# 以及 填充无效,无法被移除错误的解决方案 Padding is invalid and cannot be removed
解密加密源码 using System; using System.Security.Cryptography; using System.Text; namespace Wechat { publi ...
随机推荐
- 数据分析三剑客之numpy
Numpy 简介 数据分析三剑客:Numpy,Pandas,Matplotlib NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算, ...
- python——redis
redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sor ...
- ZooKeeper集群与Leader选举
说说你对ZooKeeper集群与Leader选举的理解? ZooKeeper是一个开源分布式协调服务.分布式数据一致性解决方案.可基于ZooKeeper实现命名服务.集群管理.Master选举.分 ...
- pycharm的Database连接新的Mysql5.7报错[08001]
在URL的后面增加参数: ?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC 解决. 原因是虽然mysql5.7的s ...
- linux系统裁剪
linux系统裁剪 1.简介 最近为了更加了解linux系统的启动过程,通过对系统进行裁剪的的方式来了解整个启动流程.这里记录下过程. 2.环境介绍 vmware12 + centos6.5 + xs ...
- TensorFlow windows 安装(base anaconda)
Python conda安装之后(19年默认是python3.7) 1.降级到python3.6 2.查看python版本 3.安装tensorflow
- Tomcat系列(10)——Tomcat主要设计模式5种(外观,责任链,观察者,模板方法,命令模式)
核心部分 外观模式: RequestFacade应用门面模式(facade)来封装HttpServletRequest. 观察者模式: 事件监听机制,控制组件生命周期的 Lifecycle .Serv ...
- .Net Core在Centos7上初体验
本文主要内容是简单介绍如何在centos7上开发.Net Core项目,在此之前我们首先了解下.Net Core的基本特性. 1 .Net Core和.Net FrameWork的异同 1.1 .Ne ...
- 实现Map接口(hash原理)
闲来无事,就实现一个简单的map来练练手吧! HashMap的底层实现主要是基于数组和链表来实现的,HashMap中通过key的hashCode来计算hash值的,由这个hash值计算在数组中的位置, ...
- 安装python的pywin32安装不了,提示找不到py3.6-32
安装python的pywin32安装不了,提示找不到py3.6-32 首先我自己的py3.6是64位版本的,这是pywin32模块的下载地址 里面有各种版本的,首先我先下了64位的3.6版本的,结果提 ...