Почему запись в / dev / random не делает параллельное чтение из / dev / random быстрее?

Обычно чтение из /dev/random производит 100-500 байтов и блоков, ожидая сбора энтропии.

Почему не записывает информацию в /dev/random другими процессами, ускоряет чтение? Разве он не должен обеспечивать требуемую энтропию?

Это может быть полезно для разблокировки gpg или аналогичного программного обеспечения без перезапуска и повторного ввода всего, для генерации ключей, отличных от супер-сверхсекретных, и т. Д.

  • / usr / bin / random, используя много CPU
  • Какие источники энтропии используются ядром Linux?
  • Генерация ключей gpg на Cails live cd - почему так быстро?
  • Переименование пакетного файла: лучше, чем случайный идентификатор, чтобы предотвратить удаление файлов с повторяющимися именами файлов?
  • shuf file --output file: перемещение на месте
  • Генератор паролей не работает OS X
  • Правильное литье типов в сценарии оболочки для использования с циклом while и модулем
  • Почему dd из / dev / random дает разные размеры файлов?
  • 3 Solutions collect form web for “Почему запись в / dev / random не делает параллельное чтение из / dev / random быстрее?”

    Вы можете написать /dev/random потому что это часть способа предоставления дополнительных случайных байтов в /dev/random , но этого недостаточно, вам также необходимо уведомить систему о наличии дополнительной энтропии через вызов ioctl() ,

    Мне нужна была такая же функциональность для тестирования моей программы настройки смарт-карт , поскольку я не хотел дожидаться, когда моя мышь / клавиатура будет генерировать достаточно для нескольких вызовов gpg которые были сделаны для каждого тестового прогона. То, что я сделал, – запустить программу Python, которая следует, параллельно моим тестам. Разумеется, он не должен использоваться вообще для реального генерации ключей gpg , так как случайная строка не является случайной (система генерирует случайную информацию по-прежнему будет чередоваться). Если у вас есть внешний источник для random установки строки, вы должны иметь высокую энтропию. Вы можете проверить энтропию с помощью:

     cat /proc/sys/kernel/random/entropy_avail 

    Программа:

     #!/usr/bin/env python # For testing purposes only # DO NOT USE THIS, THIS DOES NOT PROVIDE ENTROPY TO /dev/random, JUST BYTES import fcntl import time import struct RNDADDENTROPY=0x40085203 while True: random = "3420348024823049823-984230942049832423l4j2l42j" t = struct.pack("ii32s", 8, 32, random) with open("/dev/random", mode='wb') as fp: # as fp has a method fileno(), you can pass it to ioctl res = fcntl.ioctl(fp, RNDADDENTROPY, t) time.sleep(0.001) 

    (Не забудьте убить программу после того, как вы закончите.)

    Как правило, он разработан разработчиками ядра и задокументирован в man 4 random :

     Writing to /dev/random or /dev/urandom will update the entropy pool with the data written, but this will not result in a higher entropy count. This means that it will impact the contents read from both files, but it will not make reads from /dev/random faster. 

    Энтони уже объяснил, что запись в /dev/random не увеличивает счет энтропии и показывает, как RNDADDENTROPY ioctl (см. Случайное (4) ) можно использовать для кредитования энтропии. Это, очевидно, не очень безопасно, так что это альтернатива, когда имеется генератор случайных чисел.

    Следующие реализации берут 512 байт (4096 бит) случайности из /dev/hwrng и перенаправляют их в пул энтропии (зачисление 4 бит энтропии на каждый байт, это произвольный выбор от меня). После этого он вызовет select (2) syscall для блокировки, когда пул энтропии заполнен (задокументирован в случайной (4) man-странице).

    Версия Python:

     import fcntl, select, struct with open('/dev/hwrng', 'rb') as hw, open('/dev/random') as rnd: while True: d = hw.read(512) fcntl.ioctl(rnd, 0x40085203, struct.pack('ii', 4 * len(d), len(d)) + d) select.select([], [rnd], []) 

    Так как у Arch Linux iso не установлен Python, вот версия Perl:

     open my $hw, "</dev/hwrng" and open my $rnd, "</dev/random" or die; for (;;) { my $l = read $hw, my $d, 512; ioctl $rnd, 0x40085203, pack("ii", 4 * $l, $l) . $d or die; vec(my $w, fileno $rnd, 1) = 1; select undef, $w, undef, undef } 

    Вероятно, это то, что делает rngd-программа (часть rng-tools ) (непроверенная), за исключением того, что она использует инструменты (Python или Perl), которые уже широко доступны.

    Linux и Unix - лучшая ОС в мире.