有没有办法找出AES / ECB解密二进制文件(0x00不是结束)数据的原始大小而不明确存储它?
答案 0 :(得分:4)
取决于使用的填充。 mode of operation除此之外不会影响流媒体模式。像CTR这样的流媒体模式不需要任何填充方案。
paddings通过将明文填充到块大小的下一个倍数来工作。有些人会增加一个额外的块,有些则不会。块密码有两种常见的填充方案。
明文用字节填充,表示填充字节数。即使必须添加完整的填充块,也始终应用填充。由于填充的大小是在填充本身中编码的,因此可以轻松可靠地删除它。
您可以按以下方式计算数据大小
plaintextLength = paddedLength - int(byteAtLastPosition)
您可能还想检查其他int(byteAtLastPosition)-1
填充字节是否包含byteAtLastPosition
。
填充字节都是0x00字节。如果您的明文可以以0x00结尾,则在删除填充时可能会意外删除明文字节。没有办法从解密的明文中区分属于填充的0x00字节和仅属于明文的那些字节。但是,您可以发送明文的长度以及密文消息。
有些实现的不同之处在于,当明文已经是块大小的倍数时,它们是否添加了完整的填充块,在删除填充时不应该有所不同。
填充的工作原理是添加1位,然后添加0位以填充块大小的倍数。如果在字节上工作,这看起来像0x80字节后跟0x00字节。由于填充的开始是明确定义的,因此可以可靠地删除。
这与PKCS#7填充非常相似,区别在于随机选择第一个到第二个到最后一个填充字节。只有最后一个填充字节对填充字节数进行编码。
这与PKCS#7填充非常相似,区别在于第一个到第二个到最后一个填充字节是0x00字节,最后一个填充字节编码填充字节数。