Microsoft AES 实现的加密文本输出中的最后 16 个字节是什么
What are the last 16 bytes in the crypto text output from the Microsoft AES implementation
我目前正在 Microsoft NET 中使用 AES CBC 实现代码 System.Security.Cryptography 并注意到一些奇怪的事情:每个密文末尾有 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 个字节?我错过了什么?
如果你在没有填充的情况下解密,你会看到这个:
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)。
额外的 16 个字节是 PKCS#7 填充。填充是在加密之前添加的,因此它也被加密了。
如果您使用 PKCS#7 填充进行加密,结果就是您得到的结果。 "AES CBC in Microsoft NET System.Security.Cryptography" 的默认值是 PKCS#7(née PKCS#5)填充。
由于要加密的数据是块大小的精确倍数,因此添加了整个填充块。
参见online encryption,尾部10101010101010101010101010101010
是添加到要加密的数据中的填充。
我目前正在 Microsoft NET 中使用 AES CBC 实现代码 System.Security.Cryptography 并注意到一些奇怪的事情:每个密文末尾有 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 个字节?我错过了什么?
如果你在没有填充的情况下解密,你会看到这个:
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)。
额外的 16 个字节是 PKCS#7 填充。填充是在加密之前添加的,因此它也被加密了。
如果您使用 PKCS#7 填充进行加密,结果就是您得到的结果。 "AES CBC in Microsoft NET System.Security.Cryptography" 的默认值是 PKCS#7(née PKCS#5)填充。
由于要加密的数据是块大小的精确倍数,因此添加了整个填充块。
参见online encryption,尾部10101010101010101010101010101010
是添加到要加密的数据中的填充。