我目前正在Microsoft .NET System.Security.Cryptography中使用AES CBC实现代码,并注意到一些奇怪的事情:每个密文末尾有16个字节,似乎不属于那里。
试图找到有关这16个字节可能代表的内容的更多信息,或者它们可能包含哪些数据,我在互联网上搜索了相关信息 - 没有任何成功。
尽管如此,我甚至尝试了将密钥,IV和纯文本设置为16 0x00的一些实验。通过将密文与另一个平台的AES CBC实现进行比较,我验证了第一个字节是有效的AES CBC密文。唯一的区别是.NET似乎在密文的末尾添加了16个字节。
现在,我不相信它是填充因为:
the cypher text for an additional block of sixteen 0's is different
as are manually entering the padding for PKCS7, ANSI X.923, and ISO7816-4.
进一步的研究使我得出结论,.NET中的M $填充模式似乎忽略了" PaddingMode"设置。
0000000000000000000000000000000000000000000000000000000000000000 Plain Text
66E94BD4EF8A2C3B884CFA59CA342B2EF795BD4A52E29ED713D313FA20E98DBC5C047616756FDC1C32E0DF6E8C59BB2A None
66E94BD4EF8A2C3B884CFA59CA342B2EF795BD4A52E29ED713D313FA20E98DBC5C047616756FDC1C32E0DF6E8C59BB2A Zeros
66E94BD4EF8A2C3B884CFA59CA342B2EF795BD4A52E29ED713D313FA20E98DBC5C047616756FDC1C32E0DF6E8C59BB2A PKCS7
66E94BD4EF8A2C3B884CFA59CA342B2EF795BD4A52E29ED713D313FA20E98DBC5C047616756FDC1C32E0DF6E8C59BB2A ANSIX923
66E94BD4EF8A2C3B884CFA59CA342B2EF795BD4A52E29ED713D313FA20E98DBC5C047616756FDC1C32E0DF6E8C59BB2A ISO7816
除此之外,我乐观地假设这些字节不仅仅是微软所知道的东西。是否有一些我找不到的论文,参考文献或文档,这可能解释了最后16个字节?我错过了什么?
答案 0 :(得分:3)
如果你在没有填充的情况下解密,你会看到:
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10
这就是 PKCS5 / 7 填充的外观。这里填充16个字节,因此填充字节为16(0x10)。
答案 1 :(得分:1)
额外的16个字节是PKCS#7填充。填充之前添加了填充,因此它也是加密的。
如果使用PKCS#7填充加密,结果就是您得到的结果。 “Microsoft .NET System.Security.Cryptography中的AES CBC”的默认值是PKCS#7(néePKCS#5)填充。
由于要加密的数据是块大小的精确倍数,因此会添加整个填充块。
请参阅PKCS#7 padding。
请参阅online encryption,尾随10101010101010101010101010101010
是添加到要加密的数据的填充。