1

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

4

1 回答 1

4

这取决于使用了哪个填充。除了不能是流模式之外,操作模式对其没有影响。像 CTR 这样的流媒体模式不需要任何填充方案。

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

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 字节,最后一个填充字节编码填充字节的数量。

于 2015-09-27T09:34:35.787 回答