블록체인의 첫 번째 심각한 취약점과 RawTX 파일에서 공개 키 비트코인 ​​ECDSA RSZ 값을 가져오는 방법

크립토 딥 테크

이 글에서는 비트코인 ​​블록체인에서 서명 값을 추출하는 것에 대해 이야기할 것입니다   . 하지만 먼저 Niels Schneider   (  일명   tcatm   )ECDSA R, S, Z  가 발견한 블록체인 거래의 아주 첫 번째 심각한 취약점을 기억해 보겠습니다. Nils Schneider 

비트코인 개발자이자   “BitcoinWatch”   와   “BitcoinCharts”의 소유자입니다.

4.1 비트코인에 대한 위험한 무작위 공격의 역사
4.1 비트코인에 대한 위험한 무작위 공격의 역사

문서   [PDF]:  개인 키 복구 조합 공격: RNG 이벤트가 부족한 상황에서 인기 있는 비트코인 ​​키 관리, 지갑 및 콜드 스토리지 솔루션의 극심한 취약성에 관하여 

2012년 12월 25일,   닐스는 일부 비트코인 ​​블록체인 거래에서 잠재적인 취약점을 발견했습니다.

이 거래를 살펴보세요:

transaction: 9ec4bc49e828d924af1d1029cacf709431abbde46d59554b62bc270e3b29c4b1


블록체인의 첫 번째 심각한 취약점과 RawTX 파일에서 공개 키 비트코인 ​​ECDSA RSZ 값을 가져오는 방법

input script 1:
30440220d47ce4c025c35ec440bc81d99834a624875161a26bf56ef7fdc0f5d52f843ad1022044e1ff2dfd8102cf7a47c21d5c9fd5701610d04953c6836596b4fe9dd2f53e3e0104dbd0c61532279cf72981c3584fc32216e0127699635c2789f549e0730c059b81ae133016a69c21e23f1859a95f06d52b7bf149a8f2fe4e8535c8a829b449c5ff

input script 2:
30440220d47ce4c025c35ec440bc81d99834a624875161a26bf56ef7fdc0f5d52f843ad102209a5f1c75e461d7ceb1cf3cab9013eb2dc85b6d0da8c3c6e27e3a5a5b3faa5bab0104dbd0c61532279cf72981c3584fc32216e0127699635c2789f549e0730c059b81ae133016a69c21e23f1859a95f06d52b7bf149a8f2fe4e8535c8a829b449c5ff

이 거래에는 두 개의 입력과 하나의 출력이 있습니다.
두 개의 입력 스크립트를 자세히 살펴보면 시작과 끝에 꽤 많은 동일한 바이트가 있음을 알 수 있습니다.
끝의 바이트는 코인이 사용되는 주소의 16진수 인코딩된 공개 키이므로 아무런 문제가 없습니다.
그러나 스크립트의 전반부는 실제 서명입니다   (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

파이썬 스크립트: vulnerabilityR.py
파이썬 스크립트: vulnerabilityR.py

pG는 비트코인이 사용하는 곡선의 매개변수    일 뿐입니다  secp256k1.

계산을 위한 필드를 만들어 보겠습니다.

K = GF(p)
K((z1*s2 - z2*s1)/(r*(s1-s2)))

스크립트를 실행해 보겠습니다. python3 vulnerabilityR.py

다음으로, 우리의 스크립트:   vulnerabilityR.py는   이 필드의 개인 키를  계산할 것입니다   :

ADDR: 1BFhrfTTZP3Nw4BNy4eX4KFLsn9ZeijcMm
WIF:  5KJp7KEffR7HHFWSFYjiCUAntRSTY69LAQEX1AUzaSBHHFdKEpQ
hex:  c477f9f65c22cce20657faa5b2d1d8122336f851a508a1ed04e479c34985bf96

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/

이제 01BlockchainGoogleDrive  에서 얻은   “RawTX.json” 파일 에서   공개 키   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

우리는     파일에서  4줄을 가져오기 때문에 그것을 엽니다.ЦИКЛindex.json {1..4}

export LINE=1 ; sed -n "${LINE}p" index.json > index2.json

유틸리티는   라인 #1을export  가져와     새 파일에 저장합니다. index2.json

sed -i '1d' index.json

이 유틸리티는    파일에서  줄 #1을 sed  제거합니다   .index.json

echo 유틸리티는 우리를 위해 fileopen.py라는 Python 스크립트를 생성합니다.
echo 유틸리티는 우리를 위해 fileopen.py라는 Python 스크립트를 생성합니다.
python3 fileopen.py

Python 스크립트를  실행하고   fileopen.py  성공적으로 새로운   Bash 스크립트를 생성합니다  . signscript.sh

chmod +x signscript.sh
./signscript.sh

우리는 Bash 스크립트인  signscript.sh 에 대한 권한을 얻습니다   .

결과적으로  breakECDSA.py  Python 스크립트가   시작되어 결국 Bitcoin의 값과 공개 키를 추출합니다.RawTXR, S, Z

이 모든 내용은 파일에 저장됩니다. "signatures.json"

파일: "signatures.json" 비트코인 ​​공개 키 및 R, S, Z 값
파일: “signatures.json” 비트코인 ​​공개 키 및 R, S, Z 값
rm signscript.sh
rm fileopen.py

이 유틸리티는   Python 스크립트를rm  제거하고     새로운   Bash 스크립트를 성공적으로 생성합니다  .  fileopen.pysignscript.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

출처: https://cryptodeeptech.ru/break-ecdsa-cryptography

 암호 분석

От