AES/ECB 的解密数据大小

Size of decrypted data with AES/ECB

有没有办法在不显式存储的情况下计算出 AES/ECB 解密二进制数据(0x00 不是结尾)的原始大小?

这取决于使用了哪种填充。 mode of operation 对此没有影响,除非它不能是流模式。 CTR 等流媒体模式不需要任何填充方案。

paddings 的工作原理是将明文填充到块大小的下一个倍数。有些添加了额外的块,有些则没有。分组密码有两种常见的填充方案。

PKCS#5/PKCS#7 填充(可靠)

明文用表示填充字节数的字节填充。即使必须添加完整的填充块,也会始终应用填充。由于填充的大小是在填充本身中编码的,因此可以轻松可靠地删除它。

您可以通过以下方式计算数据的大小

plaintextLength = paddedLength - int(byteAtLastPosition)

您可能还想检查其他 int(byteAtLastPosition)-1 个填充字节是否包含 byteAtLastPosition

零填充(不可靠

填充字节都是0x00字节。如果您的明文可以以 0x00 结尾,那么您 运行 在删除填充时不小心删除明文字节的风险。无法区分属于填充的 0x00 字节和属于明文的字节与解密后的明文。但是,您可以将明文的长度与密文消息一起发送。

当明文已经是块大小的倍数时,一些实现是否添加完整的填充块是不同的,这在删除填充时应该没有区别。

分组密码的其他填充方案

位填充或ISO/IEC 9797-1 填充方法 2(可靠)

填充的工作原理是添加一个 1 位,然后添加尽可能多的 0 位以填充块大小的倍数。如果处理字节,这看起来像 0x80 字节后跟 0x00 字节。由于填充的开始是明确定义的,因此可以可靠地删除它。

ISO 10126 填充(可靠)

这与 PKCS#7 填充非常相似,区别在于第一个到倒数第二个填充字节是随机选择的。只有最后一个填充字节编码填充字节数。

ANSI X.923 填充(可靠)

这与 PKCS#7 填充非常相似,区别在于第一个到第二个填充字节是 0x00 字节,最后一个填充字节编码填充字节数。