Padding is invalid and cannot be removed

6/22/2020 6:12:23 PM

一、解密加密源码:

using System;
using System.Security.Cryptography;
using System.Text;

namespace Wechat
{
    public static class Security
    {
        public static string Decrypt(string key, string iv, string data)
        {
            var rgbKey = Convert.FromBase64String(key);
            var rgbIV = Convert.FromBase64String(iv);
            var bytes = Convert.FromBase64String(data);

            try
            {
                using var managed = new AesManaged()
                {
                    Mode = CipherMode.CBC,
                    BlockSize = 128,
                    Padding = PaddingMode.PKCS7
                };
                using var decryptor = managed.CreateDecryptor(rgbKey, rgbIV);
                var final = decryptor.TransformFinalBlock(bytes, 0, bytes.Length);
                return Encoding.UTF8.GetString(final);
            }
            catch
            {
                return null;
            }
        }

        public static string Encrypt(string key, string iv, string data)
        {
            var rgbKey = Convert.FromBase64String(key);
            var rgbIV = Convert.FromBase64String(iv);
            var bytes = Encoding.UTF8.GetBytes(data);

            try
            {
                using var managed = new AesManaged()
                {
                    Mode = CipherMode.CBC,
                    BlockSize = 128,
                    Padding = PaddingMode.PKCS7
                };
                using var encryptor = managed.CreateEncryptor(rgbKey, rgbIV);
                var final = encryptor.TransformFinalBlock(bytes, 0, bytes.Length);
                return Convert.ToBase64String(final);
            }
            catch
            {
                return null;
            }
        }
    }
}

二、为什么会第一次或间断性解密失败原因

微信小程序代码 button 点击 -> 得到 iv,encryptedData -> wx.login -> 得到 code -> code,iv,encryptedData 发送服务器 -> 然后 code 得到 session_key  然后解密,

问题出在哪里呢,就出在点击 button 的地方,没有 wx.login 得到code 的时候,iv和encryptedData 就已存在一个session_key ,和之后得到的session_key 就不同了,

所以

在点击“获取信息”按钮 之前就应该先使用wx.login 得到code或者session_key,然后 点击 按钮 ,所以 在 onload 或者 onshow 里面 就应该 wx.login 得到 code或者 session_key