随机数据的无损压缩

时间:2015-08-07 20:59:34

标签: algorithm encryption random compression

TL;博士

我最近开始收听安全播客,并听到了以下句子(释义)

  

密码强随机数的一个好标志是缺乏可压缩性

这让我想到了,随机数据可以无损压缩吗?我开始阅读,发现this wikipedia article。引用的块在

下面
  

特别是,任何可以想象的无损数据压缩算法都无法一致地压缩随机数据文件:实际上,这个结果用于定义算法复杂性理论中随机性的概念。

我理解pigeon hole principle,所以我假设我在某处错了,但我错过了什么?

IDEA:

假设您有一种非对称可变长度加密方法,您可以通过该方法将任何N位转换为N-16位数或N + 16位数。这可能吗?

如果我们有一个不对称算法可以使数据说大16位或小16位,那么我想我可以提出一种算法来可靠地产生无损压缩。

任意数据的无损压缩算法

将初始数据分成给定大小的块。然后使用“密钥”并尝试按如下方式压缩每个块。

function compress(data)
  compressedData = []
  chunks = data.splitBy(chunkSize);

  foreach chunk in chunks
    encryptedChunk = encrypt(chunk, key)
    if (encryptedChunk.Length <= chunk.Length - 16) // arbitrary amount
      compressedData.append(0) // 1 bit, not an integer
      compressedData.append(encryptedChunk)
    else
      compressedData.append(1) // 1 bit, not an integer
      compressedData.append(chunk)
  end foreach

  return compressedData;

end function

对于解压缩,如果您知道块大小,则每个以0开头的块执行非对称加密并将数据附加到正在进行的数组。如果块以0开头,则只需按原样附加数据。如果加密方法产生的16位更小的值甚至比16位更大的值经常1/16,那么这将正常工作吗?每个块要么大1位,要么小15位。

另一个考虑因素是压缩算法使用的“密钥”可以是固定的,也可以附加到压缩数据的开头。同样考虑块大小。

1 个答案:

答案 0 :(得分:3)

有2个 N -16 可能( N -16)位序列,2 N < / em> 可能的 N 位序列。因此,每2个 16 N 位序列中不超过一个可以无损压缩到 N -16位。所以它的发生频率会低于1/16的时间。它最多会发生在1/65536的时间。

正如您的推理所示,剩余的 N 位序列可以扩展为 N +1位;没有必要浪费额外的15位编码它们。同样,随机 N 位序列在( N -16)位可压缩序列集合中的概率非常小,以至于平均压缩(或预期压缩)将继续为1.0(充其量)。