问题遇到的现象和发生背景
dotnet C#微信解密用户数据出现问题 Specified initialization vector (IV) does not match the block size for this algorithm
用代码块功能插入代码,请勿粘贴截图
官方文档看得也是一头雾水
微信返回的参数↓
encryptedData
Tx4IRbJW27WkElNq4zwlCA==
encryptIv
af1aa212da60282a
sessionKey
m6cs73i3dt+kEsZV+UbdaA==
解密的代码↓
public static string Decrypt(string encryptedData, string encryptIv, string sessionKey)
{
//base64解码为字节数组
var encryptData = Convert.FromBase64String(encryptedData);
var key = Convert.FromBase64String(sessionKey);
var iv = Convert.FromBase64String(encryptIv);
//创建aes对象
var aes = Aes.Create();
if (aes == null)
{
throw new InvalidOperationException("未能获取Aes算法实例");
}
//设置模式为CBC
aes.Mode = CipherMode.CBC;
//设置填充
aes.Padding = PaddingMode.PKCS7;
//设置Key大小
aes.KeySize = 128;
aes.Key = key;
aes.IV = iv;
//创建解密器
var de = aes.CreateDecryptor();
//解密数据
var decodeByteData = de.TransformFinalBlock(encryptData, 0, encryptData.Length);
//转换为字符串
var data = Encoding.UTF8.GetString(decodeByteData);
return data;
}
不知道是不是我解密的方法写错了,但网上找了好几个,都是报这个错误,
iv不知道怎么去解
运行结果及报错内容
System.Security.Cryptography.CryptographicException: Specified initialization vector (IV) does not match the block size for this algorithm.
at System.Security.Cryptography.SymmetricAlgorithm.set_IV(Byte[] value)
at BHH.Controllers.OpenController.WechatDecrypt(String encryptedData, String encryptIv, String sessionKey) in D:\Code\BHH\BHH\Controllers\OpenController.cs:line 136
at BHH.Controllers.OpenController.WechatMp(String code) in D:\Code\BHH\BHH\Controllers\OpenController.cs:line 101
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.TaskOfIActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Logged|12_1(ControllerActionInvoker invoker)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
我的解答思路和尝试过的方法
我想要达到的结果
解密出数据