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