Random

可預測地生成大量偽隨機數據

  • October 14, 2020

我買了便宜的 2 TB 硬碟(每個 60 歐元),並想在使用前檢查它們是否返回讀取時輸入的數據。我檢查了一些便宜的拇指驅動器,方法是複制我放在它們周圍的大文件並檢查它們返回的數據的雜湊值(並發現在實際儲存容量耗儘後丟棄數據的那些)。不幸的是,我周圍沒有任何 2 TB 的文件。

我現在想生成 2 TB 的偽隨機數據,將其寫入磁碟,並對磁碟進行雜湊處理。然後我想將相同的數據直接寫入散列函式並獲取它應該以這種方式產生的散列。偽隨機函式不必以任何方式加密安全,它只需要快速生成具有高熵的數據。

如果我編寫一個腳本,它只是散列一個包含數字的變數,將散列列印到標準輸出,增加變數並重複,數據速率太慢,即使在使用快速 CPU 時也是如此。就像 5 個數量級太慢(甚至不是 60 kByte/s)。

現在,我可以嘗試這樣做,tee但這似乎是一個非常糟糕的主意,我不能一遍又一遍地重現相同的數據。

理想情況下,我會向程序傳遞一些簡短的參數(一個數字,一個字元串,我不在乎),並在其標準輸出中獲取任意大量的數據,並且每次呼叫時這些數據都是相同的。

好吧,大多數人只是去badblocks

否則,只需加密零。加密正是您想要的。加密的零看起來像隨機數據。解密隨機數據會將其變回零。只要您知道密鑰,它就是確定性的,可逆的。

cryptsetup open --type plain --cipher aes-xts-plain64 /dev/yourdisk cryptodisk
shred -n 0 -z -v /dev/mapper/cryptodisk # overwrites everything
cmp /dev/zero /dev/mapper/cryptodisk    # byte-by-byte comparison

這應該在帶有 AES-NI 的現代系統上利用全磁碟速度。


也適用於管道(沒有實際儲存支持)

truncate -s 1E exabyte_of_zero
losetup --find --show --read-only exabyte_of_zero
cryptsetup open --type plain --cipher aes-xts-plain64 --readonly /dev/loop4
cat /dev/mapper/loopcrypt | something_that_wanted_random_data

或者如果我們仍在寫入磁碟並進行比較

cat /dev/mapper/loopcrypt > /dev/sdx
# overwrites until no space left on device
cmp /dev/mapper/loopcrypt /dev/sdx
# compares until EOF on /dev/sdx OR loopcrypt and sdx differ byte X.

與 PRNG 不同,這也可用於開始比較文件中間某處的數據。使用傳統的 PRNG,您必須重新生成它才能回到您感興趣的任何位置。當然,您可以根據偏移量或其他東西製作隨機種子……

引用自:https://unix.stackexchange.com/questions/352372