Блокчейн/Уровень II · Механика/2.1 Криптография/Урок 5
Энтропия и случайность
Невидимый фундамент: почему ключ надёжен ровно настолько, насколько случаен шум, из которого он создан
МатериалыНабор игральных костей (необязательно, чтобы увидеть физическую энтропию)Тетрадь
Любопытство
- Что отличает истинную случайность от человеческой интуиции?
- Как программная ошибка в одном дистрибутиве Linux сделала тысячи ключей уязвимыми для атак полным перебором?
- Почему фраза из двенадцати слов — это ровно 128 бит энтропии плюс контрольная сумма?
Исследование
- Приватный ключ Bitcoin — это случайное целое число от 1 до n-1, где n — порядок генератора кривой secp256k1. Это пространство содержит примерно 1,158 × 10^77 возможных значений. Чтобы обеспечить 128-битную безопасность против атак на дискретный логарифм, ключ нужно выбирать из этого диапазона равномерно. Если процесс выбора предсказуем или смещён, эффективная энтропия падает, и объём работы для злоумышленника сокращается до малой доли теоретического максимума.
- Энтропия измеряет неопределённость в битах. Мнемоническая фраза BIP39 из двенадцати слов кодирует 128 бит истинной случайности плюс четырёхбитную контрольную сумму, полученную из SHA-256. Фраза из двадцати четырёх слов несёт 256 бит. Последнее слово отчасти служит детектором ошибок: случайный набор слов редко образует корректную фразу, потому что контрольная сумма не сойдётся. Такая структура сокращает число незамеченных ошибок при переписывании — при условии, что исходная энтропия была настоящей.
- Случайность, созданная человеком, заведомо слаба. В фразах, которые выбирают люди, гораздо меньше энтропии, чем кажется, потому что люди предпочитают знакомые слова, цитаты и шаблоны. Злоумышленники пользуются этим, проводя словарные атаки на ключи, полученные из запоминающихся фраз, — так называемые «брейн-кошельки» (brain wallets). Vasek, Bonneau и др. (2016) задокументировали, как такие кошельки регулярно опустошались, часто вскоре после пополнения, поскольку злоумышленники могли проверять огромные списки вероятных фраз.
- Ошибки программной реализации не раз подрывали генерацию ключей. Изменение OpenSSL в Debian (действовало в 2006–2008 годах, раскрыто в DSA-1571) оставило идентификатор процесса почти единственным источником вариативности, поэтому для каждого типа и размера ключа существовало всего около 32 768 возможных ключей. В августе 2013 года уязвимость SecureRandom в Android привела к тому, что некоторые биткоин-кошельки повторно использовали нонсы подписей, — это раскрыло приватные ключи и сделало возможными кражи. Эти инциденты показывают, что источники энтропии должны быть криптографически стойкими и не зависеть от состояния системы.
- Исследование Randstorm, опубликованное в 2023 году компанией Unciphered, показало, что веб-кошельки эпохи BitcoinJS (примерно 2011–2015 годы) использовали слабые генераторы случайных чисел, из-за чего пользователи были уязвимы к атакам с восстановлением ключей. Современные аппаратные кошельки при инициализации собирают энтропию из нескольких внутренних источников и показывают полученную мнемоническую фразу по одному слову. После записи эти слова становятся единственным ключом к средствам; их потеря означает безвозвратную утрату доступа.
- Качественную энтропию дают криптографические генераторы случайных чисел операционной системы (CSPRNG), аппаратные RNG или физические процессы, например броски игральных костей (с оговорками о смещении). CSPRNG смешивают шум от системных событий и аппаратных датчиков, получая непредсказуемые биты. Если результат лежит в диапазоне от 1 до n−1, он становится действительным приватным ключом; в противном случае генератор повторяет попытку с новыми случайными данными. Этот цикл обеспечивает равномерное распределение по всему порядку кривой.
Ключевые факты
- Приватный ключ Bitcoin рассчитан на 128-битную безопасность, что требует равномерного выбора из ~1,158 × 10^77 возможных значений.
- Фраза BIP39 из двенадцати слов кодирует 128 бит энтропии плюс четырёхбитную контрольную сумму; двадцать четыре слова кодируют 256 бит.
- Ошибка OpenSSL в Debian (2006–2008, DSA-1571) сократила пространство ключей примерно до 32 768 вариантов на каждый тип и размер ключа.
- Уязвимость SecureRandom в Android, раскрытая в августе 2013 года, заставила некоторые кошельки повторно использовать нонсы подписей, из-за чего ключи оказались доступны для кражи.
- Исследование Randstorm (опубликовано в 2023 году) выявило слабую случайность в веб-кошельках эпохи BitcoinJS, использовавшихся примерно в 2011–2015 годах.
- Ключи, полученные из запоминающихся фраз («брейн-кошельки»), злоумышленники регулярно находили и опустошали.
Упражнение девять, шесть, три, один
9СобратьПеречислите 9 источников цифровой или физической случайности. Укажите механизм (например, джиттер системных часов, тепловой шум) и известные исторические уязвимости, связанные с каждым из них.
6СгруппироватьРаспределите 9 источников по 6 категориям в зависимости от качества энтропии: криптографически стойкие CSPRNG, аппаратные RNG, физические процессы, созданные человеком, ошибочные программные реализации и прочие.
3Выделить главноеСведите 6 групп к 3 критериям оценки того, подходит ли источник случайности для генерации приватного ключа Bitcoin.
1КристаллизоватьНапишите одно предложение о том, почему равномерное распределение по всему порядку кривой n — непреложное условие безопасности ключа.
Проверка фактов
Даты, цифры и утверждения были проверены по приведенным ниже опубликованным источникам.
- Debian Security Advisory DSA-1571: openssl - insufficient randomness in key generation (2008)
- Bitcoin.org, 'Android Security Vulnerability' (11 August 2013)
- Unciphered, 'Randstorm: You Can't Patch a House of Cards' (2023)
- M. Vasek, J. Bonneau et al., 'The Bitcoin Brain Drain: Examining the Use and Abuse of Bitcoin Brain Wallets' (2016)
- M. Palatinus, P. Rusnak, A. Voisine & S. Bowe, 'BIP-0039: Mnemonic code for generating deterministic keys' (2013)