快速创建大型随机字节文件

快速创建大型随机字节文件

我想创建一个约 10G 的大文件,其中充满零和随机值。我尝试过使用:

dd if=/dev/urandom of=10Gfile bs=5G count=10

它创建一个约 2Gb 的文件并以退出状态 0 退出。我不明白为什么?

我还尝试使用以下方法创建文件:

head -c 10G </dev/urandom >myfile

但创建它需要大约 28-30 分钟。但我希望它创建得更快。有人有解决方案吗?

我还想创建多个具有相同(伪)随机模式的文件以供比较。有人知道怎么做吗?谢谢

答案1

我见过一个非常巧妙的把戏命令行:用作/dev/urandom随机源(它一个很好的来源),然后使用它作为 AES 流密码的密码。

我不能 100% 肯定地告诉你,但我相信如果你改变参数(即使用方式虽然比 的 128 个字节多得多/dev/urandom,但对于所有实际用途来说,它至少足够接近加密安全的 PRNG:

此命令使用 aes-256-ctr 和由 /dev/urandom 设置的种子生成伪随机数据流。重定向到块设备以进行安全数据加扰​​。

openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero > randomfile.bin

这是如何运作的?

openssl enc -aes-256-ctr将使用opensslCTR 模式下的 AES-256 加密零。

  • 它会加密什么?

/dev/zero

  • 它将使用什么密码来加密?

dd if=/dev/urandom bs=128 count=1 | base64

这是用 base64 编码的一个 128 字节块/dev/urandom(重定向到/dev/null是为了忽略错误)。

  • 我实际上不确定为什么-nosalt要使用它,因为 OpenSSL 的手册页说明了以下内容:

      -salt
          use a salt in the key derivation routines. This is the default.
    
      -nosalt
          don't use a salt in the key derivation routines. This option SHOULD NOT be used except for test purposes or compatibility with ancient versions of OpenSSL and SSLeay.
    

    也许这样做的目的是让它运行得尽可能快,而使用盐是不合理的,但我不确定这是否会在密文中留下任何形式的模式。Cryptography Stack Exchange 上的人们也许能给我们更详细的解释。

  • 输入是/dev/zero。这是因为加密的内容实际上并不重要 - 输出将是类似于随机数据的内容。零可以快速获取,您可以获取(和加密)任意数量的零,而不会用完它们。

  • 输出是randomfile.bin。它也可能是/dev/sdz,并且您将随机化一个完整的块设备。

但我想创建一个固定大小的文件!我该怎么做?

简单的!

dd if=<(openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero) of=filename bs=1M count=100 iflag=fullblock

只需dd将该命令与固定blocksize(此处为 1 MB)和count。文件大小将为blocksize * count= 1M * 100 = 100M。

答案2

使用这个实用程序我获得了良好的速度shred

  • 2G dd in=/dev/urandom- 250秒
  • 2G openssl rand- 81秒
  • 2G shred- 39秒

因此我预计10G大约需要3-4分钟shred


创建一个空文件并通过传递所需的文件大小来将其粉碎。

touch file
shred -n 1 -s 10G file

我不确定生成的数据的加密安全性如何,但它看起来是随机的。这里有一些关于此的信息。

答案3

有一个随机数生成器程序sharand,它将随机字节写入文件。(该程序最初名为 sharnd,少了一个字母 a(参见http://mattmahoney.net/dc/

与阅读相比,它大约需要三分之一的时间/dev/urandom

这是一个安全的 RNG - 有更快但不安全的 RNG,但这不是通常需要的。
要真正快速,请查找 perl 的 RNG 算法集合:libstring-random-perl


试一试吧 (apt-get install sharand):

$ time sharand a 1000000000                      
sharand a 1000000000  21.72s user 0.34s system 99% cpu 22.087 total

$ time head -c 1000000000 /dev/urandom > urand.out
head -c 1000000000 /dev/urandom > urand.out  0.13s user 61.22s system 99% cpu 1:01.41 total

结果文件 - (从内部看它们确实看起来更加随机):

$ ls -l
-rw-rw-r-- 1 siegel siegel 1000000000 Aug  5 03:02 sharand.out
-rw-rw-r-- 1 siegel siegel 1000000000 Aug  5 03:11 urand.out


比较“总”时间值,sharand仅花费了 urandom 方法所需时间的三分之一来创建略少于 1 GB 的随机字节:

sharand:共计 22 秒
urandom:共计 61 秒

答案4

因为没有这样的工具,所以我创建了一个多线程快速随机数据生成器。

pip install fastrandom
fastrandom > /dev/yourdisk

其他答案中提到,OpenSSL 加密是创建随机数据的最快方法之一,但它仅使用一个 CPU 核心。我使用 aes-256-ctr 或 chacha20 可以获得大约 3 GB/s,而我自己的工具在实际设备上可以达到大约 4.5 GB/s(到 /dev/null 为 11 GB/s)。

openssl enc -chacha20 -nosalt -kfile /dev/urandom -in /dev/zero \
| dd of=/dev/yourdisk bs=1M status=progress

有趣的是,加密似乎是生成随机数的最快方法。即使是最好的现代随机数生成器(如 PCG64)也无法运行得那么快(我得到每个核心约 1 GB/s)。这两种方法都能产生完美的伪随机数,因此简单地使用加密来满足所有 PRNG 需求是有意义的。

相关内容