Теория
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 + счётчик всегда дают один и тот же кейстрим. Случайность — в выборе ключа, а не в самом алгоритме.
Пример с решением
- Условие. Ключ 00..1f, nonce 000000090000004a00000000, счётчик 1 (вектор RFC 8439): первый блок кейстрима.
- Формула. Блок = (начальное состояние после 20 раундов) + начальное состояние, сериализация little-endian.
- Подстановка. Ключ — 8 слов, nonce — 3 слова, счётчик — 1.
- Вычисление. Первый блок: 10f1e7e4d13b5915….
- Ответ. 10f1e7e4d13b5915500fdd1fa32071c4… — калькулятор с полями по умолчанию выдаёт тот же блок: это официальный тест-вектор RFC.
Главное
- CSPRNG — криптографически стойкий, на нём держится TLS 1.3.
- Состояние 512 бит: константы + ключ + счётчик + nonce.
- Детерминирован: тот же ключ и nonce — тот же кейстрим.