Найти в Дзене
CRYPTO DEEP TECH

RingSide Replay Attack: Восстановление SEED → деривация приватных ключей Bitcoin-кошельков и как 32-битная энтропия вместо 256-битной привел

Crypto Deep Tech Данная статья представляет комплексный криптоаналитический обзор критической уязвимости CVE-2023-39910, известной под кодовым названием «Milk Sad», обнаруженной в широко распространённой утилите Libbitcoin Explorer версий 3.0.0–3.6.0. Фундаментальный дефект заключается в применении криптографически небезопасного генератора псевдослучайных чисел Mersenne Twister-32 (MT19937), инициализируемого системным временем, что катастрофически ограничивает пространство энтропии до 32 бит вместо требуемых 256 бит. В работе детально исследуется механизм атаки RingSide Replay Attack, позволяющей автоматизировать процесс восстановления приватных ключей Bitcoin-кошельков, в том числе утерянных, при наличии приблизительной информации о времени их создания. Научный анализ демонстрирует, что уязвимость привела к компрометации более 227 200 уникальных Bitcoin-адресов и хищению криптоактивов на сумму свыше $900 000 USD. Особое внимание уделяется математическим основам атаки, практической
Оглавление

Crypto Deep Tech

Данная статья представляет комплексный криптоаналитический обзор критической уязвимости CVE-2023-39910, известной под кодовым названием «Milk Sad», обнаруженной в широко распространённой утилите Libbitcoin Explorer версий 3.0.0–3.6.0. Фундаментальный дефект заключается в применении криптографически небезопасного генератора псевдослучайных чисел Mersenne Twister-32 (MT19937), инициализируемого системным временем, что катастрофически ограничивает пространство энтропии до 32 бит вместо требуемых 256 бит. В работе детально исследуется механизм атаки RingSide Replay Attack, позволяющей автоматизировать процесс восстановления приватных ключей Bitcoin-кошельков, в том числе утерянных, при наличии приблизительной информации о времени их создания. Научный анализ демонстрирует, что уязвимость привела к компрометации более 227 200 уникальных Bitcoin-адресов и хищению криптоактивов на сумму свыше $900 000 USD. Особое внимание уделяется математическим основам атаки, практической методологии восстановления приватных ключей с использованием криптоинструмента BTCDetect, а также рекомендациям по защите криптографических систем от атак на основе энтропии.

1. Криптографическая безопасность и парадигма случайности в экосистеме Bitcoin

Криптовалютная экосистема Bitcoin представляет собой сложную децентрализованную систему, безопасность которой фундаментально основана на принципах современной криптографии. Центральным элементом этой архитектуры является алгоритм цифровой подписи на эллиптических кривых (ECDSA — Elliptic Curve Digital Signature Algorithm), реализованный на специализированной кривой secp256k1. Однако даже математически безупречная криптографическая схема становится полностью уязвимой при нарушении базового условия — качественной генерации случайных чисел.

1.1. Теоретические основы криптографической безопасности Bitcoin

Безопасность сети Bitcoin базируется на вычислительной сложности задачи дискретного логарифмирования на эллиптических кривых (ECDLP — Elliptic Curve Discrete Logarithm Problem).

Приватный ключ k представляет собой случайное 256-битное целое число, которое должно быть:

  • Абсолютно непредсказуемым — невозможность угадывания или вычисления
  • Уникальным — отсутствие коллизий с другими ключами
  • Криптографически стойким — устойчивость к известным атакам

Публичный ключ Q генерируется как точка на эллиптической кривой путём скалярного умножения приватного ключа на генераторную точку G:

Q = k · G

где k — приватный ключ ∈ [1, n-1], G — генераторная точка кривой secp256k1, n — порядок группы

Эллиптическая кривая secp256k1 определяется уравнением Вейерштрасса в сокращённой форме:

y² ≡ x³ + 7 (mod p)

где p = 2256 − 232 − 977 ≈ 1.158 × 1077

Порядок группы n кривой secp256k1 равен:

n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141

n ≈ 1.158 × 1077

Теоретическая стойкость данной криптосистемы определяется тем, что обратная операция — вычисление приватного ключа k по известному публичному ключу Q — является вычислительно неосуществимой при корректной реализации. Однако это утверждение справедливо лишь при условии, что пространство возможных значений k остаётся максимальным (≈2256).

1.2. Фундаментальная роль энтропии в криптографических системах

Концепция энтропии в криптографии восходит к работам Клода Шеннона, заложившего теоретические основы теории информации. Энтропия Шеннона определяется как мера неопределённости (случайности) в системе:

H(X) = −Σ p(xᵢ) · log₂ p(xᵢ)

где H(X) — энтропия случайной величины X, p(xᵢ) — вероятность события xᵢ

Для криптографических приложений требуется максимальная энтропия, при которой все возможные значения равновероятны. В случае 256-битного приватного ключа Bitcoin это означает:

Hmax = log₂(2256) = 256 бит

Критическое значение энтропии заключается в следующем: если генератор случайных чисел (RNG) производит предсказуемые или имеет ограниченное пространство значений выходные данные, то злоумышленник может перебрать все возможные приватные ключи и восстановить криптографические секреты. Именно этот фундаментальный дефект стал причиной катастрофической уязвимости Milk Sad.

Определение 1 (Криптографически стойкий ГПСЧ): Генератор псевдослучайных чисел (ГПСЧ) называется криптографически стойким, если при известных первых k выходных битах вычислительно невозможно предсказать (k+1)-й бит с вероятностью, превышающей ½ + ε, где ε — пренебрежимо малая величина.

1.3. Историческая хронология обнаружения уязвимости

В июне-июле 2023 года исследователи безопасности зафиксировали аномальное явление в блокчейне Bitcoin: множество кошельков, созданных в различные временные периоды, начали систематически опустошаться, несмотря на отсутствие связи между их владельцами. Исследовательская группа Distrust провела комплексный криминалистический анализ и установила, что все скомпрометированные кошельки имели единственную общую черту — они были созданы с использованием команды bx seed из утилиты Libbitcoin Explorer версий 3.x.

Результаты расследования оказались катастрофическими:

ПараметрЗначениеОбщая сумма украденных средств> $900 000 USDЗатронутые криптовалютыBTC, ETH, XRP, DOGE, SOL, LTC, BCH, ZECКомпрометированные Bitcoin-адреса> 227 200Уязвимые версии Libbitcoin Explorer3.0.0 — 3.6.0Период эксплуатацииИюнь — Июль 2023

Кодовое название «Milk Sad» было предложено исследователями как первые два слова мнемонической фразы BIP-39, генерируемой при нулевом начальном значении (seed = 0), что символически отражает «печальное» состояние «молочной» (незрелой, детской) криптографической реализации.

2. Анатомия уязвимости: криптоанализ Mersenne Twister в контексте генерации ключей

2.1. Алгоритм Mersenne Twister: архитектура и криптографические недостатки

Mersenne Twister (MT19937) — это генератор псевдослучайных чисел, разработанный Макото Мацумото и Такуджи Нишимура в 1997 году. Алгоритм основан на линейной рекуррентной последовательности над конечным полем GF(2) и обладает следующими характеристиками:

ПараметрЗначение MT19937Период219937 − 1 (число Мерсенна)Размер слова32 битаРазмер состояния624 × 32 = 19968 битРазмер seed32 битаРавномерность (k-distribution)623-мерно равномерно распределён

Несмотря на превосходные статистические свойства (прохождение тестов Diehard, TestU01), Mersenne Twister категорически НЕ предназначен для криптографических приложений по следующим критическим причинам:

Критические криптографические недостатки MT19937:

  • Линейность: Внутреннее состояние может быть полностью восстановлено по 624 последовательным 32-битным выходам
  • Ограниченное пространство seed: Только 232 ≈ 4.29 × 109 возможных начальных состояний
  • Детерминизм: Идентичные seed производят идентичные последовательности
  • Предсказуемость: При известном состоянии возможно вычисление всех прошлых и будущих выходов

2.2. Уязвимая реализация в Libbitcoin Explorer

Критическая ошибка в коде Libbitcoin Explorer версий 3.0.0–3.6.0 располагалась в модуле генерации энтропии:

// pseudo_random.cpp (VULNERABLE VERSION)
data_chunk random_bytes(size_t length) {
std::random_device random; //
Getting seed (system time)
std::default_random_engine engine(random()); // MT19937 с 32-bit seed
std::uniform_int_distribution distribution(0, 255);

data_chunk result(length);
for (auto& byte : result)
byte = distribution(engine);
return result;
}

При вызове команды bx seed -b 256 | bx mnemonic-new пользователь ожидал получить 256 бит криптографически стойкой энтропии для генерации 24-словной мнемонической фразы BIP-39. Однако реальная картина была катастрофической:

Ожидаемая энтропия: 2256 ≈ 1.16 × 1077
Фактическая энтропия: 232 ≈ 4.29 × 109

Редукция пространства поиска: в 1068 раз

2.3. Математическая формализация атаки

Формализуем уязвимость с использованием строгой математической нотации. Пусть:

  • E — энтропия (256 бит), генерируемая для создания кошелька
  • S — seed для MT19937, где S ∈ [0, 232)
  • f(S) — функция генерации последовательности MT19937 из seed S
  • trunc32(x) — извлечение первых 32 байт из последовательности
  • bip39(E) — преобразование энтропии в мнемоническую фразу
  • derive(m) — деривация приватного ключа из мнемоники по BIP-32
  • addr(k) — множество Bitcoin-адресов, дериватов приватного ключа k

Определение 2 (Уязвимость Milk Sad):
Существует такой seed S, что:

∃ k, S : trunc32(f(S)) ≡ E (mod 2256)

такой что

addr(derive(bip39(E))) = Atarget

где Atarget — целевой Bitcoin-адрес.

Вероятность успешного восстановления при полном переборе пространства 232:

P(success) = 1 − (1 − 1/N)232

где N = 2160 — общее количество возможных Bitcoin-адресов (P2PKH)

Поскольку 232 ≪ 2160, вероятность ложного совпадения пренебрежимо мала, и при нахождении корректного seed P(success) ≈ 1.

2.4. Детерминированная цепочка преобразований BIP-39/BIP-32

После восстановления исходного 32-битного seed, процесс реконструкции приватного ключа становится полностью детерминированным согласно стандартам BIP-39 и BIP-32:

  1. Генерация энтропии: seed → MT19937 → 256-битная псевдослучайная последовательность
  2. Вычисление контрольной суммы: SHA-256(entropy) → первые 8 бит
  3. Формирование мнемоники: (entropy || checksum) → 24 слова BIP-39
  4. Деривация master seed: PBKDF2-HMAC-SHA512(mnemonic, «mnemonic» || passphrase, 2048 итераций) → 512-битный seed
  5. Генерация master key: HMAC-SHA512(«Bitcoin seed«, master_seed) → (master_private_key, chain_code)
  6. Иерархическая деривация: По пути BIP-44: m/44’/0’/0’/0/0 → конечный приватный ключ

Цепочка преобразований:

S32bit → MT19937 → E256bit → SHA256 → Mnemonic24words → PBKDF2 → Seed512bit → HMAC-SHA512 → (k, c) → BIP-44 → kfinal

3. Эффективность атаки RingSide Replay: вычислительный анализ

3.1. Оценка вычислительной сложности

Полное пространство поиска составляет 232 ≈ 4.29 × 109 возможных значений seed. При известной дате создания кошелька (или приблизительном диапазоне) пространство поиска может быть существенно сокращено:

Сокращение пространства при известной дате:

|Sday| = 86 400 (секунды в сутках)
Редукция: 232 / 86 400 ≈ 49 710 раз

Производительность на современном оборудовании:

ОборудованиеСкорость перебораВремя полного перебора 232CPU (Intel i9-13900K)~106 seeds/сек~71 минутаGPU (NVIDIA RTX 4090)~108 seeds/сек~43 секундыFPGA кластер~1010 seeds/сек< 1 секунды

3.2. Количественная оценка эффективности атаки

Эффективность атаки может быть выражена через отношение логарифмов пространств поиска:

Attack Efficiency = log₂(232) / log₂(2256) = 32/256 = 0.125 = 12.5%

Это означает, что пространство поиска сокращается на 87.5% от теоретически безопасного уровня

www.cryptou.ru/btcdetect

Практическое применение: криптоинструмент BTCDetect

Научный анализ использования BTCDetect для восстановления приватных ключей

BTCDetect представляет собой специализированное программное обеспечение для криптоанализа и восстановления утерянных Bitcoin-кошельков, основанное на выявлении и эксплуатации уязвимостей в криптографических библиотеках. Инструмент реализует методологию атаки RingSide Replay Attack и обеспечивает практическую реализацию восстановления приватных ключей из уязвимых кошельков.

Архитектура BTCDetect

BTCDetect состоит из следующих основных модулей:

  • Модуль анализа энтропии: Обнаружение слабых источников случайности в процедурах генерации ключей
  • Модуль реконструкции PRNG: Воспроизведение состояния генератора Mersenne Twister по известным параметрам
  • Модуль деривации ключей: Реализация полной цепочки BIP-39/BIP-32 для восстановления ключей
  • Модуль верификации: Сопоставление восстановленных адресов с целевыми данными блокчейна

Алгоритм работы BTCDetect

Операционная модель BTCDetect включает три основных этапа:

  1. Идентификация уязвимых кошельков:Анализ временных меток транзакций Определение вероятного диапазона создания кошелька
    Идентификация паттернов, характерных для
    Libbitcoin Explorer
  2. Перебор пространства seed:Генерация кандидатов seed на основе временного диапазона
    Параллельное вычисление цепочек BIP-39 → BIP-32
    Сравнение полученных адресов с целевыми
  3. Верификация и восстановление:Подтверждение корректности восстановленного ключа
    Проверка валидности подписей
    Документирование результатов для криминалистического анализа

Практический пример восстановления

Рассмотрим задокументированный случай восстановления приватного ключа:

ПараметрЗначениеBitcoin-адрес1NiojfedphT6MgMD7UsowNdQmx5JY15djGСтоимость восстановленных средств$61,025Восстановленный приватный ключ (HEX)4ACBB2E3CE1EE22224219B71E3B72BF6C8F2C9AA1D992666DBD8B48AA826FF6BВосстановленный ключ (WIF compressed)Kyj6yvb4oHHDGBW23C8Chzji3zdYQ5QMr8r9zWpGVHdvWuYqCGVUПубличный ключ (сжатый)03AE73430C02577F3A7DA6F3EDC51AF4ECBB41962B937DBC2D382CABB11D0D18CE

Валидация восстановленного ключа подтверждает его принадлежность к допустимому диапазону скаляров кривой secp256k1:

1 ≤ k < n

где n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141

Научное значение BTCDetect

Методология BTCDetect имеет широкое научное применение, выходящее за рамки конкретной уязвимости Milk Sad:

  • Исследование классов PRNG-уязвимостей: Линейные конгруэнтные генераторы (LCG), небезопасные реализации random()
  • Криминалистический анализ блокчейна: Выявление паттернов компрометированных кошельков
  • Аудит криптографических библиотек: Обнаружение потенциальных уязвимостей до их эксплуатации
  • Образовательные цели: Демонстрация критической важности криптографически стойких ГПСЧ

Уязвимость хеш-функции Борромео

static ec_scalar borromean_hash(const hash_digest& M, const data_slice& R,
uint32_t i, uint32_t j) NOEXCEPT
{
// e = H(M || R || i || j)
hash_digest hash{};
stream::out::fast stream{ hash };
hash::sha256::fast sink(stream);
sink.write_bytes(R);
sink.write_bytes(M);
sink.write_4_bytes_big_endian(i);
sink.write_4_bytes_big_endian(j);
sink.flush();
return hash;
}

Порядок конкатенации данных (R || M || i || j) создаёт потенциальные возможности для атак с расширением длины (length extension attacks) в определённых сценариях.

6.1. Требования к генерации энтропии

ПлатформаРекомендуемый источник энтропииLinux/Unix/dev/urandom или getrandom()WindowsCryptGenRandom() или BCrypt APIPythonМодуль secrets или os.urandom()КриптобиблиотекиOpenSSL RAND_bytes(), libsodium randombytes()

Данная статья представляет детальный криптоанализ критической уязвимости, обозначенной как CVE-2023-39910, получившей кодовое название Milk Sad. Уязвимость обнаружена в популярной утилите Libbitcoin Explorer (версии 3.0.0–3.6.0), которая используется для создания и управления Bitcoin кошельками в офлайн-режиме. Основной дефект заключается в использовании криптографически небезопасного генератора псевдослучайных чисел Mersenne Twister-32 (MT19937), инициализируемого с помощью системного времени, что ограничивает пространство энтропии всего 32 битами. Данная работа рассматривает механизм атаки Ringside Replay Attack, которая позволяет злоумышленникам автоматизировать процесс восстановления приватных ключей Bitcoin кошельков, включая восстановление потерянных кошельков, если известно примерное время их создания. Научный анализ показывает, что уязвимость привела к компрометации более 227 200 уникальных Bitcoin адресов и краже криптовалют стоимостью более 900 000 USD. В статье подробно описаны математические основы атаки, методология восстановления приватных ключей и криптоинструмент BTCDetect, используемый для практической реализации восстановления. Также представлены рекомендации по защите и контрмеры для разработчиков и пользователей криптовалютных кошельков.

1. Значение проблемы с валидацией

Безопасность сети Bitcoin фундаментально основана на криптографии эллиптических кривых (ECDSA), в частности на использовании кривой secp256k1. Приватный ключ — это случайное 256-битное число, которое должно быть абсолютно непредсказуемым и уникальным для каждого Bitcoin адреса. Публичный ключ генерируется как точка на эллиптической кривой путём умножения генератора кривой G на приватный ключ:

Q = k · G,
where k is the private key

Безопасность этого механизма полностью зависит от качества энтропии, используемой при генерации приватного ключа. Если генератор случайных чисел (RNG) является предсказуемым или имеет ограниченное пространство значений, злоумышленник может перебрать все возможные приватные ключи и восстановить криптографические секреты. Именно эта фундаментальная уязвимость и стала причиной катастрофы Milk Sad.

В июне-июле 2023 года на блокчейне Bitcoin было обнаружено необычное явление: множество кошельков, созданных в разные годы, начали опустошаться в одну и ту же дату, несмотря на отсутствие связи между их владельцами. Исследовательская группа Distrust провела детальный анализ и обнаружила, что все скомпрометированные кошельки имели одну общую черту — они были созданы с помощью команды bx seed из Libbitcoin Explorer версии 3.x.

2. История открытия уязвимости Milk Sad

Согласно исследованиям, было украдено более 900 000 USD стоимостью криптовалют (в том числе BTC, ETH, XRP, DOGE, SOL, LTC, BCH и ZEC). Позже, в 2025 году, команда Milk Sad обновила свой анализ и обнаружила, что количество скомпрометированных кошельков составляет более 227 200 уникальных Bitcoin адресов, что делает эту атаку одной из крупнейших в истории криптовалютной безопасности.

Расследование Milk Sad, начатое ранее в 2023 году, показало, что жертвы создавали свои кошельки на изолированных ноутбуках с Linux, используя команды в Libbitcoin Explorer. В каждом случае пользователи использовали bx для создания мнемонических фраз BIP39 из 24 слов, полагая, что инструмент обеспечивает достаточную случайность.

Одна из команд, использованных при генерации кошелька, выглядела так:

bx seed -b 256 | bx mnemonic-new

Она генерировала 256 бит энтропии, которые затем преобразовывались в мнемоническую фразу из 24 слов. Из-за несовершенства генератора случайных чисел, якобы безопасная мнемоника на самом деле была предсказуемой. Хотя жертвы Milk Sad создавали свои кошельки с разницей в несколько лет, следователи обнаружили, что каждый из них использовал одну и ту же версию Libbitcoin Explorer, которая неосознанно генерировала слабые закрытые ключи.

-2

3. Теоретические основы криптографии Bitcoin и ECDSA

3.1 Кривая secp256k1 и стандарт ECDSA

ECDSA (Elliptic Curve Digital Signature Algorithm) — это криптографический алгоритм, основанный на эллиптической криптографии. В Bitcoin используется специфическая кривая, называемая secp256k1, которая определяется уравнением:

y² ≡ x³ + 7 (mod p)
where p = 2^256 − 2^32 − 977

Кривая secp256k1 имеет порядок n ≈ 2^256, что означает, что существует приблизительно 2^256 возможных точек на кривой. Генератор G — это стандартная генерирующая точка для этой кривой, которая используется для всех вычислений в Bitcoin.

3.2 Процесс генерации приватного и публичного ключей

Процесс генерации ключевой пары в Bitcoin выглядит следующим образом:

  1. Генерация энтропии: Генерируется 256-битное случайное число, которое служит приватным ключом k. Это число должно быть в диапазоне 1 ≤ k < n, где n — порядок базовой точки.
  2. Вычисление публичного ключа: Публичный ключ Q вычисляется как Q = k · G, где · обозначает скалярное умножение на эллиптической кривой.
  3. Генерация адреса: Bitcoin адрес получается путём хеширования публичного ключа и кодирования результата.

Критическим моментом является генерация энтропии на шаге 1. Если используется слабый генератор случайных чисел, то пространство возможных приватных ключей становится значительно меньше, чем 2^256, что позволяет злоумышленнику перебрать все возможные ключи и найти приватный ключ.

-3

4. Mersenne Twister-32: архитектура и недостатки

4.1 История и описание алгоритма

Mersenne Twister (MT19937) — это генератор псевдослучайных чисел, разработанный Мацумото и Нишимурой в 1997 году. Алгоритм основан на линейной рекуррентной последовательности над конечным полем и генерирует последовательность 32-битных целых чисел. Алгоритм широко используется в немировых приложениях благодаря его хорошим статистическим свойствам и быстроте вычисления.

Однако Mersenne Twister категорически НЕ предназначен для криптографических приложений по следующим причинам:

  1. Предсказуемость: Выходные значения RNG могут быть полностью восстановлены при наличии последовательности из 624 последовательных 32-битных выходов.
  2. Уязвимость к анализу: Внутреннее состояние состоит из 624 32-битных целых чисел; если злоумышленник знает эти значения, он может предсказать все будущие выходы.
  3. Отсутствие свойства криптографической стойкости: Алгоритм не обладает свойством, при котором невозможно вычислить i-й элемент последовательности без вычисления всех предыдущих элементов.

4.2 Использование Mersenne Twister в Libbitcoin Explorer 3.x

В коде Libbitcoin Explorer 3.x процесс генерации энтропии для создания новых кошельков реализован следующим образом:

// pseudo_random.cpp (vulnerable version) data_chunk random_bytes(size_t length) { std::random_device random; std::default_random_engine engine(random()); std::uniform_int_distribution<uint32_t> distribution(0, 255); data_chunk result(length); for (auto& byte : result) byte = distribution(engine); return result; }

В этом коде:

  • std::random_device random инициализирует seed, используя системное время
  • std::default_random_engine (который реализуется как std::mt19937) получает однократное значение от random_device
  • Этот seed обычно содержит только 32 бита полезной энтропии (текущее системное время в секундах или миллисекундах)

Команда bx seed использует эту функцию для генерации начальной энтропии при создании новых Bitcoin кошельков. Вот типичный вызов:

bx seed -b 256 | bx mnemonic-new

Эта команда должна была бы создать 256 бит случайной энтропии, которая затем преобразуется в 24-словную BIP-39 мнемоническую фразу. Однако из-за ограничения в 32 бита реального пространства энтропии от std::random_device, вся мнемоническая фраза может быть восстановлена при известном времени создания кошелька.

-4

5. Математические основы атаки Ringside Replay

5.1 Принцип 1: Ограниченное пространство энтропии

Пространство возможных значений seed для MT19937 ограничено 2^32 комбинациями (приблизительно 4.3 миллиарда возможных значений). Это означает, что всё пространство энтропии может быть перебрано за несколько дней на обычном ПК.

Пространство поиска = 2^32 ≈ 4.29 × 10^9 возможных значений

5.2 Принцип 2: Предсказуемость по времени создания

Если известна дата создания кошелька (или примерный диапазон дат), пространство поиска может быть дополнительно сокращено. Системное время, используемое для инициализации MT19937, может быть восстановлено с высокой вероятностью, если известны:

  • Год создания кошелька
  • Месяц/день (если известны из истории транзакций)
  • Приблизительное время суток

Сокращение пространства поиска до диапазона дат, например за один день, уменьшает количество попыток примерно в 86 400 раз (количество секунд в дне).

5.3 Принцип 3: Детерминированное преобразование в приватный ключ

После восстановления исходной 256-битной энтропии её преобразование в приватный ключ полностью детерминировано согласно стандартам BIP-39 и BIP-32:

  1. Энтропия → SHA-256 контрольная сумма → 24-словная BIP-39 фраза
  2. BIP-39 фраза + пассфраза → PBKDF2-HMAC-SHA512 (2048 итераций) → 512-битный мастер seed
  3. Мастер seed → HMAC-SHA512("Bitcoin seed") → мастер приватный ключ + цепной код

5.4 Формальное математическое определение уязвимости

Пусть:

  • E — энтропия, которая должна быть генерирована (256 бит)
  • S — seed для MT19937, где S ∈ [0, 2^32)
  • f(S) — функция, которая генерирует MT19937 последовательность из seed S
  • trunc_32(x) — функция, которая берёт первые 32 байта из последовательности MT19937
  • bip39(E) — преобразование энтропии в BIP-39 мнемонику
  • derive(m) — преобразование мнемоники в приватный ключ
  • addr(k) — множество всех возможных Bitcoin адресов, дериватов из приватного ключа k

Уязвимость определяется как:
∃ k, S : trunc_32(f(S)) ≡ E (mod 256)
такой что addr(derive(bip39(E))) = A_target

где A_target — целевой Bitcoin адрес.

5.5 Вероятность успешного восстановления

При перебор полного пространства 2^32:

P(success) = 1 − (1 − 1/N)^(2^32)
where N = 2^160 is the total number of possible Bitcoin addresses (for P2PKH addresses)

Поскольку 2^32 << 2^160, вероятность ложного совпадения ничтожно мала, и P(success) ≈ 1 при нахождении правильного seed.

-5

6. Процесс восстановления приватного ключа

6.1 Алгоритм восстановления ключа

Процесс восстановления приватного ключа для скомпрометированного Bitcoin кошелька состоит из следующих этапов:

  1. Определение диапазона дат: Из истории транзакций определяется примерная дата создания кошелька. Это может быть известная дата или диапазон от нескольких месяцев до года.
  2. Перебор значений seed: Для каждого дня в диапазоне дат перебираются все возможные значения seed, соответствующие временным меткам этого дня (86 400 значений в день).
  3. Генерация энтропии: Для каждого значения seed генерируется последовательность MT19937, из которой извлекаются первые 32 байта, интерпретируемые как энтропия.
  4. Преобразование в мнемонику: Сгенерированная энтропия преобразуется в BIP-39 мнемонику.
  5. Деривация приватного ключа: Мнемоника преобразуется в приватный ключ согласно BIP-32 иерархии.
  6. Генерация адреса: Из приватного ключа генерируется соответствующий Bitcoin адрес.
  7. Проверка совпадения: Если сгенерированный адрес совпадает с целевым адресом, то восстановление считается успешным.

6.2 Сложность вычислений

На современном оборудовании (например, GPU NVIDIA RTX 3090):

  • Если известна точная дата: примерно 86 400 проверок = несколько минут на одном GPU
  • Если известен год: примерно 365 × 86 400 ≈ 31 536 000 проверок = несколько часов на одном GPU
  • Если используется полное пространство 2^32: примерно 4 294 967 296 проверок = несколько дней на одном GPU

Данные расчёты показывают, что восстановление приватного ключа практически осуществимо даже для непрофессиональных злоумышленников.

-6

7. Реальный пример: восстановление ключа адреса 1NiojfedphT6MgMD7UsowNdQmx5JY15djG

7.1 Исходные данные компрометации

Рассмотрим задокументированный случай восстановления приватного ключа из Bitcoin-адреса 1NiojfedphT6MgMD7UsowNdQmx5JY15djG:

ПараметрЗначениеBitcoin адрес1NiojfedphT6MgMD7UsowNdQmx5JY15djGСтоимость восстановленных средств$ 61.025Восстановленный приватный ключ (HEX)4ACBB2E3CE1EE22224219B71E3B72BF6C8F2C9AA1D992666DBD8B48AA826FF6BВосстановленный приватный ключ (WIF compressed)Kyj6yvb4oHHDGBW23C8Chzji3zdYQ5QMr8r9zWpGVHdvWuYqCGVUВосстановленный приватный ключ (Decimal)95490713496748161492785334010456634825357659290488148536925849552527657999353

7.2 Валидация ключа в пространстве secp256k1

Приватный ключ k должен удовлетворять ограничению:

1 ≤ k < n
where n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
≈ 1.158 × 10^77

Результат проверки: ✓ ВАЛИДЕН (ключ находится в допустимом диапазоне скаляров)

7.3 Вычисление публичного ключа и адреса

Восстановленный приватный ключ позволяет вычислить публичный ключ:

ПараметрЗначениеПубличный ключ (несжатый, 130 символов)04BC79D7CC638214D0FE1902A8F3A0EEC3F2B41F5792043559AD6161D23467C234BCD34142146FF3E0DF1648A2B83F392B738AF7598C5B137C2A4500B6E12CECFDПубличный ключ (сжатый, 66 символов)03AE73430C02577F3A7DA6F3EDC51AF4ECBB41962B937DBC2D382CABB11D0D18CEBitcoin адрес (uncompressed)1NiojfedphT6MgMD7UsowNdQmx5JY15djG

7.4 Практическое значение восстановленного ключа

Восстановленный приватный ключ предоставляет полный контроль над Bitcoin-кошельком, позволяя злоумышленнику:

Возможности с восстановленным приватным ключом:

  • Создавать и подписывать транзакции для вывода всех средств на контролируемый адрес
  • Импортировать ключ в любой Bitcoin кошелек (Electrum, Bitcoin Core, MetaMask и т.д.)
  • Полностью захватить контроль над адресом и всеми его активами
  • Скрыть следы компрометации путём удаления всех логов и истории
-7

8. Криптоинструмент BTCDetect: архитектура и возможности

8.1 Общее описание BTCDetect

BTCDetect — это программное обеспечение, разработанное для восстановления утерянных биткойн-кошельков путём применения методов криптоанализа и выявления уязвимостей в криптографических библиотеках, таких как SharpECC. SharpECC — это библиотека C# для работы с эллиптической криптографией (ECC), которая лежит в основе генерации ключей и подписей в экосистеме Bitcoin.

Несмотря на свою популярность, SharpECC имеет ряд критических уязвимостей и ошибок, которые могут служить точками входа для восстановления закрытых ключей утерянных кошельков.

8.2 Основной механизм BTCDetect

Основной механизм BTCDetect основан на таких уязвимостях, как ошибки генерации случайных чисел (nonce) при создании цифровых подписей ECDSA. Из-за этих ошибок программное обеспечение BTCDetect может использовать несколько подписей, созданных с помощью одного и того же закрытого ключа, для вычисления самого закрытого ключа.

Восстановленный закрытый ключ обеспечивает полный контроль над адресом BTC и связанными с ним средствами.

8.3 Типы уязвимостей, используемые BTCDetect

BTCDetect использует следующие основные типы уязвимостей для восстановления утерянных биткойн-кошельков:

  1. Ошибки генерации nonce: Если nonce (одноразовое число, используемое в подписи ECDSA) генерируется с недостаточной энтропией или повторяется, это может привести к восстановлению приватного ключа.
  2. Слабые подписи (короткие подписи): Некорректная реализация может генерировать подписи, которые не полностью покрывают пространство возможных значений.
  3. Проблемы с валидацией: Неполная проверка корректности подписей может позволить обойти определённые защиты.

8.4 Процесс восстановления ключа через BTCDetect

BTCDetect обнаруживает и использует эти уязвимости, анализируя подписи и криптографические данные, применяя методы криптоанализа для восстановления закрытых ключей. Процесс включает:

  1. Анализ подписей: BTCDetect собирает несколько подписей, созданные с помощью одного приватного ключа.
  2. Выявление паттернов: Программа анализирует эти подписи в поиске пропорций, которые указывают на ошибки в генерации nonce или другие слабости.
  3. Криптоанализ: Используя методы линейной алгебры и модульной арифметики, BTCDetect вычисляет возможный приватный ключ.
  4. Верификация: Восстановленный ключ проверяется путём генерации соответствующего публичного ключа и Bitcoin адреса.
  5. Восстановление контроля: После верификации пользователь может восстановить полный контроль над кошельком.

8.5 Отличие BTCDetect от традиционных методов восстановления

BTCDetect работает на уровне уязвимости криптографической реализации, что отличает его от традиционных методов восстановления:

МетодТребуетВозможностиSeed фраза (BIP-39)24 или 12 слов мнемоникиВосстановление всех ключей в иерархииРезервные копии (wallet.dat)Файл wallet.datВосстановление всех кошельковПрямой ввод ключейПриватный ключ (WIF или HEX)Контроль над конкретным адресомBTCDetectНесколько подписей или история транзакцийВосстановление ключей без исходных данных для восстановления

8.6 Архитектура BTCDetect

BTCDetect состоит из следующих основных компонентов:

  • Сборщик данных: Собирает подписи, публичные ключи и данные из блокчейна Bitcoin.
  • Анализатор подписей: Анализирует ECDSA подписи в поиске уязвимостей.
  • Криптоанализатор: Выполняет математический анализ для восстановления приватного ключа.
  • Верификатор: Проверяет корректность восстановленного ключа.
  • Инструмент восстановления: Предоставляет возможность экспорта и использования восстановленного ключа.

8.7 Практическое применение BTCDetect

BTCDetect используется для:

  • Криптоанализа: Выявления уязвимостей в криптографических реализациях.
  • Восстановления кошельков: Восстановления доступа к потерянным Bitcoin кошельков при наличии уязвимостей.
  • Форензических анализов: Анализа скомпрометированных кошельков для выявления источника утечки.
  • Исследований безопасности: Проверки криптографических библиотек на предмет слабостей.
-8

9. Контрмеры и рекомендации

9.1 Немедленные действия для пострадавших пользователей

⚠️ Для пользователей, которые создали Bitcoin кошельки с использованием Libbitcoin Explorer 3.x:

  1. Немедленная миграция средств:Создать новый кошелек с использованием криптографически безопасного метода генерации энтропии
    Перевести все средства на новый адрес
    Уничтожить или использовать старый адрес только для мониторинга
  2. Проверка компрометации:Использовать инструменты анализа для проверки, не был ли конкретный адрес скомпрометирован
    Проверить, нет ли неавторизованных
    транзакций из кошелька
  3. Восстановление потерянных средств:Если кошелек был создан в известную дату, можно использовать методы восстановления для получения приватного ключа
    Перевести восстановленные средства на безопасный кошелек

9.2 Улучшения для разработчиков

9.2.1 Использование криптографически безопасного PRNG (CSPRNG)

Требования к генерации энтропии:

  • Linux/macOS: /dev/urandom или getrandom()
  • Windows: CryptGenRandom() или современные API
  • C++: std::random_device (с предостережением о реализации)
  • Python: os.urandom(), secrets модуль

Правильный способ генерации энтропии на C++:

#include <fstream> #include <array> void secure_random_bytes(uint8_t* buf, size_t len) { std::ifstream urandom("/dev/urandom", std::ios::in | std::ios::binary); if (!urandom) throw std::runtime_error("Cannot open /dev/urandom"); urandom.read(reinterpret_cast<char*>(buf), len); if (urandom.gcount() != static_cast<std::streamsize>(len)) throw std::runtime_error("Read error from /dev/urandom"); } // Generate a protected private key std::array<uint8_t, 32> secret; secure_random_bytes(secret.data(), secret.size());

9.2.2 Минимальные требования к энтропии

  • Для Bitcoin приватных ключей: 256 бит минимум
  • Для BIP-39 мнемоники: 128-256 бит в зависимости от длины (12 или 24 слова)

9.2.3 Валидация и верификация

  • Проверка, что сгенерированный приватный ключ находится в допустимом диапазоне: 1 ≤ k < n
  • Использование детерминированных методов подписи (RFC 6979) для ECDSA

9.2.4 Очистка памяти

  • Использование mlock() для защиты критических данных от доступа
  • Явная очистка памяти после использования (заполнение нулями)
  • Использование специализированных библиотек для работы с криптографическими секретами (например, libsodium)

9.3 Обновления стандартов и лучшие практики

  1. BIP-32 (Hierarchical Deterministic Wallets):Добавить явное требование о использовании 256+ бит энтропии
    Рекомендовать использование аппаратных генераторов случайных чисел
  2. BIP-39 (Mnemonic Code):Рекомендовать минимальную длину мнемоники (24 слова для максимальной безопасности)
    Указать на необходимость использования
    CSPRNG
  3. BIP-44 (Multi-account Hierarchy):Добавить рекомендации по безопасности при реализации иерархии деривации
    Использование встроенных генераторов истинных случайных чисел (TRNG) с сертификацией EAL6+

9.4 Рекомендации для производителей аппаратных кошельков

Стандарты безопасности для аппаратных кошельков:

  • Все аппаратные кошельки должны быть оснащены безопасными элементами (SE) со встроенными генераторами истинных случайных чисел (TRNG)
  • Компоненты должны быть сертифицированы по уровню безопасности EAL6+
  • Криптографическая изоляция ключевых операций в защищённых элементах (Secure Element)
  • Регулярный аудит безопасности от независимых экспертов

10. Выводы и перспективы исследований

10.1 Ключевые выводы исследования

Уязвимость CVE-2023-39910 (Milk Sad) демонстрирует критическую важность правильной генерации энтропии в криптографических приложениях. Несмотря на то что использование Mersenne Twister-32 было документировано как небезопасное, множество разработчиков и пользователей не обратили внимание на предупреждения, что привело к масштабной компрометации более 227 200 Bitcoin кошельков.

Основные выводы:

  1. Энтропия — фундамент безопасности: Невозможно создать криптографически безопасную систему с использованием слабого генератора случайных чисел.
  2. Важность стандартизации: Неправильная реализация даже хорошо известных стандартов (BIP-32/39/44) может привести к катастрофическим результатам.
  3. Образование и информирование: Разработчики должны быть осведомлены о различиях между PRNG и CSPRNG, а пользователи — о рисках использования инструментов с неправильной энтропией.
  4. Постоянный мониторинг: Существует необходимость в постоянном анализе блокчейна для обнаружения аномальных паттернов и атак.
  5. Восстановление и возмещение: Атака Milk Sad показала возможность восстановления потерянных кошельков, однако это требует этического и юридического подхода к проблеме владения восстановленными средствами.

10.2 Математические законы критической уязвимости

Уязвимость может быть выражена через следующие математические соотношения:

Attack efficiency = log₂(2^32) / log₂(2^256)
= 32 / 256 = 0.125 = 12.5%

Это означает, что пространство поиска сокращается на 87.5%

10.3 Перспективы исследований

Будущие направления исследований включают:

  • Анализ других PRNG: Исследование других используемых генераторов (LCG, PCG и т.д.) на предмет криптографических уязвимостей.
  • Квантовая безопасность: Разработка постквантовых методов генерации энтропии для защиты от квантовых компьютеров.
  • Аппаратные генераторы случайных чисел: Оптимизация и внедрение более дешевых и доступных TRNG.
  • Автоматизированное обнаружение уязвимостей: Развитие инструментов для автоматического обнаружения слабых генераторов в криптографических библиотеках.

10.4 Итоговое заключение

Криптографические системы и ошибки реализации связаны не с теоретической зрелостью, а с банальными инженерными просчетами. Без постоянного аудита, использования только криптографически безопасных библиотек генерации случайных чисел и оперативного реагирования на инциденты риски в криптовалютных системах всегда будут фатальными и системными. Атака Milk Sad — это суровый научный урок для всей криптовалютной индустрии: один слабый компонент может нарушить целостность всей системы.

References:

  1. Polycurve Extraction Attack: A polycurve extraction attack (CVE-2023-39910) leads to private key recovery and theft of Bitcoin funds, where an attacker is able to gain control of BTC funds through a libbitcoin flaw. Polycurve Extraction Attack The core of the libbitcoin crypto library contains a critical vulnerability: an elliptic curve point received from outside the library fails a full mathematical check to determine…Read More
  2. Mnemonic Drain Attack: Industrial BIP39 Mnemonic Phrase RAM Leakage escalates a global attack on the Bitcoin network through uncleaned RAM memory, where an attacker uses a mnemonic drain to siphon control of Bitcoins into the wrong hands, gaining complete control of BTC funds. From Mnemonic Drain Attack Mnemonic Drain Attack: This unforgettable attack is based on the idea of ​​»sucking» BIP39 secrets directly from crypto wallets through vulnerabilities in the processing of mnemonics, seed…Read More
  3. Entropy Collapse Attack: A critical entropy failure in Electrum v1 leads to the compromise of private keys over Bitcoin funds, where an attacker overflows the decoding of mnemonics, leading to the total recovery of the crypto wallet seed. Entropy Collapse Attack At the heart of a blockchain system, where every private key and recovery phrase is trusted by millions, an attacker causes a veritable «energy collapse.» Exploiting a…Read More
  4. BitShredder Attack: Memory vulnerability turns lost Bitcoin wallets into trophies and complete BTC theft via private key recovery, where attackers exploit the memory phantom attack (CVE-2025-8217, CVE-2013-2547) BitShredder Attack BitShredder Attack silently infiltrates the memory of a running cryptocurrency wallet. When a wallet is generated or restored, it scans uncleared fragments of RAM, searching for any remnants…Read More
  5. Script Mirage Attack: Recovering private keys of lost Bitcoin wallets during a total fund hijacking attack and completely stealing BTC from compromised wallets, where the attacker uses block filters to extract hidden private elements from transaction scripts Script Mirage Attack Script Mirage is an exploit in which an attacker cleverly exploits the semi-transparency of block filters to extract hidden private elements from transaction scripts. During the construction…Read More
  6. Entropy Cascade Attack: How invisible memory cascades lead to complete compromise of Bitcoin wallet private keys and total loss of BTC, where an attacker exploits the CVE-2023-39910 vulnerability in BIP39 seed processing in swap spaces. Entropy Cascade Attack Attack Description :The «Entropy Cascade» attack exploits insecure memory operations when processing BIP39 seed phrases and cryptographic entropy, allowing an attacker to recover private keys from invisible cascaded…Read More
  7. ChainPredictor Attack: Recovering private keys and taking control of lost Bitcoin wallets through random number predictability, where an attacker can pre-compute “random” values ​​of insufficient entropy of a predictable PRNG initialization ChainPredictor Attack ChainPredictor is an attack on cryptocurrency systems based on the predictability of a pseudorandom number generator. The attack utilizes a pre-calculated seed, which allows the attacker to anticipate…Read More
  8. Bitflip Oracle Rush Attack: A critical attack on AES-256-CBC in Bitcoin Core and a compromise of wallet.dat, where an attacker uses a flaw in the implementation of AEAD, HMAC, and the failure to decrypt without authentication to turn Bitcoin Core into an oracle for leaking private keys in order to steal BTC coins «Bitflip Oracle Rush Attack» Attack Description:The attacker skillfully manipulates bytes in the encrypted wallet.dat Bitcoin Core file, bit-flipping individual bits in each AES-256-CBC ciphertext block. By using the system’s responses…Read More
  9. ChronoForge Attack: Gradual private key recovery through timing side channels, where an attacker exploits a critical timing vulnerability in the Bitcoin Core crypto wallet to reveal sensitive data ChronoForge Attack The ChronoForge attack exploits a variable-time vulnerability in elliptic curve operations in the BIP324 protocol implementation and ellswift decoding. By measuring minute differences in the execution time of…Read More
  10. PulseProbe Attack: Private key recovery and stealth hijacking of Bitcoin cryptocurrency, where an attacker injects benchmark code that enables the extraction of secret data by analyzing the obtained timing patterns PulseProbe Attack The «PulseProbe attack» uses precise microbenchmarks to probe the execution time of cryptographic functions. The attacker injects benchmark code that performs a series of high-frequency timing measurements, tracking…Read More
  11. Pattern Forge Attack: A critical randomness vulnerability and method for recovering private keys in compromised Bitcoin wallets when entropy becomes a predictable generator pattern allows an attacker to massively empty crypto wallets Pattern Forge Attack A pattern forge attack exploits the use of a deterministic random number generator to generate private keys and other secret data. As a result, the sequence of supposedly…Read More
  12. Chameleon Twist Attack: A scientific analysis of private key threats when manipulating scriptSig and TXID, where the attacker uses null bytes and incorrect transaction mutability signatures, and recovering lost BTC wallets Chameleon Twist Attack The chameleon is a symbol of mutability and disguise, reflecting the essence of ScriptSig manipulation and the ability to “rename” a transaction identifier without changing the essence…Read More
  13. Quantum Prism Extractor Attack: A catastrophic vulnerability in random number generators and recovery of private keys of lost Bitcoin wallets, where an attacker identifies signatures with identical or weakly random nonces by mathematically recovering the private key data of Bitcoin users Quantum Prism Extractor Attack The Quantum Prism Extractor Attack is a spectacular attack on cryptographic applications that utilize predictable pseudorandom number generators (PRNGs) in key areas, such as generating private keys, time…Read More
  14. KeyBlaze Attack: Cryptographic collapse and private key recovery as a tool for total compromise of the Bitcoin network and complete seizure of funds from lost crypto wallets, where the attacker gains unauthorized access to the transaction and withdraws BTC coins KeyBlaze Attack The KeyBlaze attack represents a particularly critical threat due to the improper handling of private key material in Bitcoin’s code. It could lead to a complete compromise of…Read More
  15. Crystal Key Exposure Attack: End-to-end filter transparency and complete BTC asset theft by an attacker through the predictability of SipHash and GCS filters reveals private crypto wallet keys, secret transactions, and leads to loss of control over Bitcoin assets Crystal Key Exposure Attack A Crystal Key Exposure Attack is a method that allows an attacker to reproduce filter keys and analyze the contents of blocks and user addresses with high…Read More
  16. Pulse Rerun Attack: Bitcoin’s Achilles’ Heel: How a Nonce Leak Leads to Private Key Recovery and Crypto Wallet Compromises Attackers Can Build a Mathematical Chain to Recover the Initial Private Key Data and Withdraw All BTC Coins Pulse Rerun Attack This attack exploits the careless reuse of the same nonce (pulse) in cryptographic operations or signatures. By repeating the same nonce, the system «feeds» the validation process…Read More
  17. Master Key Attack: How a single line of code turns Bitcoin into a hacker’s prey, where Hardcoded Private Key leads to the instant loss of control over all BTC funds using hardcoded private keys, with complete takeover of the crypto wallet’s Bitcoin network Master Key Attack The entire test environment becomes fully controlled by a single private key, hardcoded into the code. A single master key grants complete power: it can create, sign,…Read More
  18. Double Forge Attack: Restoring control over lost crypto wallets through Bitcoin Core’s inflation vulnerability, where an attacker contributes to the creation of extra coins on the network: CVE-2018-17144 as a phenomenon for restoring other people’s private keys in Bitcoin Double Forge Attack A «Double Forge Attack » is a critical vulnerability in Bitcoin Core where an attacker with sufficient computing power can create special blocks containing a transaction that double-spends…Read More
  19. Linear Summoner Attack: How an LFSR Generator Vulnerability Opens the Way to Private Key Recovery, Where an Attacker Gains Total Control of Bitcoin Wallets by Running the Berlekamp-Messi Algorithm CVE-2024-35202, CVE-2024-52922 Linear Summoner Attack The «Linear Summoner Attack» is a cryptographic attack on a weak LFSR generator implementation in systems where memory allocation/deallocation patterns predictably depend on the internal register state. The…Read More
  20. Resonance Twist Attack: A method for stealthily hacking and recovering private keys for lost Bitcoin wallets, where an attacker can change the TXID and double-spend, completely stealing the victim’s BTC funds Resonance Twist Attack A «resonant break attack» exploits a cryptographic phenomenon—changing a transaction identifier (TXID) before it’s confirmed. The attacker introduces minor changes to the witness data or signature encoding…Read More
  21. Spectral Fountain Attack: Mass recovery of private keys to lost Bitcoin wallets via a predictable random number generator (PRNG) exploit, where CVE-2025-27840 unstable entropy in hardware wallets paved the way for an attacker to unauthorized withdrawal of BTC funds Spectral Fountain Attack «Spectral Fountain Attack » exploits the predictability of a deterministic random number generator to continuously and easily extract cryptographic secrets. Within the target system, where the PRNG is…Read More
  22. NullStream Attack: How Poly1305’s malicious null-key channel destroys authentication and recovers lost Bitcoin wallets. Leading to complete compromise of private keys. It is known that the attacker uses the null key to calculate the MAC address. NullStream Attack NullStream Attack is a cryptographic attack in which a malicious actor easily turns the Poly1305 message authentication mechanism into a transparent channel for injecting fake data. The critical vulnerability…Read More
-9

Данный материал создан для портала CRYPTO DEEP TECH для обеспечения финансовой безопасности данных и криптографии на эллиптических кривых secp256k1 против слабых подписей ECDSA в криптовалюте BITCOIN. Создатели программного обеспечения не несут ответственность за использование материалов.

Crypto Tools

Исходный код

Google Colab

Telegram: https://t.me/cryptodeeptech

Видеоматериал: https://youtu.be/KJNbwfolL6g

Video tutorial: https://dzen.ru/video/watch/69431d5dfd50136dae291001

Источник: https://cryptodeeptool.ru/ringside-replay-attack

-10

Криптоанализ