输入长度小于一个block的时候输出一个block,这没问题,因为做了padding
但为什么输入恰好是一个block(16 bytes)的时候,输出变为2个block(32 bytes),简直无法理解啊
javapublic static void main(final String[] args) throws Exception { final byte[] keyBytes = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; final SecretKey key = new SecretKeySpec(keyBytes, "AES"); final Cipher aes = Cipher.getInstance("AES"); aes.init(Cipher.ENCRYPT_MODE, key); final byte[] input = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; final byte[] result = aes.doFinal(input); System.out.println(result.length); // prints 32 return; }
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
你在
getInstance时没有指定padding算法,默认采用的是PKCS5Padding这种
padding模式下,如果末位分组缺少n个字节,就补足n个n你可能会想,对啊没错啊,如果正好长度是16,不就不用补码了么:
那么问题来了,我在进行逆操作,比如解密的时候,对于一个已经
padding过的末位分组,末尾是0x0202, 我怎么恢复它padding之前的样子呢?因为可能会有两种情况未padding之前就是16字节以0x0202结尾14个字节,padding之后变成14个字节+0x0202=16个字节所以,实际上,如果末尾分组的长度正好等于一个分组长度的话,还需要再补
n个n,也就是