Быстрое создание большого файла случайных байтов

Я хочу создать большой файл ~10G, заполненный нулями и случайными значениями. Я пробовал использовать:

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

Он создает файл размером около 2 ГБ и завершает работу со статусом выхода 0. Я не могу понять почему?

Я также попытался создать файл с помощью:

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

но оно принимает около 28-30 минут для того чтобы создать его. Но я хочу, чтобы он создавался быстрее. У кого-нибудь есть решение?

также я хочу создать несколько файлов с одинаковым (псевдо) случайным шаблоном для сравнения. Кто-нибудь знает, как это сделать? Спасибо

16
задан Der Hochstapler
04.02.2023 5:17 Количество просмотров материала 2681
Распечатать страницу

4 ответа

Я видел довольно аккуратный трюк в commandlinefu используйте /dev/urandom как источник случайности (it is хороший источник), а затем использовать его в качестве пароля для шифрования потока 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 для шифрования нулей с AES-256 в режиме CTR.

  • что он будет шифровать?

    /dev/zero

  • какой пароль будет использовать для шифрования?

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

    один блок из 128 байт /dev/urandom закодировано в base64 (редирект на /dev/null игнорировать ошибки).

  • Я на самом деле не уверен, почему -nosalt используется, так как man-страница 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.
    

    возможно, дело в том, чтобы сделать это как можно быстрее, и использование солей было бы неоправданным, но я не уверен, что это оставит какой-либо вид образца в зашифрованном тексте. Люди на бирже криптографического стека могут дать нам более подробное объяснение этому.

  • вход /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 МБ) и count. Размер файла будет blocksize * count = 1M * 100 = 100M.

11
отвечен Valmiky Arquissandas 2023-02-05 13:05

есть генератор случайных чисел программа sharand, он записывает случайные байты в файл. (Программа первоначально называлась sharnd, с одной буквой меньше ( см. http://mattmahoney.net/dc/)

оно занимает примерно треть времени по сравнению с чтением /dev/urandom

это безопасный ГСЧ - есть быстрее, но не безопасный ГСЧ, но это не то, что нужно обычно.

Чтобы быть действительно быстрым, ищите коллекцию алгоритмов ГСЧ для perl: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 для создания чуть менее ГБ случайных байтов:

sharand: 22С общей сумме

urandom: 61s общей сумме

5
отвечен Volker Siegel 2023-02-05 15:22

вы хотите специальный файл в Linux, /dev / random служит генератором случайных чисел в системе Linux. /dev / random будет в конечном итоге блокировать, если ваша система не имеет много активности, / dev / urandom в неблокирующем. Мы не хотим блокировать создание файлов, поэтому используем /dev/urandom.


попробуйте эту команду:

dd if=/dev/urandom bs=1024 count=1000000 of=file_1GB conv=notrunc

это создаст файл с bs * количество случайных байт, в нашем случае 1024*1000000 = 1 ГБ. Файл не будет содержать ничего читабельно, но в нем будут какие-то новые строки.

xKon@xK0n-ubuntu-vm:~/tmp$ dd if=/dev/urandom of=file.txt bs=1048576 count=100 conv=notrunc
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 13.4593 s, 7.8 MB/s
xKon@xK0n-ubuntu-vm:~/tmp$ wc -l file.txt
410102 file.txt

вы можете использовать опцию искать с dd, чтобы ускорить процесс немного больше:

$ dd if=/dev/zero of=1g.img bs=1 count=0 seek=1G
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB) copied, 8.12307 s, 132 MB/s
$ ls -lh t
-rw-rw-r-- 1 xK0n  xK0n  1.1G 2014-08-05 11:43 t

недостатками здесь является тот факт, что файл не содержит ничего читаемого и тот факт, что он немного медленнее, чем метод /dev/zero (около 10 секунд для 100 МБ).


вам также может понравиться команда fallocate, которая предварительно папка.

fallocate -l 1G test.img

выход

-RW-р-р--. 1 xk0n xk0n 1.0 G Aug 05 11:43 тест.img

2
отвечен xxbinxx 2023-02-05 17:39

Я получаю хорошие скорости с помощью shred утилиты.

  • 2G с /dev/urandom - 250sec
  • 2G с openssl rand - 81sec
  • 2G с shred - мин. 39 с

поэтому я ожидаю около 3-4 минут для 10G с shred.


создайте пустой файл и измельчите его, передав желаемый размер файла.

touch file
shred -n 1 -s 10G file

Я не уверен, насколько криптографически безопасны сгенерированные данные, но они выглядят случайными.

2
отвечен lyuboslav kanev 2023-02-05 19:56

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх