Interested Article - NIST SP 800-90A

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

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

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

Hash_DRBG

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

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

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

Входные данные: 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 — это код аутентификации (проверки подлинности) сообщений, использующий хеш-функции, который был введен ( англ. ) и его коллегами и впоследствии стандартизирован . HMAC-DRBG использует HMAC: {0, 1} l ×{0, 1} * → {0, 1} l для генерации блоков псевдослучайного вывода. Состояние имеет вид S = (K, V, cnt) , где стандарт определяет K и V как критические для безопасности переменные секретного состояния. Предполагается, что после инициализации начальным состоянием является S 0 = (K 0 , V 0 , cnt 0 ) , где cnt 0 = 1 и K 0 , V 0 ← {0, 1} len . Здесь K ∈ {0, 1} l используется в качестве ключа HMAC, V ∈ {0, 1} l является счетчиком, и cnt обозначает счетчик повторного заполнения .

Алгоритм генерации использует функцию update, которая используется для добавления любых дополнительных входных данных в переменные состояния K и V , и обновляет оба в одностороннем порядке. Если в вызов включены дополнительные входные данные, выполняется дополнительная пара обновлений. Сам алгоритм генерации для HMAC-DRBG работает следующим образом: процесс инициализации добавляет любые дополнительные входные данные в переменные состояния через функцию update; если дополнительные входные данные не включены в вызов, состояние остается неизменным. За К 0 , V 0 обозначим переменные состояния, соответствующие этому процессу, после чего результирующие блоки автоматически генерируются путем итеративного применения алгоритма HMAC(К 0 ,·) для текущего счетчика V j-1 , выходному блоку r j и следующему значению счетчика V j приравнивается результирующая строка. Ключ K 0 остается неизменным на протяжении каждой итерации. По завершении вызова окончательный процесс обновляет K и V с помощью функции update . Функция 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 являются критическими переменными состояния безопасности. Инициализация возвращает начальное состояние S 0 = (К 0 , V 0 , cnt 0 ) , где cnt 0 = 1 и K 0 ← {0, 1} k , V 0 ← {0, 1} l .

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

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

В рамках программы АНБ вставляет бэкдоры в криптографические системы. Dual_EC_DRBG был предположительно одной из целей в 2013 году . В процессе работ по стандартизации, АНБ добилось того, что в конечном итоге стало единственным редактором стандарта . При получении доступа к 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, предположительно не были осведомлены об этом очевидном конфликте интересов . Это может помочь объяснить, как генератор случайных чисел, который позже показал, что он уступает альтернативным аналогам (в дополнение к вероятному бэкдору), приняли как стандарт в NIST SP 800-90A.

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

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

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

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

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

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

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

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

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

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

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

Примечания

  1. (20 сентября 2013). Дата обращения: 23 августа 2014. 10 октября 2013 года.
  2. Schneier, Bruce (15 ноября 2007). Дата обращения: 25 ноября 2016. 23 апреля 2019 года.
  3. Woodage, Joanne ; Shumow, Dan . National Institute of Standards and Technology (апрель 2018). Дата обращения: 25 ноября 2016. 18 февраля 2019 года.
  4. Bellare, Mihir; Canetti, Ran; Krawczyk, Hugo. Keying hash functions for message authentication (англ.) . — , 1996.
  5. Turner, James. The keyed-hash message authentication code (hmac) (англ.) . — Federal Information Processing Standards , 2008.
  6. J.P. Aumasson от 21 декабря 2019 на Wayback Machine
  7. Perlroth, Nicole . New York Times (10 сентября 2013). Дата обращения: 23 августа 2014. 12 июля 2014 года.
  8. Ball, James; Borger, Julian; Greenwald, Glenn . The Guardian (5 сентября 2013). Дата обращения: 23 августа 2014. 18 сентября 2013 года.
  9. Menn, Joseph (2013-12-20). . Reuters . из оригинала 24 сентября 2015 . Дата обращения: 23 августа 2014 .
  10. Bruce Schneier (2007-11-15). . Wired News . из оригинала 23 ноября 2015 . Дата обращения: 23 августа 2014 .
  11. Goodin, Dan . Ars Technica (20 сентября 2013). Дата обращения: 23 августа 2014. 12 октября 2014 года.
  12. . National Institute of Standards and Technology (21 апреля 2014). Дата обращения: 23 августа 2014. 23 июля 2014 года.
  13. Barker, Elaine; Kelsey, John (PDF). National Institute of Standards and Technology (июнь 2015). doi : . Дата обращения: 19 ноября 2016. 9 октября 2013 года.
  14. Kan, Wilson (PDF) (4 сентября 2007). Дата обращения: 19 ноября 2016. 2 февраля 2017 года.
  15. Ye, Katherine Qinru (PDF) (апрель 2016). Дата обращения: 19 ноября 2016. 20 ноября 2016 года.
  16. Campagna, Matthew J. (PDF) (1 ноября 2006). Дата обращения: 19 ноября 2016. 2 февраля 2017 года.
  17. Brown, Daniel R. L.; Gjøsteen, Kristian (PDF) (15 февраля 2007). Дата обращения: 19 ноября 2016. 28 марта 2016 года.
  18. Schoenmakers, Berry; Sidorenko, Andrey (PDF) (29 мая 2006). Дата обращения: 20 ноября 2016. 8 марта 2016 года.
  19. . . National Institute of Standards and Technology (27 января 2000). Дата обращения: 13 января 2010. 12 августа 2011 года.
  20. от 12 января 2014 на Wayback Machine // Gael Hofemeier, 08/08/2012]
Источник —

Same as NIST SP 800-90A