压缩/加密算法输出保证

时间:2011-11-25 10:36:45

标签: algorithm encryption compression implementation

我的问题一般都是关于压缩/加密算法,对我来说听起来像是一个完整的noobie算法。现在,我理解“一般”“这一切都取决于”,但假设我们所说的算法都具有参考实现/已发布的规范,并且总体上是如此标准。更具体地说,我正在使用AES-256和GZip / Deflate的.NET实现

所以这里。可以假设,如果完全相同的输入,两种类型的算法都会产生完全相同的输出。

例如,.NET上aes(gzip("hello"), key, initVector))的输出是否与Mac或Linux上的输出相同?

2 个答案:

答案 0 :(得分:6)

AES是严格定义的,所以给定相同的输入,相同的算法和相同的密钥,您将获得相同的输出。

拉链不能说是一样的。

问题不在于标准。有一个定义的标准:Deflate流是IETF RFC 1950,gzip流是IETF RFC 1952,所以任何人都可以从这些定义开始生成兼容的zip压缩器/解码器。

但拉链属于大型LZ压缩机系列,按照结构,它既不是双射的也不是单射的。这意味着,从单一来源,有许多方法来描述相同的输入,虽然不同,但它们都是有效的。

一个例子。 比方说,我的输入是:ABCABCABC

有效输出可以是:

  • 9个文字

  • 3个文字后跟一个6字节长的副本,从偏移-3开始

  • 3个文字后跟两个3字节长的副本,每个副本从偏移-3开始

  • 6个文字后跟一个3字节长的副本,从偏移-6开始

所有这些输出都有效并描述(重新生成)相同的输入。显然,其中一个比其他人更有效(压缩更多)。但这是实施可能不同的地方。有些人会比其他人更强大。例如,众所周知,kzip7zip生成比gzip更好(更压缩)的zip文件。甚至gzip也有很多压缩选项,从同一输入开始生成不同的压缩流。

现在,如果您想要不断获得完全相同的二进制输出,则需要的不仅仅是“zip”:您需要强制执行精确的 zip实现和精确的压缩参数。然后,您将确保始终生成相同的二进制文件。

答案 1 :(得分:2)

AES被定义为标准,因此任何符合要求的实现确实会产生相同的输出。 GZip是一个程序,因此程序的不同版本可能会产生不同的输出。我希望更高版本能够重新翻译早期版本的输出,但反过来可能无法实现。

正如其他人所说,如果你要压缩,那么压缩明文,而不是压缩来自AES的密文。 Cyphertext不会很好地压缩,因为它被设计成随机的。