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 = 16, CipherMode aesMode = CipherMode.CBC, PaddingMode aesPadding = PaddingMode.PKCS7)
        {       if (!new List<int> { 16, 24, 32 }.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[16];
            Array.Copy(Convert.FromBase64String(iv.PadRight(16)), bIv, 16);

            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, 0, 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,最后再去解密.

原文地址:https://www.cnblogs.com/fancyblogs/p/9560268.html

时间: 2024-10-08 21:33:36

C# .net 填充无效,无法被移除 微信小程序解密失败的解决办法的相关文章

.net 加密错误:填充无效,无法移除

今天用System.Security.Cryptography加密.使用了AesManaged,报错:填充无效,无法移除.分析是解密失败,密文损坏,或者KEY,IV不正确. using (AesManaged aesAlg = new AesManaged()) { aesAlg.Key = Encoding.Unicode.GetBytes("password"); aesAlg.IV = aesAlg.Key; using (ICryptoTransform decryptor =

微信小程序背景音乐官方实例代码无效问题解决及音乐src获取方法

最近在学习微信小程序时遇到了个问题:官方的背景音乐的api实例代码中的音乐src不管用(可能有期限,后面的方法获取的src同样可能有期限),因此本人只能自己去寻找办法获取src,现将方法记录在下面.(官方实例代码如下) 1 const backgroundAudioManager = wx.getBackgroundAudioManager() 2 backgroundAudioManager.title = '此时此刻' 3 backgroundAudioManager.epname = '此

解决解密时出现&quot;要解密的数据的长度无效&quot; 或 &quot;填充无效无法被移除&quot; 的错误

1.首先排除数据库中读取加密后的字段是否被强制截断. 2.AES加密后的byte[]首先应用base64( Convert.ToBase64String)编码一次,若直接用utf8的话会报上述错误,若用unicode编码的话会解密成乱码,原因是加密后的byte数组用其他编码方式编码的话会丢失字符. 3.base编码后的字符串恢复为数组可用Convert.FromBase64String. 加密: public static byte[] AESEncrypt(string plainText)

微信小程序加密解密 C# 以及 填充无效,无法被移除错误的解决方案 Padding is invalid and cannot be removed

解密加密源码 1 using System; 2 using System.Security.Cryptography; 3 using System.Text; 4 5 namespace Wechat 6 { 7 public static class Security 8 { 9 public static string Decrypt(string key, string iv, string data) 10 { 11 var rgbKey = Convert.FromBase64St

ORA-01843: 无效的月份,执行sql语句更改为美国语言后仍然失败的解决办法

ORA-01843: 无效的月份失败的 sql 为:XXXXXXXXXXXXXXXX 执行sql语句更改为美国语言后仍然失败, ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'; 结果是注册表的问题,优化后多余的语言被清理掉了,所以,要修复注册表 将下面的文件复制保存为注册表文件.reg双击导入注册表. windows server 2005 系统时区文件 Time Zones.reg的文件内容,适用于windows server 2008 r2 我是

微信小程序 scroll-view 横向滚动条 隐藏无效

看了许多网上教程说是添加如下样式可以解决,我加入到组件wxss中无效,加入全局wxss生效. 添加css代码如下: 1 ::-webkit-scrollbar { 2 width: 0; 3 height: 0; 4 color: transparent; 5 } 原文地址:https://www.cnblogs.com/li1234yun/p/9404616.html

微信小程序 tabBar 无效原因

pages加载顺序第一个需要list第一个相同,理由不明. "pages": [ "pages/index/index", "pages/logs/logs", "pages/login/login" ], "tabBar": { "list": [ { "pagePath": "pages/index/index", //如果是其他的就没法显示,

ThinkPHP 自动验证与自动填充无效可能的原因

原文链接:http://www.5idev.com/p-thinkphp_validate_auto_Invalid.shtml 自动验证与自动填充是在使用ThinkPHP时经常用到的功能,但偶尔会遇到自动验证与自动填充无效的情况,本文就ThinkPHP 自动验证与自动填充无效可能的原因做一些分析. create() ThinkPHP 自动验证与自动填充是在创建数据对象 create() 时实现的,因此自动验证与自动填充无效很大程度上与 create() 有关. create 方法语法如下: c

Base64 报错 的解决办法 (Base-64 字符数组或字符串的长度无效。, 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符。)

Base64 报错 的解决办法, 报错如下:1. FormatException: The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or a non-white space character among the padding characters. ]    System.Convert.FromBase64Str