RDRAND
(для «чтения случайным образом»; известная как Intel Secure Key Technology, ранее известная как Bull Mountain ) - это инструкция для возврата случайных чисел из Intel на кристалле аппаратный генератор случайных чисел, который был засеян внутренним источником энтропии. RDRAND
доступен в процессорах Ivy Bridge и является частью Intel 64 и IA-32 архитектуры набора команд. AMD добавила поддержку этой инструкции в июне 2015 года.
Генератор случайных чисел соответствует стандартам безопасности и криптографии, таким как NIST SP 800-90A, FIPS 140-2, и. Intel также попросила Cryptography Research Inc. пересмотреть генератор случайных чисел в 2012 году, в результате чего был подготовлен документ «Анализ цифрового генератора случайных чисел Intel Ivy Bridge».
RDSEED
аналогичен RDRAND
и обеспечивает доступ нижнего уровня к оборудованию, генерирующему энтропию. Генератор RDSEED
и инструкция процессора rdseed
доступны с процессорами Intel Broadwell и процессорами AMD Zen.
CPUID
инструкцию можно использовать для проверки того, поддерживает ли центральный процессор (CPU) инструкцию RDRAND
на процессорах AMD и Intel. Если поддерживается, бит 30 регистра ECX устанавливается после вызова стандартной функции CPUID 01H
. Процессоры AMD проверяются на наличие этой функции с помощью того же теста. Доступность RDSEED
можно проверить на процессорах Intel аналогичным образом. Если RDSEED
поддерживается, бит 18 регистра EBX устанавливается после вызова стандартной функции CPUID 07H
.
Код операции для RDRAND
: 0x0F 0xC7
, за которым следует байт ModRM, который указывает регистр назначения и необязательно в сочетании с префиксом REX в 64-битном режиме.
Intel Secure Key - это имя Intel для обоих Команда RDRAND
и лежащая в ее основе аппаратная реализация генератора случайных чисел (RNG), который во время разработки получил кодовое название «Bull Mountain». Intel называет свой ГСЧ «цифровым генератором случайных чисел» или DRNG. Генератор берет пары 256-битных необработанных образцов энтропии, сгенерированных аппаратным источником энтропии, и применяет их к кондиционеру Advanced Encryption Standard (AES) (в режиме CBC-MAC ), который уменьшает их в одну 256-битную условную выборку энтропии. Детерминированный генератор случайных битов, называемый CTR_DRBG, определенный в NIST SP 800-90A, заполняется выходными данными кондиционера, предоставляя криптографически безопасные случайные числа приложениям, запрашивающим их через Инструкция RDRAND
. Аппаратное обеспечение выдаст максимум 511 128-битных выборок перед изменением начального значения. Использование операции RDSEED
обеспечивает доступ к кондиционированным 256-битным выборкам из AES-CBC-MAC.
Инструкция RDSEED
была добавлена в Intel Secure Key для заполнения другого генератора псевдослучайных чисел, доступного в процессорах Broadwell. Источник энтропии для инструкции RDSEED
работает асинхронно по самосинхронной схеме и использует тепловой шум внутри кремния для вывода случайного потока битов с частотой 3 ГГц, что ниже эффективных 6,4 Гбит / с. можно получить из RDRAND
(обе скорости распределяются между всеми ядрами и потоками ). Инструкция RDSEED
предназначена для заполнения программного ГПСЧ произвольной ширины, тогда как RDRAND
предназначена для приложений, которым просто требуются высококачественные случайные числа. Если криптографическая безопасность не требуется, программный ГПСЧ, такой как Xorshift, обычно работает быстрее.
На Intel Core i7-7700K, 4500 МГц (45 x 100 МГц) (микроархитектура Kaby Lake-S), одна инструкция RDRAND
или RDSEED
занимает 110 нс или 463 тактовых цикла, независимо от размера операнда (16/32/64 бит). Это количество тактовых циклов применяется ко всем процессорам с микроархитектурой Skylake или Kaby Lake. В процессорах с микроархитектурой Silvermont каждая инструкция занимает около 1472 тактовых циклов, независимо от размера операнда; а на Ivy Bridge процессорах RDRAND
требуется до 117 тактовых циклов.
На процессоре AMD Ryzen каждая из инструкций занимает около 1200 тактовых циклов для 16-битной или 32-битный операнд, и около 2500 тактовых циклов для 64-битного операнда.
Астрофизический симулятор Монте-Карло исследовал время для генерации 10 64-битных случайных чисел, используя RDRAND
на четырехъядерный процессор Intel i7-3740 QM. Они обнаружили, что реализация C RDRAND
работает примерно в 2 раза медленнее, чем генератор случайных чисел по умолчанию в C, и примерно в 20 раз медленнее, чем Mersenne Twister. Хотя был создан модуль Python RDRAND
, он оказался в 20 раз медленнее, чем генератор случайных чисел по умолчанию в Python.
Visual C ++ 2015 обеспечивает внутреннюю поддержка оболочки для функций RDRAND
и RDSEED
. GCC 4.6+ и Clang 3.2+ предоставляют встроенные функции для RDRAND
, когда -mrdrnd указан в flags, а также установка __RDRND__ для разрешения условной компиляции. В более новых версиях дополнительно предоставляется immintrin.h
для включения этих встроенных модулей в функции, совместимые с версией 12.1+ компилятора C Intel. Эти функции записывают случайные данные в место, на которое указывает их параметр, и в случае успеха возвращают 1.
Это опция для генерации криптографически безопасных случайных чисел с использованием RDRAND
и RDSEED
в OpenSSL для защиты связи.
Первое научное применение RDRAND
можно найти в астрофизике. Радионаблюдения за маломассивными звездами и коричневыми карликами показали, что некоторые из них излучают всплески радиоволн. Эти радиоволны вызваны магнитным пересоединением, тем же самым процессом, который вызывает солнечные вспышки на Солнце. RDRAND
использовался для генерации большого количества случайных чисел для симулятора Монте-Карло, для моделирования физических свойств коричневых карликов и эффектов инструментов, которые их наблюдают. Они обнаружили, что около 5% коричневых карликов достаточно магнитны, чтобы излучать сильные радиовсплески. Они также оценили производительность инструкции RDRAND
на языках C и Python по сравнению с другими генераторами случайных чисел.
В сентябре 2013 года в ответ на Статья в New York Times , раскрывающая попытки АНБ ослабить шифрование, Теодор Ц'о публично опубликовала информацию об использовании RDRAND
для / dev / random
в ядре Linux :
Я так рад, что сопротивлялся давлению инженеров Intel, чтобы позволить / dev / random
полагаться только на Инструкция RDRAND
. Цитата из [статьи в New York Times]: «К этому году они нашли способы внутри некоторых микросхем шифрования, которые шифруют информацию для предприятий и правительств, либо работая с производителями микросхем, чтобы вставить лазейки...» Полагаясь исключительно на аппаратный генератор случайных чисел, который использует реализацию, запечатанную внутри микросхемы, которую невозможно проверить, является ПЛОХОЙ идеей.
Линус Торвальдс отклонил опасения по поводу использования RDRAND
в ядре Linux, и указал, что он не используется в качестве единственного источника энтропии для / dev / random
, а скорее используется для улучшения энтропии путем объединения значений, полученных из RDRAND
с другими источниками случайность. Однако Тейлор Хорнби из Defuse Security продемонстрировал, что генератор случайных чисел Linux может стать небезопасным, если в инструкцию RDRAND
ввести бэкдор, специально предназначенный для кода, использующего его. Контрольная реализация Хорнби работает на немодифицированном ядре Linux до версии 3.13. Проблема была исправлена в ядре Linux в 2013 году.
Разработчики изменили ядро FreeBSD, отказавшись от использования RDRAND
и VIA PadLock непосредственно с комментарий «Для FreeBSD 10 мы собираемся вернуться и удалить бэкэнды RDRAND
и Padlock и передать их в Yarrow вместо того, чтобы доставлять их вывод непосредственно в / dev / random. По-прежнему будет возможно получить доступ к аппаратным генераторам случайных чисел, то есть, RDRAND
, Padlock и т. Д., Напрямую посредством встроенной сборки или с помощью OpenSSL из пользовательской среды, если потребуется, но мы больше не можем им доверять. " FreeBSD / dev / random использует Fortuna и RDRAND, запущенные из FreeBSD 11.