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==