import random, hashlib, sys
N = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
B58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
def gen_priv():
while True:
k = random.getrandbits(256)
if 0 < k < N:
return k
def to_hex32(k): return format(k, '064x')
def to_bin256(k): return format(k, '0256b')
def base58_encode(b: bytes):
num = int.from_bytes(b, 'big')
if num == 0:
return '1' * len(b)
s = ""
while num > 0:
num, r = divmod(num, 58)
s = B58[r] + s
n_pad = 0
for x in b:
if x == 0:
n_pad += 1
else:
break
return '1'*n_pad + s
def base58check(payload: bytes):
chk = hashlib.sha256(hashlib.sha256(payload).digest()).digest()[:4]
return base58_encode(payload + chk)
def wif_from_int(k, compressed=True):
p = b'\x80' + k.to_bytes(32, 'big')
if compressed:
p += b'\x01'
return base58check(p)
def main():
n = 1
if len(sys.argv) > 1:
try:
n = max(1, int(sys.argv[1]))
except:
n = 1
for i in range(n):
priv = gen_priv()
print("=== Key #{} ===".format(i+1))
print("Hex (32 bytes):", to_hex32(priv))
print("Dec:", priv)
print("Bin (256-bit):", to_bin256(priv))
print("WIF (compressed):", wif_from_int(priv, True))
print()
if __name__ == "__main__":
main()
aW1wb3J0IHJhbmRvbSwgaGFzaGxpYiwgc3lzCgoKTiA9IDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkVCQUFFRENFNkFGNDhBMDNCQkZEMjVFOENEMDM2NDE0MQpCNTggPSAiMTIzNDU2Nzg5QUJDREVGR0hKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamttbm9wcXJzdHV2d3h5eiIKCmRlZiBnZW5fcHJpdigpOgogICAgd2hpbGUgVHJ1ZToKICAgICAgICBrID0gcmFuZG9tLmdldHJhbmRiaXRzKDI1NikKICAgICAgICBpZiAwIDwgayA8IE46CiAgICAgICAgICAgIHJldHVybiBrCgpkZWYgdG9faGV4MzIoayk6IHJldHVybiBmb3JtYXQoaywgJzA2NHgnKQpkZWYgdG9fYmluMjU2KGspOiByZXR1cm4gZm9ybWF0KGssICcwMjU2YicpCgpkZWYgYmFzZTU4X2VuY29kZShiOiBieXRlcyk6CiAgICBudW0gPSBpbnQuZnJvbV9ieXRlcyhiLCAnYmlnJykKICAgIGlmIG51bSA9PSAwOgogICAgICAgCiAgICAgICAgcmV0dXJuICcxJyAqIGxlbihiKQogICAgcyA9ICIiCiAgICB3aGlsZSBudW0gPiAwOgogICAgICAgIG51bSwgciA9IGRpdm1vZChudW0sIDU4KQogICAgICAgIHMgPSBCNThbcl0gKyBzCiAgICAKICAgIG5fcGFkID0gMAogICAgZm9yIHggaW4gYjoKICAgICAgICBpZiB4ID09IDA6CiAgICAgICAgICAgIG5fcGFkICs9IDEKICAgICAgICBlbHNlOgogICAgICAgICAgICBicmVhawogICAgcmV0dXJuICcxJypuX3BhZCArIHMKCmRlZiBiYXNlNThjaGVjayhwYXlsb2FkOiBieXRlcyk6CiAgICBjaGsgPSBoYXNobGliLnNoYTI1NihoYXNobGliLnNoYTI1NihwYXlsb2FkKS5kaWdlc3QoKSkuZGlnZXN0KClbOjRdCiAgICByZXR1cm4gYmFzZTU4X2VuY29kZShwYXlsb2FkICsgY2hrKQoKZGVmIHdpZl9mcm9tX2ludChrLCBjb21wcmVzc2VkPVRydWUpOgogICAgcCA9IGInXHg4MCcgKyBrLnRvX2J5dGVzKDMyLCAnYmlnJykKICAgIGlmIGNvbXByZXNzZWQ6CiAgICAgICAgcCArPSBiJ1x4MDEnCiAgICByZXR1cm4gYmFzZTU4Y2hlY2socCkKCmRlZiBtYWluKCk6CiAgIAogICAgbiA9IDEKICAgIGlmIGxlbihzeXMuYXJndikgPiAxOgogICAgICAgIHRyeToKICAgICAgICAgICAgbiA9IG1heCgxLCBpbnQoc3lzLmFyZ3ZbMV0pKQogICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgbiA9IDEKCiAgICBmb3IgaSBpbiByYW5nZShuKToKICAgICAgICBwcml2ID0gZ2VuX3ByaXYoKQogICAgICAgIHByaW50KCI9PT0gS2V5ICN7fSA9PT0iLmZvcm1hdChpKzEpKQogICAgICAgIHByaW50KCJIZXggKDMyIGJ5dGVzKToiLCB0b19oZXgzMihwcml2KSkKICAgICAgICBwcmludCgiRGVjOiIsIHByaXYpCiAgICAgICAgcHJpbnQoIkJpbiAoMjU2LWJpdCk6IiwgdG9fYmluMjU2KHByaXYpKQogICAgICAgIHByaW50KCJXSUYgKGNvbXByZXNzZWQpOiIsIHdpZl9mcm9tX2ludChwcml2LCBUcnVlKSkKICAgICAgICBwcmludCgpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbWFpbigpCg==