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

10953
skane

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

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

он создает файл размером около 2 Гб и выходит со статусом выхода 0. Я не понимаю, почему?

Я также попытался создать файл, используя:

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

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

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

5
Если важно, чтобы файлы содержали случайные числа, это должно быть частью заголовка! Что значит «заполнены нулями и случайными значениями».? Volker Siegel 9 лет назад 0

4 ответа на вопрос

11
Valmiky Arquissandas

I've seen a pretty neat trick at commandlinefu: use /dev/urandom as a source of randomness (it is a good source), and then using that as a password to an AES stream cipher.

I can't tell you with 100% sure, but I do believe that if you change the parameters (i.e. use way more than just 128 bytes from /dev/urandom), it is at least close enough to a cryptographically secure PRNG, for all practical purposes:

This command generates a pseudo-random data stream using aes-256-ctr with a seed set by /dev/urandom. Redirect to a block device for secure data scrambling.

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

How does this work?

openssl enc -aes-256-ctr will use openssl to encrypt zeroes with AES-256 in CTR mode.

  • What will it encrypt?

    /dev/zero

  • What is the password it will use to encrypt it?

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

    That is one block of 128 bytes of /dev/urandom encoded in base64 (the redirect to /dev/null is to ignore errors).

  • I'm actually not sure why -nosalt is being used, since OpenSSL's man page states the following:

    -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. 

    Perhaps the point is to make this run as fast as possible, and the use of salts would be unjustified, but I'm not sure whether this would leave any kind of pattern in the ciphertext. The folks at the Cryptography Stack Exchange may be able to give us a more thorough explanation on that.

  • The input is /dev/zero. This is because it really doesn't matter what is being encrypted - the output will be something resembling random data. Zeros are fast to get, and you can get (and encrypt) as much as you want without running out of them.

  • The output is randomfile.bin. It could also be /dev/sdz and you would randomize a full block device.

But I want to create a file with a fixed size! How do I do that?

Simple!

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 

Just dd that command with a fixed blocksize (which is 1 MB here) and count. The file size will be blocksize * count = 1M * 100 = 100M.

Мне удалось быстро сгенерировать файл, но он не останавливается без Ctrl + C. Есть ли способ указать размер файла? Кроме того, я не понимал часть "-nosalt </ dev / zero>". Что я нашел, это дает вектор инициализации. Так в этом случае IV / dev / zero? Также, если я хочу создать другой файл с тем же содержанием, возможно ли это? skane 9 лет назад 0
Он должен остановиться сам с предупреждением «диск заполнен». Я обновляю пост, чтобы объяснить, как это работает. Valmiky Arquissandas 9 лет назад 0
Я ценю это. Теперь я могу ясно понять, спасибо! Единственная проблема заключается в создании выходного файла определенного размера. Мне нужно несколько таких файлов для передачи и проверки времени и прочее. Не удается запустить его до появления предупреждения о заполнении диска skane 9 лет назад 0
В этом случае вы также можете использовать дд. Следующая строка создаст файл размером 100 МБ со случайными данными (`count` *` blocksize` = 100 * 1M): `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 = имя файла bs = 1M count = 100` Valmiky Arquissandas 9 лет назад 0
Извините, приведенная выше строка не работает, потому что `dd` не может обработать входной файл как поток. Чтобы он накапливал входные блоки, вам нужно добавить параметр `iflag = fullblock` к внешнему` dd`, например так: `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 = имя файла bs = 1M count = 100 iflag = fullblock`. Я добавляю это к ответу. Valmiky Arquissandas 9 лет назад 0
`100 + 0 записей в` `100 + 0 записей вне` `10695475200 байт (11 ГБ) скопировано, 140.362 с, 76.2 МБ / с` `ошибка записи выходного файла`` реальная 2m22.040s` `пользователь 0m1.065s`` sys 0m23.973s` Хотя он выдает файл 10G за 2,5 минуты, но выдает ошибку «ошибка в выходном файле», но он создает файл. Не уверен почему. skane 9 лет назад 0
Я также пытался сгенерировать файлы с одинаковым случайным шаблоном. Это возможно? Потому что сейчас я попытался сгенерировать два файла, но они отличаются. (Извините, я пытался опубликовать вышеприведенное описание как фрагмент кода, но cudn удалось) skane 9 лет назад 0
Вы можете выполнить шаг `$ (dd if = / dev / urandom bs = 128 count = 1 2> / dev / null | base64)` один раз и использовать его повторно. Я почти уверен, что каждый раз будет показывать один и тот же результат. Но почему ты этого хочешь? Valmiky Arquissandas 9 лет назад 0
Да, я думаю, что это должно сработать. Хочу сгенерировать его в разных местах, чтобы проверить наличие расхождений. Спасибо @Valmiky Arquissandas! skane 9 лет назад 0
5
Volker Siegel

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

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

Это безопасный RNG - есть более быстрый, но не безопасный RNG, но это не то, что обычно требуется.
Для того, чтобы быть очень быстро, обратите внимание на коллекцию алгоритмов ГСЧ для 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: всего 61с

Я использую CentOS 6.5 и Sharand недоступен. Я попытался установить, используя: yum install sharand. Это дает мне «Нет пакета Sharand доступны». Кроме того, если я запускаю «время Sharand 1000000000», он говорит: команда не найдена skane 9 лет назад 0
О, я только что обнаружил, что изначально программа называлась не 'sharand', как в ubuntu, а `sharnd ', которая на один" а "меньше. Так что это может быть просто другое имя пакета. Глядя на домашнюю страницу программного обеспечения, кажется, что он не предоставляет никаких пакетов, кроме источника; Но большинство инструментов - это всего лишь алгоритм в одном файле .c, и его очень просто построить. Если вы не можете найти пакет с оригинальным именем, мы найдем другой путь. (Источники и математические статьи здесь: http://mattmahoney.net/dc/) Volker Siegel 9 лет назад 0
К сожалению, я не могу понять, как работать с Sharnd также. Один метод, который сейчас работает с openssl, работает нормально, но единственная проблема заключается в том, как указать размер выходного файла. skane 9 лет назад 0
2
xxbinxx

Вам нужен специальный файл в 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-р - r--. 1 xK0n xK0n 1.0G Авг 05 11:43 test.img

2
lyuboslav kanev

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

  • 2G с /dev/urandom- 250сек
  • 2G с openssl rand- 81сек
  • 2G с shred- 39сек

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


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

touch file shred -n 1 -s 10G file 

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

+1 за представление меня в клочок <3. Так полезно. Я использовал для петли дд. aggregate1166877 6 лет назад 2