eth_keygen/ethkeygen.py

76 lines
2.3 KiB
Python

#!/usr/bin/python3
# Eth ECDSA key generator for web3 hacking
# Author: six
# require(owner() == ecrecover(keccak256(abi.encodePacked(this, tokenId)), v, r, s), "Should be signed correctly");
# https://privatekeys.pw/keys/ethereum/1
from web3.auto import w3
from eth_account.messages import encode_defunct
#def sign_mint():
msg = "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf"
msg = "1"
msg = "1659023558XXX" # unix time
private_key = "0000000000000000000000000000000000000000000000000000000000000001" # <- hex | pub -> 0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf
message = encode_defunct(text=msg)
signed_message = w3.eth.account.sign_message(message, private_key=private_key)
print("Public key: 0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf")
print("Private key: 0000000000000000000000000000000000000000000000000000000000000001")
print(msg)
print("Signed message: ")
#print(type(signed_message))
print(signed_message)
print("\n Recovered message: ")
print(w3.eth.account.recover_message(message, signature=signed_message.signature))
#sign_mint()
from web3 import Web3
# ecrecover in Solidity expects v as a native uint8, but r and s as left-padded bytes32
# Remix / web3.js expect r and s to be encoded to hex
# This convenience method will do the pad & hex for us:
def to_32byte_hex(val):
return Web3.toHex(Web3.toBytes(val).rjust(32, b'\0'))
ec_recover_args = (msghash, v, r, s) = (
Web3.toHex(signed_message.messageHash),
signed_message.v,
to_32byte_hex(signed_message.r),
to_32byte_hex(signed_message.s),)
print("\n Recovered args (msghash, v, r, s):")
print(ec_recover_args)
# https://privatekeys.pw/keys/ethereum/1
# https://web3py.readthedocs.io/en/stable/web3.eth.account.html?highlight=sign#sign-a-message
# w3.eth.account.recover_message(message, signature=signed_message.signature)
#'0x5ce9454909639D2D17A3F753ce7d93fa0b9aB12E'
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def hello():
return 'Lets play a game... move to /verify and ? is the private key if: '
@app.route('/verify', methods=['GET'])
def search():
args = request.args
args.get("v", default="", type=str)
print(args)
#0000000000000000000000000000000000000000000000000000000000000001
return args
#if __name__ == '__main__':
# app.run(debug=False)