NIST SP 800-90A

Эта статья находится на начальном уровне проработки, в одной из её версий выборочно используется текст из источника, распространяемого под свободной лицензией
Материал из энциклопедии Руниверсалис

NIST SP 800-90A — («SP» — сокращение от англ. Special Publication», «специальная публикация») — публикация Национального института стандартов и технологий (англ. NIST) с названием «Рекомендация для генерации случайных чисел с использованием детерминированных генераторов случайных битов» (англ. «Recommendation for Random Number Generation Using Deterministic Random Bit Generators»). Публикация содержит описания трех предположительно криптографически стойких генераторов псевдослучайных чисел для использования в криптографии: Hash_DRBG (на основе хеш-функций), HMAC_DRBG (на основе хеш-кода аутентификации сообщений) и CTR_DRBG (на основе блочных шифров в режиме счетчика).

С 24 июня 2015 года текущей версией издания является Редакция 1 (англ. «Revision 1»). Более ранние версии включали четвёртый генератор, Dual_EC_DRBG (основанный на эллиптической криптографии). Позже сообщалось, что Dual_EC_DRBG, вероятно, содержит клептографический бэкдор, внедренный Агентством национальной безопасности, в то время как другие три генератора случайных чисел принимаются как непротиворечивые и безопасные несколькими криптографами[1][2].

NIST SP 800-90А является общественным достоянием и находится в свободном доступе, так как представляет из себя исследование федерального правительства США.

Hash_DRBG

HASH-DRBG основан на хеш-функции SH : {0, 1} → {0, 1}l из семейства криптографических хеш-функций SHA[3]. Состояние имеет вид S = (V, C, cnt), где V ∈ {0, 1}len — счетчик, который хешируется для создания конечных блоков, значение которого обновляется во время каждого вызова генератора; С — константа, зависящая от порождающего элемента (англ. seed), а cnt — счетчик повторного заполнения. cnt указывает количество запросов псевдослучайных битов с момента получения нового значения, принятого от истинно случайного генератора во время создания экземпляра или повторного заполнения.

Алгоритм генерации для HASH-DRBG. Если в вызове generate используется дополнительный вход, он хэшируется и добавляется в счетчик V по модулю 2len во время процесса инициализации. Выходные блоки rj затем формируются путем хеширования счетчика V. В конце вызова счетчик хэшируется с отдельным префиксом, а результирующая строка вместе с константой C и cnt добавляется к V, результат такой операции задается как обновленный счетчик.

Константа C обновляется только во время повторного заполнения (когда она снова является производной от новой переменной V) и добавляется в переменную состояния V во время каждого обновления состояния. Константа C позволяет убедиться, что даже если предыдущий счетчик V дублируется в какой-то момент в разных периодах повторного заполнения (почти наверняка различных), счетчик при следующем обновлении значения будет препятствовать повторению предыдущей последовательности состояний. Стандарт определяет V и C как переменные критического состояния безопасности[3].

Входные данные: S = (V, C, cnt), β, addin
Выходные данные: S' = (V', C, cnt'), R
  if 0 ← check(S, β, addin) then
    Return (error, ⊥)
  if addin ≠ ε then
    w ← SH(0x02||V||addin)
    V0 = (V + w) mod 2^len
  else V(0) ← V
  temp ← ε
  m ← [β/l]
  for j = 1, . . . , m do
    r(j) ← SH(V(j−1))
    V(j) ← (V(j−1) + 1) mod 2^len
    temp ← temp||r(j)
  R ← left(temp, β)
  H ← SH(0x03||V(0))
  V' ← (V(0) + H + C + cnt) mod 2^len
  cnt' ← cnt + 1
  return (V', C, cnt')

HMAC_DRBG

HMAC — это код аутентификации (проверки подлинности) сообщений, использующий хеш-функции, который был введен Михиром Беллэром (англ. Mihir Bellare) и его коллегами[4] и впоследствии стандартизирован[5]. HMAC-DRBG использует HMAC: {0, 1}l×{0, 1}* → {0, 1}l для генерации блоков псевдослучайного вывода. Состояние имеет вид S = (K, V, cnt), где стандарт определяет K и V как критические для безопасности переменные секретного состояния. Предполагается, что после инициализации начальным состоянием является S0 = (K0, V0, cnt0), где cnt0 = 1 и K0, V0 ← {0, 1}len. Здесь K ∈ {0, 1}l используется в качестве ключа HMAC, V ∈ {0, 1}l является счетчиком, и cnt обозначает счетчик повторного заполнения[3].

Алгоритм генерации использует функцию update, которая используется для добавления любых дополнительных входных данных в переменные состояния K и V, и обновляет оба в одностороннем порядке. Если в вызов включены дополнительные входные данные, выполняется дополнительная пара обновлений. Сам алгоритм генерации для HMAC-DRBG работает следующим образом: процесс инициализации добавляет любые дополнительные входные данные в переменные состояния через функцию update; если дополнительные входные данные не включены в вызов, состояние остается неизменным. За К0, V0 обозначим переменные состояния, соответствующие этому процессу, после чего результирующие блоки автоматически генерируются путем итеративного применения алгоритма HMAC(К0,·) для текущего счетчика Vj-1, выходному блоку rj и следующему значению счетчика Vj приравнивается результирующая строка. Ключ K0 остается неизменным на протяжении каждой итерации. По завершении вызова окончательный процесс обновляет K и V с помощью функции update[3]. Функция update

Входные данные: addin, K, V
Выходные данные: K, V
  K ← HMAC(K, V||0x00||addin)
  V ← HMAC(K, V)
  if addin ≠ ε then
    K ← HMAC(K, V||0x01||addin)
    V ← HMAC(K, V)
  return (K, V)

функция generate

Входные данные: S = (K, V, cnt), β, addin
Выходные данные: S' = (K', V', cnt'), R
  if 0 ← check(S, β, addin) then
    return (error, ⊥)
  if addin ≠ ε then
    (K0, V0) ← update(addin, K, V)
  else (K0, V(0)) ← (K, V)
  temp ← ε ; m ← [β/l]
  for j = 1, . . . , m do
    V(j) ← HMAC(K0, V(j−1))
    r(j) ← V(j)
    temp ← temp||r(j)
  R ← left(temp, β)
  (K', V') ← update(addin, K0, V(m))
  cnt' ← cnt + 1
  return (R, (K', V', cnt'))

CTR_DRBG

CTR_DRBG основан на алгоритме блочного шифра, функция шифрования которого E : {0, 1}k × {0, 1}l → {0, 1}l используется в CTR-режиме (режиме счетчика). Состояние имеет вид S = (K, V, cnt), где K ∈ {0, 1}k используется в качестве ключа для блочного шифра, V ∈ {0, 1}l является счетчиком, а cnt обозначает счетчик повторного заполнения. Стандарт утверждает, что K и V являются критическими переменными состояния безопасности. Инициализация возвращает начальное состояние S0 = (К0, V0, cnt0), где cnt0 = 1 и K0 ← {0, 1}k, V0 ← {0, 1}l[3].

Как и в HMAC_DRBG алгоритм использует функцию update для одностороннего обновления переменных состояния K и V, а также для включения любых дополнительных входов данных (которые передаются функции update с помощью параметра provided_data). Функция запускает блочный шифр в CTR-режиме с использованием текущего ключа и счетчика, объединяя результирующие выходные блоки rj. Затем крайние слева κ+l бит отсекаются, и значения provided_data встраиваются внутрь с помощью операции XOR. Функция update вызывается каждым из других процессов таким образом, что это гарантирует, что provided_data точно имеет длину в κ+l бит[3].

Существует два варианта CTR_DRBG в зависимости от того, используется ли производящая функция. Производящая функция CTR_DRBG df объединяет в себе функцию, основанную на CBC-MAC, и возможность извлечения почти равномерного выхода из достаточно высокоэнтропийных входов. В случае, если производящая функция df не используется, строки дополнительного входа addin ограничены до не более (κ + l) — бит в длину. Процесс инициализации подключает каждый дополнительный вход к функции update: если производящая функция используется, то строка дополнительного входа представляет из себя строку (κ + l)-бит с CTR_DRBG df до начала этого процесса. Если дополнительный вход не используется, состояние остается неизменным, и addin имеет значение 0(κ+l) (для формирования входных данных для функции update во время финальной процедуры при завершении вызова). Выходные блоки rj затем создаются итеративно с помощью блочного шифра в CTR-режиме. Ключ K остаётся неизменным на протяжении всех этих итераций. При завершении вызова окончательный процесс обновляет оба K и V через вызов функции update[3]. Функция update

Входные данные: provided data, K, V
Выходные данные: K, V
  temp ← ε
  m ← [(κ + l)/l]
  for j = 1, . . . , m do
  V ← (V + 1) mod 2^l
C(i) ← E(K, V)
temp ← temp||Ci
temp ← left(temp, (κ + l))
K||V ← temp ⊕ provided data
return (K, V)

функция generate

Входные данные: S = (K, V, cnt), β, addin
Выходные данные: S' = (K', V', cnt'), R
  if 0 ← check(S, β, addin) then
    return (error, ⊥)
  if addin ≠ ε then
    if derivation function used then
      addin ← df(addin, (κ + l))
    else if len(addin) < (κ + l) then
      addin ← addin||0^(κ+l−len(addin))
    (K0, V0) ← update(addin, K, V )
  else
    addin ← 0^κ+l; (K0, V(0)) ← (K, V)
  temp ← ε ; m ← [β/l]
  for j = 1, . . . , m do
    V(j) ← (V(j−1) + 1) mod 2^l
    r(j) ← E(K0, V(j))
    temp ← temp||r(j)
  R ← left(temp, β)
  (K', V') ← update(addin, K0, V(m))
  cnt' ← cnt + 1
  return (R, (K', V', cnt'))

Бэкдор в Dual_EC_DRBG

Dual_EC_DRBG была изъята из публикации с выпуском первой редакции документа. Причиной этому стало потенциальное существование бэкдора. Бэкдор — намеренно встроенный дефект алгоритма, позволяющий получить несанкционированный доступ к данным или удалённому управлению компьютером[6].

В рамках программы Bullrun АНБ вставляет бэкдоры в криптографические системы. Dual_EC_DRBG был предположительно одной из целей в 2013 году[7]. В процессе работ по стандартизации, АНБ добилось того, что в конечном итоге стало единственным редактором стандарта[8]. При получении доступа к Dual_EC_DRBG, принятого в NIST SP 800-90A, АНБ процитировало использование Dual_EC_DRBG известной охранной фирмой RSA Security в своих продуктах. Однако компании RSA Security было выплачено NSA в размере 10 миллионов долларов США за использование Dual_EC_DRBG по умолчанию в своих продуктах. Reuters описывает эту сделку как «обработанную бизнес-лидерами, а не чистыми технологами». Поскольку контракт на 10 миллионов долларов, чтобы заставить RSA Security использовать Dual_EC_DRBG, был описан Reuters как секретный, люди, участвовавщие в процессе принятия Dual_EC_DRBG в NIST SP 800-90A, предположительно не были осведомлены об этом очевидном конфликте интересов[9]. Это может помочь объяснить, как генератор случайных чисел, который позже показал, что он уступает альтернативным аналогам (в дополнение к вероятному бэкдору), приняли как стандарт в NIST SP 800-90A.

Хотя потенциал для бэкдора в Dual_EC_DRBG уже был задокументирован Дэном Шумовым и Нильсом Фергюсоном в 2007 году,[10] он продолжал использоваться в выпускаемых продуктах такими компаниями, как RSA Security до 2013 года[1]. Учитывая известные недостатки в Dual_EC_DRBG, впоследствии появились обвинения в том, что RSA Security сознательно вставила бэкдор NSA в свои продукты. RSA отрицает сознательную вставку бэкдора в свои продукты[11].

После того, как бэкдор был обнаружен, NIST возобновил процесс государственной проверки стандарта NIST SP 800-90А[7][12]. Пересмотренная версия NIST SP 800-90A, в которой Dual_EC_DRBG был удален, опубликована в июне 2015 года[13].

Анализ безопасности

Hash_DRBG и HMAC_DRBG имеют доказательства безопасности для генерации псевдослучайных последовательностей[14]. Документ, подтверждающий безопасность Hash_DRBG и HMAC_DRBG цитирует попытки доказательства безопасности для Dual_EC_DRBG, высказывая, что не следует использовать CTR_DRBG, потому что это единственный генератор в NIST SP 800-90А, для которого отсутствуют доказательства безопасности[14].

HMAC_DRBG также имеет машинно-подтверженное доказательство безопасности[15]. Тезис, содержащий проверенное вычислительными методами доказательство безопасности, также доказывает, что взлом правильно реализованного экземпляра HMAC_DRBG не ставит под угрозу безопасность чисел, созданных до взлома[15].

Было показано, что CTR_DRBG имеет проблемы с безопасностью при использовании с определёнными параметрами, поскольку криптографы не учитывали размер блока шифра при проектировании этого генератора псевдослучайных чисел[16]. CTR_DRBG кажется безопасным и неотличимым от истинного случайного источника, когда AES используется в качестве базового блочного шифра и 112 бит берутся из этого генератора псевдослучайных чисел[16]. Когда AES используется в качестве базового блочного шифра и 128 бит берутся из каждого экземпляра, необходимый уровень безопасности ставится с оговоркой, что на выходе 128-битный шифр в режиме счетчика можно отличить от истинного генератора случайных чисел[16]. Когда AES используется в качестве базового блочного шифра и более 128 бит берется из этого генератора псевдослучайных чисел, тогда результирующий уровень безопасности ограничивается размером блока, а не размером ключа, и поэтому фактический уровень безопасности намного меньше, чем уровень безопасности, подразумеваемый размером ключа[16]. Также показано, что CTR_DRBG не может обеспечить ожидаемый уровень безопасности при использовании Triple DES, поскольку его 64-битный размер блока намного меньше, чем 112-битный размер ключа, используемый для Triple DES[16].

Попытка доказательства безопасности для Dual_EC_DRBG утверждает, что для обеспечения безопасности Dual_EC_DRBG требуется, чтобы три задачи принадлежали классу NP: Задача Диффи-Хеллмана, проблема дискретного логарифмирования и проблема усеченной точки[17]. Проблема принятия решений Диффи-Хеллмана широко признана как математически трудная[17]. Проблема дискретного логарифмирования широко не принята к классу NP, некоторые доказательства показывают, что эта проблема трудна, но не доказывают этого[17]. Доказательство безопасности, следовательно, подлежит сомнению и может быть принято недействительным, если проблема дискретного логарифмирования будет показана разрешимой, а не математически трудной. Проблема усеченной точки требует, чтобы достаточное количество битов было усечено от точки, выбранной Dual_EC_DRBG, чтобы сделать её неотличимой от действительно случайного числа[17]. однако было показано, что усечение 16 бит, заданное по умолчанию стандартом Dual_EC_DRBG, является недостаточным для того, чтобы сделать вывод неотличимым от истинного генератора случайных чисел[18] и поэтому делает недействительным доказательство безопасности Dual_EC_DRBG при использовании значения усечения по умолчанию.

Примеры применения

Приведенные алгоритмы являются стандартами и используются крупными компаниями для создания собственных продуктов на их основе. Так компания Microsoft в процессе создания обновления для своего CryptoApi под названием «Cryptography API: Next Generation (CNG)» установила в качестве генератора псевдослучайных чисел по умолчанию на CTR_DRBG[19].

Компания Intel в инструкции RdRand для генерации случайного числа при помощи встроенного генератора случайных чисел также использует CTR_DRBG[20].

История версий NIST Special Publication 800-90A

Примечания

  1. 1,0 1,1 Green, Matthew RSA warns developers not to use RSA products (20 сентября 2013). Дата обращения: 23 августа 2014. Архивировано 10 октября 2013 года.
  2. Schneier, Bruce The Strange Story of Dual_EC_DRBG (15 ноября 2007). Дата обращения: 25 ноября 2016. Архивировано 23 апреля 2019 года.
  3. 3,0 3,1 3,2 3,3 3,4 3,5 3,6 Woodage, Joanne; Shumow, Dan An Analysis of the NIST SP 800-90A Standard. National Institute of Standards and Technology (апрель 2018). Дата обращения: 25 ноября 2016. Архивировано 18 февраля 2019 года.
  4. Bellare, Mihir; Canetti, Ran; Krawczyk, Hugo. Keying hash functions for message authentication (англ.). — Crypto, Volume 96, pages 1-15, 1996.
  5. Turner, James. The keyed-hash message authentication code (hmac) (англ.). — Federal Information Processing Standards, 2008.
  6. J.P. Aumasson Cryptographic bacdooring Архивная копия от 21 декабря 2019 на Wayback Machine
  7. 7,0 7,1 Perlroth, Nicole Government Announces Steps to Restore Confidence on Encryption Standards. New York Times (10 сентября 2013). Дата обращения: 23 августа 2014. Архивировано 12 июля 2014 года.
  8. Ball, James; Borger, Julian; Greenwald, Glenn Revealed: how US and UK spy agencies defeat internet privacy and security. The Guardian (5 сентября 2013). Дата обращения: 23 августа 2014. Архивировано 18 сентября 2013 года.
  9. Menn, Joseph. Exclusive: Secret contract tied NSA and security industry pioneer (20 декабря 2013). Архивировано 24 сентября 2015 года. Дата обращения 23 августа 2014.
  10. Bruce Schneier. Did NSA Put a Secret Backdoor in New Encryption Standard?, Wired News (15 ноября 2007). Архивировано 23 ноября 2015 года. Дата обращения 23 августа 2014.
  11. Goodin, Dan We don’t enable backdoors in our crypto products, RSA tells customers. Ars Technica (20 сентября 2013). Дата обращения: 23 августа 2014. Архивировано 12 октября 2014 года.
  12. NIST Invites Comments on Draft SP 800-90A, Revision 1. National Institute of Standards and Technology (21 апреля 2014). Дата обращения: 23 августа 2014. Архивировано 23 июля 2014 года.
  13. Barker, Elaine; Kelsey, John NIST Released Special Publication (SP) 800-90A Revision 1: Recommendation for Random Number Generation Using Deterministic Random Bit Generators (PDF). National Institute of Standards and Technology (июнь 2015). doi:10.6028/NIST.SP.800-90Ar1. Дата обращения: 19 ноября 2016. Архивировано 9 октября 2013 года.
  14. 14,0 14,1 Kan, Wilson Analysis of Underlying Assumptions in NIST DRBGs (PDF) (4 сентября 2007). Дата обращения: 19 ноября 2016. Архивировано 2 февраля 2017 года.
  15. 15,0 15,1 Ye, Katherine Qinru The Notorious PRG: Formal verification of the HMAC-DRBG pseudorandom number generator (PDF) (апрель 2016). Дата обращения: 19 ноября 2016. Архивировано 20 ноября 2016 года.
  16. 16,0 16,1 16,2 16,3 16,4 Campagna, Matthew J. Security Bounds for the NIST Codebook-based Deterministic Random Bit Generator (PDF) (1 ноября 2006). Дата обращения: 19 ноября 2016. Архивировано 2 февраля 2017 года.
  17. 17,0 17,1 17,2 17,3 Brown, Daniel R. L.; Gjøsteen, Kristian A Security Analysis of the NIST SP 800-90 Elliptic Curve Random Number Generator (PDF) (15 февраля 2007). Дата обращения: 19 ноября 2016. Архивировано 28 марта 2016 года.
  18. Schoenmakers, Berry; Sidorenko, Andrey Cryptanalysis of the Dual Elliptic Curve Pseudorandom Generator (PDF) (29 мая 2006). Дата обращения: 20 ноября 2016. Архивировано 8 марта 2016 года.
  19. FIPS PUB 186-2. Federal Information Processing Standards. National Institute of Standards and Technology (27 января 2000). Дата обращения: 13 января 2010. Архивировано 12 августа 2011 года.
  20. Intel Digital Random Number Generator (DRNG) Software Implementation Guide Архивная копия от 12 января 2014 на Wayback Machine // Gael Hofemeier, 08/08/2012]