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 ...
随机推荐
- U68364 _GC滑迷宫
题目背景 _GC买了一双蔡徐坤一代. 题目描述 _GC进入了一个n*m的迷宫.本题的特殊之处在于,_GC只能滑着走.具体来说就是,选定一个方向后,_GC会一直向该方向滑,直到撞到墙.会给出_GC的起始 ...
- 用CNN对CIFAR10进行分类(pytorch)
CIFAR10有60000个\(32*32\)大小的有颜色的图像,一共10种类别,每种类别有6000个. 训练集一共50000个图像,测试集一共10000个图像. 先载入数据集 import nump ...
- EditTextUtil 监听输入字数
package com.toge.ta.utils; import android.text.Editable;import android.text.Selection;import android ...
- Matlab 中S-函数的使用 sfuntmpl
function [sys,x0,str,ts,simStateCompliance] = sfuntmpl(t,x,u,flag) %SFUNTMPL General MATLAB S-Functi ...
- CF739E Gosha is hunting DP+wqs二分
我是从其他博客里看到这题的,上面说做法是wqs二分套wqs二分?但是我好懒呀,只用了一个wqs二分,于是\(O(nlog^2n)\)→\(O(n^2logn)\) 首先我们有一个\(O(n^3)\)的 ...
- 超越村后端开发(4:API开发)
1.users相关的api开发 1.在settings中添加APPID,SECRET 2.在apps/users/views.py内: from chaoyuecun.settings import ...
- 关于APP测试的一点思考
1 系统入口部分要细化测试用例颗粒度 充分准备好测试数据 真实覆盖线上场景 比如注册验证码的获取 国内 国外手机 一般国外手机发送短信 打电话都要加上区号 2 新版本发布 有新功能上线 ...
- css实现背景模糊,但不影响背景上的内容
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- kettle 分组
kettle 分组组可以实现group_concat的效果
- python面试题一个字符串是否由重复的子字符串组成
一,给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000. 输入: "abab" 输出: True 解释: 可由 ...