我想创建一个约 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
将使用openssl
CTR 模式下的 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 需求是有意义的。