Rdrand (также RDRAND) это инструкция процессоров, относящихся к архитектуре x86, для генерации случайного числа при помощи внутреннего генератора случайных чисел.[1] Rdrand является опциональным расширением набора инструкций x86-64 и IA-32. В процессорах Intel доступна, начиная с архитектуры Ivy Bridge, в процессорах AMD — начиная с модели Ryzen. Данный генератор случайных чисел соответствует стандартам безопасности и криптографическим стандартам, таким как NIST SP800-90, FIPS 140-2, и ANSI X9.82.[1]
По некоторым мнениям, может представлять собой пример клептографии (умышленного внедрения криптографически слабого элемента)[2]. Внедрение уязвимости гипотетически возможно, к примеру, путём изменения типа допирования в одном из транзисторов (требуется модификация как минимум двух литографических масок)[3]
Intel Secure Key, также известный как Bull Mountain, — условное название Intel для инструкции rdrand и реализующего её аппаратного генератора случайных чисел (RNG).[1] Intel называет их ГСЧ и «цифровой генератор случайных чисел». Генератор использует встроенный в процессор источник энтропии.
Синтаксис ассемблерной команды: rdrand reg. Здесь reg — операнд команды, представляющий собой регистр общего назначения: 16-и, 32-х или 64-разрядный. Последний вариант возможен только в 64-битном режиме процессора.
Для проверки поддержки процессором RDRAND
можно использовать инструкцию CPUID
. При наличии поддержки бит 30 регистра ECX оказывается установлен после вызова функции 01H
инструкции CPUID. Опкод (машинный код инструкции) RDRAND: 0x0F 0xC7
.
1. Инструкция rdrand генерирует случайное целое двоичное число соответствующего размера и помещает его в регистр-операнд.
2. Если операция выполнилась успешно, устанавливается флаг переноса cf, в противном случае сбрасывается.
Две пары чисел по 256 бит, полученных из аппаратного источника энтропии, передаются в аппаратный блок, выполняющий криптографический алгоритм AES в режиме CBC-MAC. Полученное 256-битное значение используется для инициализации ГПСЧ (CTR_DRBG из раздела 10.2.1 стандарта NIST SP 800-90, с использованием AES)[4]
Компилятор C++, входящий в MS Visual Studio 2013, поддерживает RDRAND
посредством функций _rdrand16_step(unsigned short *random_val)
и _rdrand32_step(unsigned int *random_val)
. Если удалось сгенерировать случайное число, используя аппаратный генератор процессора, функция возвращает 1, в противном случае возвращается 0. Само сгенерированное случайное число передается в память по указателю.