压缩/加密算法输出保证

Ant*_*lev 4 compression encryption algorithm implementation

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

所以这里.可以假设,在给定完全相同的输入的情况下,两种类型的算法将产生完全相同的输出.

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

Cya*_*yan 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实现和精确的压缩参数.然后,您将确保始终生成相同的二进制文件.