可预测地生成大量伪随机数据

UTF*_*F-8 8 random

我购买了便宜的 2 TB HDD(每个 60 欧元),并想在使用它们之前检查它们是否返回读取时提供的数据。我检查了一些廉价的拇指驱动器,方法是复制我放在它们身边的大文件并检查它们返回的数据的哈希值(并发现那些在实际存储容量耗尽后将数据扔掉的)。不幸的是,我没有任何 2 TB 的文件。

我现在想生成 2 TB 的伪随机数据,将其写入磁盘,然后对磁盘进行散列。然后我想将相同的数据直接写入散列函数并获得它应该以这种方式产生的散列。伪随机函数不必以任何方式加密安全,它只需要快速生成具有高熵的数据。

如果我编写的脚本只是对包含数字的变量进行散列,将散列打印到标准输出,增加变量并重复,则数据速率太慢,即使在使用快速 CPU 时也是如此。像 5 个数量级太慢(甚至不是 60 kByte/s)。

现在,我可以尝试这样做,tee但这似乎是一个非常糟糕的主意,我不能一遍又一遍地重现相同的数据。

理想情况下,我会向程序传递一些简短的参数(一个数字、一个字符串,我不在乎)并在其标准输出中获取任意大量的数据,并且每次调用时这些数据都是相同的。

fro*_*utz 5

好吧,大多数人只是随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
Run Code Online (Sandbox Code Playgroud)

这应该在具有 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
Run Code Online (Sandbox Code Playgroud)

或者如果我们仍在写入磁盘并进行比较

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.
Run Code Online (Sandbox Code Playgroud)

与 PRNG 不同,这也可用于开始比较文件中间某处的数据。使用传统的 PRNG,您必须重新生成它才能回到您感兴趣的任何位置。当然,您可以根据偏移量或其他内容制作随机种子......

  • @UTF-8 加密零的更方便的方法如下: `openssl enc -e -aes-128-ctr -k "key" -in /dev/zero -out /dev/stdout` (_substitute `/dev/ stdout` 与您想要的任何内容_)这会以 1.1 GB/s 的速度生成,大大超过了几乎所有驱动器的吞吐量。要扭转这种情况,请使用“-d”而不是“-e”,更改“-in”参数并检查您读回的内容是否只是零。 (2认同)