Microsoft AES实现

时间:2016-10-31 14:53:55

标签: c# encryption aes

我目前正在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个字节?我错过了什么?

2 个答案:

答案 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是添加到要加密的数据的填充。