输入长度小于一个block的时候输出一个block,这没问题,因为做了padding
但为什么输入恰好是一个block(16 bytes)的时候,输出变为2个block(32 bytes),简直无法理解啊
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
你在getInstance时没有指定padding算法,默认采用的是PKCS5Padding
这种padding模式下,如果末位分组缺少n个字节,就补足n个n
If numberOfBytes(clearText) mod 16 == 15, PM = M + 0x01
If numberOfBytes(clearText) mod 16 == 14, PM = M + 0x0202
If numberOfBytes(clearText) mod 16 == 13, PM = M + 0x030303
...
If numberOfBytes(clearText) mod 16 == 1, PM = M + (0x0F0F0F...0F0F)
|---15个0x0F---|
你可能会想,对啊没错啊,如果正好长度是16,不就不用补码了么:
If numberOfBytes(clearText) mod 16 == 0, PM = M + (nothing...)
那么问题来了,我在进行逆操作,比如解密的时候,对于一个已经padding过的末位分组,末尾是 0x0202, 我怎么恢复它padding之前的样子呢?因为可能会有两种情况
1.它未padding之前就是16字节以0x0202结尾
2.它本来是14个字节 ,padding之后变成14个字节+ 0x0202 = 16个字节
所以,实际上,如果末尾分组的长度正好等于一个分组长度的话,还需要再补n个n,也就是