RdRand

Rdrand (также RDRAND) это инструкция процессоров, относящихся к архитектуре x86, для генерации случайного числа при помощи внутреннего генератора случайных чисел. Rdrand является опциональным расширением набора инструкций x86-64 и IA-32. В процессорах Intel доступна, начиная с архитектуры Ivy Bridge, в процессорах AMD — начиная с модели Ryzen. Данный генератор случайных чисел соответствует стандартам безопасности и криптографическим стандартам, таким как NIST SP800-90, FIPS 140-2, и ANSI X9.82.

По некоторым мнениям, может представлять собой пример клептографии (умышленного внедрения криптографически слабого элемента). Внедрение уязвимости гипотетически возможно, к примеру, путём изменения типа допирования в одном из транзисторов (требуется модификация как минимум двух литографических масок)

Условные названия 
Intel Secure Key, также известный как Bull Mountain, — условное название Intel для инструкции rdrand и реализующего её аппаратного генератора случайных чисел (RNG). 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)

Использование в C++ 
Компилятор C++, входящий в MS Visual Studio 2013, поддерживает RDRAND посредством функций _rdrand16_step(unsigned short *random_val) и _rdrand32_step(unsigned int *random_val). Если удалось сгенерировать случайное число, используя аппаратный генератор процессора, функция возвращает 1, в противном случае возвращается 0. Само сгенерированное случайное число передается в память по указателю.

См. также 
 RDSEED

Примечания

Литература 
 A 4Gbps 0.57pJ/bit Process-Voltage-Temperature Variation Tolerant All-Digital True Random Number Generator in 45 nm CMOS // 2009 22nd International Conference on VLSI Design doi:10.1109/VLSI.Design.2009.69
 2.4 GHz 7 mW all-digital PVT-variation tolerant True Random Number Generator in 45 nm CMOS // 2010 IEEE Symposium on VLSI Circuits (VLSIC) doi:10.1109/VLSIC.2010.5560296
 Georg T. Becker, Stealthy Dopant-Level Hardware Trojans // Cryptographic Hardware and Embedded Systems - CHES 2013, Lecture Notes in Computer Science Volume 8086, 2013, pp 197–214

Ссылки 
 Behind Intel’s New Random-Number Generator. The random-number generator uses digital circuits to stump the smartest hackers // Greg Taylor, George Cox, 24 Aug 2011; перевод
 Устройство процессоров Intel Ivy Bridge: «Цифровой ГСЧ и Большой Брат» // ixbt.com, 29 ноября 2012
 Средства визуализации RdRand «Заметки об энтропии» // Intel IT Galaxy, блог icbook 

Случайность