Истинные случайные числа с С++ 11 и RDRAND

Я видел, что Intel, похоже, включила новую функцию сборки для получения реальных случайных чисел, полученных с аппаратного обеспечения. Имя инструкции RdRand, но в Интернете доступно только небольшое количество деталей: http://en.wikipedia.org/wiki/RdRand

Мои вопросы относительно этой новой инструкции и ее использования в С++ 11 следующие:

  • Являются ли случайные числа с RdRand действительно случайными? (каждый бит генерируется из некоррелированного белого шума или квантовых процессов?)

  • Является ли это особенностью процессоров Ivy Bridge и Intel продолжит реализацию этой функции в следующем поколении процессора?

  • Как использовать его через С++ 11? Может быть, с std::random_device, но компиляторы уже звонят RdRand, если инструкция доступна?

  • Как проверить, действительно ли RdRand вызывается при компиляции программы?

Ответ 1

  • Это, безусловно, зависит от вашего взгляда на детерминизм Вселенной, поэтому это более философский вопрос, но многие считают его случайным.
  • Только Intel будет знать, но, поскольку требовалось добавить его, скорее всего, будет требование сохранить его
  • std::random_device не требуется для аппаратного обеспечения, и даже если это так, не требуется использовать rdrand. Вы можете задать его функцию double entropy() const noexcept, будь то аппаратное управление или нет. Использование rdrand для этого - проблема QoI, но я ожидал бы, что всякая разумная реализация будет доступна для этого (я видел, например, gcc). Если вы не уверены, вы всегда можете проверить сборку, но также и другие средства аппаратной случайности должны быть достаточно хорошими (имеется другое выделенное оборудование).
  • См. выше, если вас интересует, есть ли его единственное аппаратное обеспечение, используйте entropy, если он заинтересован в rdrand, сканировать сгенерированный машинный код.

Ответ 2

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

1) Случайные числа генерируются с помощью PRNG, совместимого с протоколом SP800-90 AES-CTR DRBG. AES использует 128-битный ключ, поэтому числа имеют мультипликативное сопротивление предсказания до 128 бит и аддитивную величину, превышающую 128.

Однако PRNG часто перераспределяется из источника с полной энтропией. Для изолированных инструкций RdRand он будет повторно загружен. Для 8 потоков на 4 ядрах, тянущих как можно быстрее, он будет повторно загружаться чаще, чем один раз на 14 RdRands.

Семена исходят от истинного генератора случайных чисел. Это включает источник энтропии 2,5 Гбит/с, который подается в экстрактор энтропии с коэффициентом сжатия 3: 1 с использованием AES-CBC-MAC.

Таким образом, это фактически TRNG, но тот, который возвращается к свойствам криптографически защищенного PRNG для коротких последовательностей при тяжелой загрузке.

Это точно семантическая разница между /dev/random и/dev/urandom на linux, только намного быстрее.

Энтропия в конечном счете собирается из квантового процесса, так как это единственный фундаментальный случайный процесс, который мы знаем о природе. В DRNG именно тепловые шумы в воротах 4-х транзисторов приводят к разрешающему состоянию метастабильной защелки, 2,5 миллиарда раз в секунду.

Источник и кондиционер энтропии предназначены для совместимости SP800-90B и SP800-90C, но эти спецификации все еще находятся в черновом режиме.

2) RdR и является частью стандартного набора инструкций Intel. Он будет поддерживаться во всех продуктах ЦП в будущем.

3) Вам нужно либо использовать встроенную сборку, либо библиотеку (например, openssl), которая использует RdRand. Если вы используете библиотеку, библиотека реализует встроенный ассемблер, который вы можете реализовать напрямую. Intel дает примеры кода на своем веб-сайте.

Кто-то еще упомянул librdrand.a. Я это написал. Это довольно просто.

4) Просто найдите коды кода RdRand в двоичном формате.

Ответ 3

Начиная с открытий PRISM и Snowden, я был бы очень осторожен в использовании аппаратных случайных генераторов или полагаться на одну отдельную библиотеку в приложении с проблемами безопасности. Я предпочитаю использовать комбинацию независимых криптографических генераторов с открытым исходным кодом. По сочетанию я имею в виду, например: Пусть ra, rb, rc - три независимых криптографических случайных генератора, r - случайное значение, возвращаемое приложению. Пусть sa, sb, sc являются их семенем, ta, tb, tc, периоды повторения, т.е. reseed rb рисует каждый tb. Независимо от того, насколько возможно, независимым библиотекам и полагаться на различные шифры или алгоритмы.

Псевдо-код:

// init
seed std rand with time (at least millisec, preferably microsec)
sa = std rand xor time // of course, not the same time evaluation
// loop
sb = ra every tb
sc = rb every tc
r = rb xor rc
sa = rc every ta

Конечно, каждая ничья должна использоваться только один раз.

Вероятно, достаточно двух источников:

// init
seed std rand with time (at least millisec, preferably microsec)
sa = std rand xor time // of course, not the same time evaluation
// loop
sb = ra every tb
sa = rb every ta
r = rb xor ra

Выберите различные значения для ta, tb, tc. Их диапазон зависит от силы случайного источника, который вы используете.

EDIT: для этой цели я начал новую библиотеку ABaDooRand.

Ответ 4

1) Нет, числа из RdR и не являются действительно случайными, поскольку они исходят от криптографически надежного генератора псевдослучайных чисел. Однако RdRand, RdSeed и технология Intel Secure Key, вероятно, наиболее близки к действительно случайным, которые вы найдете.

2) Да, эта функция доступна во всех процессорах Intel, которые появляются на ноутбуках, настольных компьютерах и серверах, начиная с процессоров Ivy Bridge, о которых вы упоминаете. В наши дни функции также реализованы в чипах AMD.

3 и 4). Руководство по разработке программного обеспечения Intel - это место для поиска этих ответов. Существует интересное обсуждение того, как Intel Secure Key применяется к астрофизической проблеме здесь (http://iopscience.iop.org/article/10.3847/1538-4357/aa7ede/meta;jsessionid=A9DA9DDB925E6522D058F3CEEC7D0B21.ip-10-40-2-120) и безплатной версии здесь (https://arxiv.org/abs/1707.02212). В этом документе описывается, как работает технология, как ее реализовать и описывает ее производительность (разделы 2.2.1 и 5). Пришлось читать его для класса.

Ответ 5

  • Я думаю, что они "говорят, что" случайные... так как это для шифрования. Я не стал бы слишком беспокоиться о качестве случайных чисел.
  • Я думаю, что Intel будет продолжать делать это, поскольку они всегда считают обратную совместимость столь же важной, даже если эта инструкция может быть бесполезной в будущем.
  • Мне жаль, что я не могу ответить на этот вопрос, потому что я не использую С++ 11.
  • Вы можете попробовать librdrand.a, если вы не хотите копать код сборки. Intel предоставила библиотеку для бесплатной загрузки на своем веб-сайте. Я тестировал его, он довольно удобен и имеет механизм сообщения об ошибках (поскольку генератор случайных чисел имеет небольшую вероятность отказа от генерации случайного числа). Поэтому, если вы используете эту библиотеку, вам нужно только проверить возвращаемое значение функции в librdrand

Пожалуйста, дайте мне знать, если что-то не так в моем ответе. Благодаря

Удачи.

xiangpisaiMM