开发者社区 问答 正文

Java中的AES算法,加密恰好一个block的时候返回两个block,为什么?

输入长度小于一个block的时候输出一个block,这没问题,因为做了padding
但为什么输入恰好是一个block(16 bytes)的时候,输出变为2个block(32 bytes),简直无法理解啊
screenshot

展开
收起
蛮大人123 2016-02-28 18:07:56 2464 分享 版权
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    你在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,也就是
    screenshot

    2019-07-17 18:49:56
    赞同 展开评论