fork download
  1. #!/usr/bin/env python3
  2. # Простіше не буває — працює в Python3 (Ideone)
  3. import random, hashlib, sys
  4.  
  5. # порядок secp256k1 (щоб ключ був валідним)
  6. N = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
  7. B58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
  8.  
  9. def gen_priv():
  10. while True:
  11. k = random.getrandbits(256)
  12. if 0 < k < N:
  13. return k
  14.  
  15. def to_hex32(k): return format(k, '064x')
  16. def to_bin256(k): return format(k, '0256b')
  17.  
  18. def base58_encode(b: bytes):
  19. num = int.from_bytes(b, 'big')
  20. if num == 0:
  21. # усе байти нулі -> "1" за кожен нуль
  22. return '1' * len(b)
  23. s = ""
  24. while num > 0:
  25. num, r = divmod(num, 58)
  26. s = B58[r] + s
  27. # leading zeros -> '1'
  28. n_pad = 0
  29. for x in b:
  30. if x == 0:
  31. n_pad += 1
  32. else:
  33. break
  34. return '1'*n_pad + s
  35.  
  36. def base58check(payload: bytes):
  37. chk = hashlib.sha256(hashlib.sha256(payload).digest()).digest()[:4]
  38. return base58_encode(payload + chk)
  39.  
  40. def wif_from_int(k, compressed=True):
  41. p = b'\x80' + k.to_bytes(32, 'big')
  42. if compressed:
  43. p += b'\x01'
  44. return base58check(p)
  45.  
  46. def main():
  47. # опційно: передай у argv кількість ключів, інакше 1
  48. n = 1
  49. if len(sys.argv) > 1:
  50. try:
  51. n = max(1, int(sys.argv[1]))
  52. except:
  53. n = 1
  54.  
  55. for i in range(n):
  56. priv = gen_priv()
  57. print("=== Key #{} ===".format(i+1))
  58. print("Hex (32 bytes):", to_hex32(priv))
  59. print("Dec:", priv)
  60. print("Bin (256-bit):", to_bin256(priv))
  61. print("WIF (compressed):", wif_from_int(priv, True))
  62. print()
  63.  
  64. if __name__ == "__main__":
  65. main()
  66.  
Success #stdin #stdout 0.1s 17628KB
stdin
Standard input is empty
stdout
=== Key #1 ===
Hex (32 bytes): bd346e159ca8a2a6e5978d87a7b325ea06fd52601130f04e48ab65796a3996bc
Dec: 85579764204360940423170700607418291485729455533024959578048164854830361843388
Bin (256-bit): 1011110100110100011011100001010110011100101010001010001010100110111001011001011110001101100001111010011110110011001001011110101000000110111111010101001001100000000100010011000011110000010011100100100010101011011001010111100101101010001110011001011010111100
WIF (compressed): L3ZVyFhrN7GXjnUWmg9T3LAXoGh4hre3bnAde1NBjiSgpHjERAuq