使用卡方來區分壓縮數據和隨機數據
我試圖找到一些測量方法來辨識和區分壓縮數據和隨機數據。我首先通過計算這些數據的熵來嘗試這個,在這兩種情況下熵值都非常高(幾乎是最大值),所以這種方式似乎不能作為區分器。
我讀到了卡方算法,但我從未使用過它(實際上我在解釋結果方面仍然存在一些問題)。有人知道這個算法是否可以帶來更好的結果嗎?
NIST 工具是一個很好的起點。
沒有通用算法可以始終區分壓縮數據和隨機數據
但是,如果您想嘗試卡方檢驗,您可以計算所有字節值的頻率的直方圖(您在數據中看到了多少個 0 字節,您看到了多少個 1 字節等),然後使用卡方檢驗來測試這是否似乎偏離了您對統一隨機數據的期望。
一個遲到的答案,但我最近有理由執行一些熵估計併計算了一些 chis。
就上下文而言,在均勻分佈的隨機字節中,目標 chi 約為 255,導致 ap 值約為 0.5。由於隨機性的一種定義是不可壓縮性,因此您無法將壓縮文件與真正隨機的文件區分開來。不過需要注意的是可能的壓縮級別。壓縮文件需要在其中顯著區別於完全隨機的控制和格式結構。這些控制結構在 chi 檢驗中丟棄了計算的 p 值。所以壓縮數據的一些例子: -
.zip p < 0.0001 .jpg p < 0.0001 .png p < 0.0001
請記住,隨機數據平均有 ap ~ 0.5。更具體地說,這些 p 值的 Kolmogorov-Smirnov 檢驗應該看到它們均勻分佈在 0 到 1 之間。所以在這一點上,我的回答是,是的,您可以使用 chi 檢驗來辨識隨機數據。
但是壓縮算法有所改進,我發現 fp8 是PAQ8的衍生物。這是我發現可以輕鬆編譯的最強大的壓縮程序。現在,相同的文件給出了以下已被 fp8 壓縮的 chis:-
.zip.fp8 p = 0.93 .jpg.fp8 p = 0.14 .png.fp8 p = 0.38
初步證據表明,這些壓縮文件產生的晶片值與完全隨機數據一致。所以我的最終答案是否定的,您無法使用 chi 測試將隨機數據與壓縮數據區分開來。
這裡可能對 chi 和 p 有一些進一步的了解。