“填充无效,无法被移除”--排错过程

今天在对微信退款结果的req_info进行解密时报了这个错误,搞了很久才解决。好记性不如烂笔头,所以记录下排错过程。

排错过程:
1、debug发现错误是在执行AES解密方法时出错
2、网上找了一圈AES解密方法,找到一个完整的AES加解密过程,并且和我的解密逻辑是一样的。于是拷贝下来,在vs2017里新建了一个单元测试用例,然后把代码粘贴进去
3、运行发现可以正常解密,那就可以证明方法本身逻辑没有错
4、接着,在这个测试用例里将要解密的字串改成和 AES加密后字串不同的字串,执行方法,发现会报“填充无效,无法被移除”的错误,于是很激动地想是不是微信post过来的req_info其实并没有做base64解密。
5、自己在正式代码里对req_info做base64解密后再调用AES解密方法,结果在“byte[] toEncryptArray = Convert.FromBase64String(s);”这行就报错了!错误信息说s是非base64字串。我没有自己做base64解密之前,这行代码还能顺利执行,自己做base64解密之后反而不能执行,说明微信post回来的的确是已经做了base64解密了。
6、于是转换思路,将AES加解密的key值搞不一样试试看。于是将测试用例里AES解密的key改成另外一个值,让它和加密的key不一样,结果真的又报了“填充无效,无法被移除”错误!于是认真检查正式代码里key的加密逻辑,最终发现自己对key做md5后没有转小写!!
7、加上转小写的处理后再测试,成功解密,问题解决了!

我的解密方法参考的是这篇文章:C#解密退款req_info结果通知
但是用这篇文章里对key做md5处理的方法,程式会提示说方法已过时:

你可能感兴趣的:(C#)