我們都知道,ECDSA 簽名中的秘鑰洩露可以導致比特幣錢包的完全恢復。在我們之前的文章中,我們研究了區塊鏈交易中的弱點和漏洞,但也有 ECDSA 短簽名也導致比特幣錢包的完全恢復。
為什麼這些 ECDSA 簽名被稱為短簽名?
你可以從討論的話題中得到這個問題的答案:“最短的ECDSA簽名”【The shortest ECDSA signature】
在我們的上一篇文章:“使用 ECPy + Google Colab 庫通過標量乘法減少私鑰”中,我們創建了一個Python腳本:maxwell.py,它為我們生成了一個相當有趣的公鑰

(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
讓我們繼續實驗部分,更詳細地分析用於恢復比特幣錢包的所有腳本
讓我們使用“09BitcoinWalletRecovery”存儲庫。
git clone https://github.com/demining/CryptoDeepTools.git
cd CryptoDeepTools/09BitcoinWalletRecovery/
ls

安裝所有必要的模塊:
bitcoin
ecdsa
utils
base58
pip2 install -r requirements.txt

使用breakECDSA.py腳本,我們從
RawTX
簽名 [R, S, Z]
python2 breakECDSA.py 0100000001afddd5c9f05bd937b24a761606581c0cddd6696e05a25871279f75b7f6cf891f250000005f3c303902153b78ce563f89a0ed9414f5aa28ad0d96d6795f9c6302200a963d693c008f0f8016cfc7861c7f5d8c4e11e11725f8be747bb77d8755f1b8012103151033d660dc0ef657f379065cab49932ce4fb626d92e50d4194e026328af853ffffffff010000000000000000016a00000000 > signatures.txt
結果將保存到一個文件中:signatures.txt
讓我們打開文件:PublicKeys.txt
cat signatures.txt

R = 0x00000000000000000000003b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63
S = 0x0a963d693c008f0f8016cfc7861c7f5d8c4e11e11725f8be747bb77d8755f1b8
Z = 0x521a65420faa5386d91b8afcfab68defa02283240b25aeee958b20b36ddcb6de
正如我們從上一篇文章中了解到的,我們知道生成簽名的密鑰 R

在我們的例子中,密鑰是
(Nonce)
:
0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0 --> 0x3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63, 0x3f3979bf72ae8202983dc989aec7f2ff2ed91bdd69ce02fc0700ca100e59ddf3
簽名:
K = 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0
R = 0x00000000000000000000003b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63
S = 0x0a963d693c008f0f8016cfc7861c7f5d8c4e11e11725f8be747bb77d8755f1b8
Z = 0x521a65420faa5386d91b8afcfab68defa02283240b25aeee958b20b36ddcb6de
現在我們知道 ] 的值,
[K, R, S, Z
我們可以使用公式獲取私鑰並恢復比特幣錢包。
要獲取私鑰,我們將使用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

讓我們打開 bitaddress 並檢查:
ADDR: 15HvLBX9auG2bJdLCTxSvjvWvdgsW7BvAT
WIF: L3LxjEnwKQMFYNYmCGzM1TqnwxRDi8UyRzQpVfmDvk96fYN44oFG
HEX: b6c1238de89e9defea3ea0712e08726e338928ac657c3409ebb93d9a0873797f

找到私鑰!
比特幣錢包恢復了!

Короткие подписи ECDSA
是丟失硬幣的潛在威脅BTC
,因此我們強烈建議大家始終更新軟件並僅使用經過驗證的設備。
該視頻是為 CRYPTO DEEP TECH門戶網站創建的 ,以確保橢圓曲線上的數據和密碼學的金融安全性 免受 加密貨幣中 secp256k1
弱簽名的影響 ECDSA
BITCOIN
電報: https: //t.me/cryptodeeptech
視頻素材:https://youtu.be/xBgjWE5tA7Y
來源:https://cryptodeep.ru/shortest-ecdsa-signature
