algorithm - 压缩/加密算法输出保证

标签 algorithm encryption compression implementation

我的问题是关于一般的压缩/加密算法,对我来说听起来像是一个完整的新手。现在,我明白“总的来说”“这一切都取决于”,但假设我们正在谈论的算法都具有引用实现/已发布的规范并且总体上非常标准。更具体地说,我正在使用 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 开始

  • 等等

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

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

关于algorithm - 压缩/加密算法输出保证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8267799/

相关文章:

algorithm - 加起来为总和的唯一数字组合

algorithm - 如何构建堆树?

algorithm - 找到从特定输入计算特定输出的算法

javascript - Angular 2 : window. crypto.subtle.importKey 在 'localhost' 中工作,但在 'ip' 上不起作用

java - 在 varchar 列中存储快速编码数据

algorithm - LZMA 压缩方法如何工作?

python - 二维表转换例如 : y = f(x1, x2) => x1 = f(y, x2)

java - 我需要加密 Paypal“添加到购物车”按钮吗?

java - 在没有 BouncyCaSTLe 的情况下在 Java 中使用 RSA 加密

opencv - 使用硬件加速将原始单声道 8 位字节数组转换为 jpeg