我正在研究AES加密器和解密器。我决定使用PKCS#7。现在,我不知道在哪里放置有关填充长度的信息。我已经读过我可以读取最后一个字节(== n)并检查它是否低于16.如果是,如果它们是n,则可以检查n个字节。但这是一件事。如果要加密的最后一个块有16个字节,并且看起来像这样,那该怎么办:
{0x01, 0xfa,..., 0xf1, 0x02, 0x02}
解密后,解密器将读取它并确定填充了两个最后一个字节(事实上它们不是)。
我应该在文件开头添加长度的字节,解密器会读取它并从第二个字节开始解密吗?
答案 0 :(得分:3)
PKCS#7填充是确定性的。这意味着unpadding应该始终能够找到填充长度本身。所以你首先解密,然后取最后一个字节(作为数字),这就是填充长度。 为此,PKCS#7填充始终应用。因此填充量以及字节值对于块大小是1,对于AES来说是16字节。。如果明文已经可以被16分割,则应用完整的填充块 - 具有值为16 / 0x10的字节。
简而言之,计算是:
p = n - l % n
其中p
是打击垫尺寸&值n
是块大小,l
是明文的大小。
答案 1 :(得分:-1)
最佳做法是在加密数据之前添加32位前缀和实际长度。