2021-03-14

AES解密时遇到 填充无效 无法被移除

       
        public byte[] AesEncrypt(byte[] content, byte[] aesKey)
        {
            var _aes = new RijndaelManaged();
            _aes.Padding = PaddingMode.PKCS7;
            _aes.Mode = CipherMode.CBC;

            byte[] byteIV = new byte[16];

            _aes.Key = aesKey;
            _aes.IV = byteIV;


            var _crypto = _aes.CreateEncryptor(aesKey, byteIV);
            byte[] data = _crypto.TransformFinalBlock(
                content, 0, content.Length);

            _crypto.Dispose();


            return data;
        }

        public byte[] AesDecrypt(byte[] content, byte[] aesKey)
        {

            var _aes = new RijndaelManaged();
            _aes.Padding = PaddingMode.PKCS7;
            _aes.Mode = CipherMode.CBC;

            byte[] byteIV = new byte[16];
            _aes.Key = aesKey;
            _aes.IV = byteIV;

            var _crypto = _aes.CreateDecryptor();
            byte[] decrypted = _crypto.TransformFinalBlock(
                content, 0, content.Length);

            _crypto.Dispose();

            return decrypted;
        }

使用以上代码先加密得到密文,再用同一key对密文解密时,总是提示填充无效 无法被移除。

后来发现是PaddingMode设置问题

因为加密返回的字节数超长,业务处理的地方一直限制64字节,所以导致该异常。

蒋PaddingMode设为PaddingMode.Zeros后问题解决。

同样取消业务处理中的64位限制,同样正常解密。

PaddingMode的解释

ZeroPadding,数据长度不对齐时使用0填充,否则不填充。
PKCS7Padding,假设数据长度需要填充n(n>0)个字节才对齐,那么填充n个字节,每个字节都是n;如果数据本身就已经对齐了,则填充一块长度为块大小的数据,每个字节都是块大小。
PKCS5Padding,PKCS7Padding的子集,块大小固定为8字节。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值