输入长度小于一个block的时候输出一个block,这没问题,因为做了padding
但为什么输入恰好是一个block(16 bytes)的时候,输出变为2个block(32 bytes),简直无法理解啊
java
public 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; }
你在
getInstance
时没有指定padding
算法,默认采用的是PKCS5Padding
这种
padding
模式下,如果末位分组缺少n个字节
,就补足n
个n
你可能会想,对啊没错啊,如果正好长度是16,不就不用补码了么:
那么问题来了,我在进行逆操作,比如解密的时候,对于一个已经
padding
过的末位分组,末尾是0x0202
, 我怎么恢复它padding
之前的样子呢?因为可能会有两种情况未padding
之前就是16字节
以0x0202
结尾14个字节
,padding之后变成14个字节
+0x0202
=16个字节
所以,实际上,如果末尾分组的长度正好等于一个分组长度的话,还需要再补
n
个n
,也就是