通過 ECDSA 短簽名恢復比特幣錢包

我們都知道,ECDSA 簽名中的秘鑰洩露可以導致比特幣錢包的完全恢復。在我們之前的文章中,我們研究了區塊鏈交易中的弱點和漏洞,但也有 ECDSA 短簽名也導致比特幣錢包的完全恢復。

為什麼這些 ECDSA 簽名被稱為短簽名?

你可以從討論的話題中得到這個問題的答案:“最短的ECDSA簽名”【The shortest ECDSA signature】

在我們的上一篇文章:“使用 ECPy + Google Colab 庫通過標量乘法減少私鑰”中,我們創建了一個Python腳本:maxwell.py,它為我們生成了一個相當有趣的公鑰

通過 ECDSA 短簽名恢復比特幣錢包
(0x3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63 , 0xc0c686408d517dfd67c2367651380d00d126e4229631fd03f8ff35eef1a61e3c)

我們知道簽名的值,"R"這是從私鑰到公鑰(Nonce)

看看區塊鏈交易:11e6b169701a9047f3ddbb9bc4d4ab1a148c430ba4a5929764e97e76031f4ee3

原始TX:

0100000001afddd5c9f05bd937b24a761606581c0cddd6696e05a25871279f75b7f6cf891f250000005f3c303902153b78ce563f89a0ed9414f5aa28ad0d96d6795f9c6302200a963d693c008f0f8016cfc7861c7f5d8c4e11e11725f8be747bb77d8755f1b8012103151033d660dc0ef657f379065cab49932ce4fb626d92e50d4194e026328af853ffffffff010000000000000000016a00000000

本次交易的規模僅為:156 байт

如何通過 ECDSA 短簽名恢復比特幣錢包?

在比特幣區塊鏈的密碼分析中,我們使用自己的Bas h腳本:btcrecover.sh

比特幣錢包恢復過程
比特幣錢包恢復過程

Bash 腳本:btcrecover.sh

sudo apt install python2-minimal

wget https://bootstrap.pypa.io/pip/2.7/get-pip.py

sudo python2 get-pip.py

pip2 install -r requirements.txt

chmod +x btcrecover.sh


 ./btcrecover.sh 12yysAMhagEm67QCX85p3WQnTUrqcvYVuk


 ./btcrecover.sh 15HvLBX9auG2bJdLCTxSvjvWvdgsW7BvAT

結果:

| privkey : addr |

讓我們打開 bitaddress 並檢查:

ac8d0abda1d32aaabff56cb72bc39a998a98779632d7fee83ff452a86a849bc1:12yysAMhagEm67QCX85p3WQnTUrqcvYVuk
b6c1238de89e9defea3ea0712e08726e338928ac657c3409ebb93d9a0873797f:15HvLBX9auG2bJdLCTxSvjvWvdgsW7BvAT

讓我們繼續實驗部分,更詳細地分析用於恢復比特幣錢包的所有腳本

打開 [TerminalGoogleColab]

讓我們使用“09BitcoinWalletRecovery”存儲庫。

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

cd CryptoDeepTools/09BitcoinWalletRecovery/

ls
通過 ECDSA 短簽名恢復比特幣錢包

安裝所有必要的模塊:

bitcoin
ecdsa
utils
base58

pip2 install -r requirements.txt
通過 ECDSA 短簽名恢復比特幣錢包

使用breakECDSA.py腳本,我們從RawTX簽名 [R, S, Z]

python2 breakECDSA.py 0100000001afddd5c9f05bd937b24a761606581c0cddd6696e05a25871279f75b7f6cf891f250000005f3c303902153b78ce563f89a0ed9414f5aa28ad0d96d6795f9c6302200a963d693c008f0f8016cfc7861c7f5d8c4e11e11725f8be747bb77d8755f1b8012103151033d660dc0ef657f379065cab49932ce4fb626d92e50d4194e026328af853ffffffff010000000000000000016a00000000 > signatures.txt

結果將保存到一個文件中:signatures.txt

讓我們打開文件:PublicKeys.txt

cat signatures.txt
通過 ECDSA 短簽名恢復比特幣錢包
R = 0x00000000000000000000003b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63
S = 0x0a963d693c008f0f8016cfc7861c7f5d8c4e11e11725f8be747bb77d8755f1b8
Z = 0x521a65420faa5386d91b8afcfab68defa02283240b25aeee958b20b36ddcb6de

正如我們從上一篇文章中了解到的,我們知道生成簽名的密鑰 R

通過 ECDSA 短簽名恢復比特幣錢包

在我們的例子中,密鑰是 (Nonce)

0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0 --> 0x3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63, 0x3f3979bf72ae8202983dc989aec7f2ff2ed91bdd69ce02fc0700ca100e59ddf3

簽名:

K = 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0
R = 0x00000000000000000000003b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63
S = 0x0a963d693c008f0f8016cfc7861c7f5d8c4e11e11725f8be747bb77d8755f1b8
Z = 0x521a65420faa5386d91b8afcfab68defa02283240b25aeee958b20b36ddcb6de

現在我們知道 ] 的值,[K, R, S, Z我們可以使用公式獲取私鑰並恢復比特幣錢包。

私鑰 = ((((S * K) - Z) *​​ modinv(R,N)) % N)

要獲取私鑰,我們將使用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


K = 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0
R = 0x00000000000000000000003b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63
S = 0x0a963d693c008f0f8016cfc7861c7f5d8c4e11e11725f8be747bb77d8755f1b8
Z = 0x521a65420faa5386d91b8afcfab68defa02283240b25aeee958b20b36ddcb6de


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

讓我們運行 Python 腳本:calculate.py

python3 calculate.py
PrivKey = b6c1238de89e9defea3ea0712e08726e338928ac657c3409ebb93d9a0873797f
PrivKey = b6c1238de89e9defea3ea0712e08726e338928ac657c3409ebb93d9a0873797f

讓我們打開 bitaddress 並檢查:

ADDR: 15HvLBX9auG2bJdLCTxSvjvWvdgsW7BvAT
WIF:  L3LxjEnwKQMFYNYmCGzM1TqnwxRDi8UyRzQpVfmDvk96fYN44oFG
HEX:  b6c1238de89e9defea3ea0712e08726e338928ac657c3409ebb93d9a0873797f
通過 ECDSA 短簽名恢復比特幣錢包

找到私鑰!

比特幣錢包恢復了!

通過 ECDSA 短簽名恢復比特幣錢包

Короткие подписи ECDSA丟失硬幣的潛在威脅 BTC因此我們強烈建議大家始終更新軟件並僅使用經過驗證的設備。

該視頻是為 CRYPTO DEEP TECH門戶網站創建的 ,以確保橢圓曲線上的數據和密碼學的金融安全性 免受 加密貨幣中 secp256k1 弱簽名的影響 ECDSABITCOIN

來源

電報:  https: //t.me/cryptodeeptech

視頻素材:https://youtu.be/xBgjWE5tA7Y

來源:https://cryptodeep.ru/shortest-ecdsa-signature

 密碼分析


Восстановление Биткоин Кошелька через короткие подписи ECDSA

Crypto Deep Tech