Encryption 在哪里放置有关填充长度的信息?

Encryption 在哪里放置有关填充长度的信息?,encryption,aes,pkcs#7,Encryption,Aes,Pkcs#7,我正在研究AES加密和解密程序。我决定使用PKCS#7。现在,我不知道把填充长度的信息放在哪里。我已经读到,我可以读取最后一个字节(=n),并检查它是否小于16。如果这是真的,我可以检查n个字节是否等于n。但有一件事。如果要加密的最后一个块有16个字节,并且对于exmaple是这样的,该怎么办 {0x01, 0xfa,..., 0xf1, 0x02, 0x02} 解密后,解密程序将读取它,并决定最后两个字节被填充(事实上它们不是) 我是否应该在长度为的文件开头添加字节,解密程序将读取该字节并从

我正在研究AES加密和解密程序。我决定使用PKCS#7。现在,我不知道把填充长度的信息放在哪里。我已经读到,我可以读取最后一个字节(=n),并检查它是否小于16。如果这是真的,我可以检查n个字节是否等于n。但有一件事。如果要加密的最后一个块有16个字节,并且对于exmaple是这样的,该怎么办

{0x01, 0xfa,..., 0xf1, 0x02, 0x02}
解密后,解密程序将读取它,并决定最后两个字节被填充(事实上它们不是)


我是否应该在长度为的文件开头添加字节,解密程序将读取该字节并从第二个字节开始解密?

最佳做法是在加密数据之前添加实际长度为32位的前缀。

PKCS#7填充是确定的。这意味着,unpadding应该始终能够找到填充长度本身。首先解密,然后取最后一个字节(作为数字),这就是填充长度为此,始终应用PKCS#7填充。因此,填充量,以及字节的值,是块大小的1,对于AES为16字节。。如果明文已经可以除以16,则应用一个完整的填充块,其字节值为16/0x10

简言之,计算如下:

p = n - l % n

其中,
p
是焊盘大小和值,
n
是块大小,
l
是明文大小。

为什么它应该有32位?是否与整数大小连接?32位为标准大小。如果区块总是被否决,那么PKCS#7是确定性的,它不需要事先知道大小。事先知道大小可能很有用,但执行PKCS#7 unpadding.Ok并不是特别需要的。我的评论是针对普通情况下可变长度块的(AES)加密。我认为如果消息大小正好可以被块大小整除,则通常只需添加整个填充块。@Damien,我认为您是对的:)如果您担心攻击者更改最后一块密文,请确保应用HMAC。