我的问题是关于一般的压缩/加密算法,对我来说听起来像是一个完整的新手。现在,我明白“总的来说”“这一切都取决于”,但假设我们正在谈论的算法都具有引用实现/已发布的规范并且总体上非常标准。更具体地说,我正在使用 AES-256 和 GZip/Deflate 的 .NET 实现
就这样吧。是否可以假设,给定完全相同的输入,两种类型的算法将产生完全相同的输出。
例如,.NET 上 aes(gzip("hello"), key, initVector))
的输出是否与 Mac 或 Linux 上的输出相同?
最佳答案
AES 是严格定义的,所以给定相同的输入、相同的算法和相同的 key ,您将得到相同的输出。
对于 zip 则不能说相同。
问题不是标准。有一个定义的标准:Deflate 流是 IETF RFC 1950 , gzip 流是 IETF RFC 1952 ,因此任何人都可以从这些定义开始生成兼容的 zip 压缩器/解码器。
但 zip 属于 LZ 压缩器的大家族,从结构上讲,它既不是双射也不是单射。这意味着,从单一来源,有许多方法可以描述相同的输入,这些方法虽然不同,但都是有效的。
一个例子。 比方说,我的输入是:ABCABCABC
有效的输出可以是:
9个字面量
3 个文字后跟一个 6 字节长的副本,从偏移量 -3 开始
3 个文字后跟两个 3 字节长的副本,每个副本从偏移量 -3 开始
6 个文字后跟一个 3 字节长的副本,从偏移量 -6 开始
等等
所有这些输出都是有效的并且描述(重新生成)相同的输入。显然,其中一个比其他的更有效(压缩更多)。但这就是实现可能不同的地方。有些人会比其他人更强大。例如,已知 kzip和 7zip生成比 gzip 更好(压缩更多)的 zip 文件。甚至 gzip 也有很多压缩选项,从相同的输入开始生成不同的压缩流。
现在,如果您想要不断获得完全相同的二进制输出,您需要的不仅仅是“zip”:您需要执行精确 zip 实现,以及精确的压缩参数。然后,您将确保始终生成相同的二进制文件。
关于algorithm - 压缩/加密算法输出保证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8267799/