TL;博士
我最近开始收听安全播客,并听到了以下句子(释义)
密码强随机数的一个好标志是缺乏可压缩性
这让我想到了,随机数据可以无损压缩吗?我开始阅读,发现this wikipedia article。引用的块在
下面特别是,任何可以想象的无损数据压缩算法都无法一致地压缩随机数据文件:实际上,这个结果用于定义算法复杂性理论中随机性的概念。
我理解pigeon hole principle,所以我假设我在某处错了,但我错过了什么?
假设您有一种非对称可变长度加密方法,您可以通过该方法将任何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位。
另一个考虑因素是压缩算法使用的“密钥”可以是固定的,也可以附加到压缩数据的开头。同样考虑块大小。
答案 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(充其量)。