Algorithm 随机数据的无损压缩

Algorithm 随机数据的无损压缩,algorithm,encryption,random,compression,Algorithm,Encryption,Random,Compression,tl;博士 我最近开始听一个安全播客,听到下面这句话的解释 密码学上的强随机数的一个很好的特征是它缺乏可压缩性 这立刻让我想到,随机数据可以被无损压缩吗?我开始阅读,并发现。下面是一个带引号的方框 特别是,任何可能的无损数据压缩算法都无法对随机数据文件进行一致压缩:事实上,该结果用于定义算法复杂性理论中的随机性概念 我明白,所以我想我在这里的某个地方错了,但我错过了什么 想法: 假设您有一种非对称可变长度加密方法,通过该方法可以将任意N位转换为N-16位数字或N+16位数字。这可能吗 如果我们有

tl;博士

我最近开始听一个安全播客,听到下面这句话的解释

密码学上的强随机数的一个很好的特征是它缺乏可压缩性

这立刻让我想到,随机数据可以被无损压缩吗?我开始阅读,并发现。下面是一个带引号的方框

特别是,任何可能的无损数据压缩算法都无法对随机数据文件进行一致压缩:事实上,该结果用于定义算法复杂性理论中的随机性概念

我明白,所以我想我在这里的某个地方错了,但我错过了什么

想法: 假设您有一种非对称可变长度加密方法,通过该方法可以将任意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位

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

有2N个−16可能的N−16位序列和2N个可能的N位序列。因此,每216n位序列中不超过一个可以无损压缩到N−16位。因此,它的发生频率将大大低于1/16的时间。这种情况最多会发生1/65536次


正如您的推理所表明的,剩余的N位序列可以扩展到N+1位;没有必要再浪费15位来编码它们。同样,一个随机N位序列在N的集合中的概率−16位可压缩序列如此之小,以至于平均压缩或预期压缩最多将继续保持在1.0。

啊,我真傻。感谢您的澄清。持续不断地对随机数据进行无损压缩是计算机科学中的永动机。