ChaCha20 (CSPRNG)

Криптостойкий потоковый генератор из RFC 8439

32 байта = 256 бит

12 байт — уникален для каждой сессии

0 … 2³²−1

По 64 байта, 1–64

Нашли ошибку или хотите предложить улучшение?

Улучшить калькулятор «ChaCha20 (CSPRNG)»

Теория

ChaCha20 (RFC 8439) — криптографически стойкий потоковый генератор: блочный шифр, где каждый блок на 64 байта получается сложением перемешанного состояния с начальным. На ChaCha20 построен /dev/urandom в Linux, TLS 1.3 и генераторы Rust — там, где предсказуемость означает взлом.

Ядро — quarter-round: \(a \mathrel{+}= b; ; d \mathbin{\wedge}= a; ; d = \mathrm{rotl}{16}(d); ; c \mathrel{+}= d; ; b \mathbin{\wedge}= c; ; b = \mathrm{rotl}{12}(b); ; a \mathrel{+}= b; ; d \mathbin{\wedge}= a; ; d = \mathrm{rotl}{8}(d); ; c \mathrel{+}= d; ; b \mathbin{\wedge}= c; ; b = \mathrm{rotl}{7}(b)\). Состояние — 512 бит: константы «expand 32-byte k», ключ 256 бит, счётчик и nonce 96 бит. Двадцать раундов перемешивают его по столбцам и диагоналям; повторение одного nonce с одним ключом — единственная катастрофа, которую здесь можно устроить.

Важно: ChaCha20 детерминирован: ключ + nonce + счётчик всегда дают один и тот же кейстрим. Случайность — в выборе ключа, а не в самом алгоритме.

Пример с решением

  1. Условие. Ключ 00..1f, nonce 000000090000004a00000000, счётчик 1 (вектор RFC 8439): первый блок кейстрима.
  2. Формула. Блок = (начальное состояние после 20 раундов) + начальное состояние, сериализация little-endian.
  3. Подстановка. Ключ — 8 слов, nonce — 3 слова, счётчик — 1.
  4. Вычисление. Первый блок: 10f1e7e4d13b5915….
  5. Ответ. 10f1e7e4d13b5915500fdd1fa32071c4… — калькулятор с полями по умолчанию выдаёт тот же блок: это официальный тест-вектор RFC.

Главное

  • CSPRNG — криптографически стойкий, на нём держится TLS 1.3.
  • Состояние 512 бит: константы + ключ + счётчик + nonce.
  • Детерминирован: тот же ключ и nonce — тот же кейстрим.