def verify(cls, cpubkey, signature, message): '''refer:https://github.com/cityofzion/neo-python/neo/Cryptography/Crypto.py''' bitcoin.change_curve( int("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", 16), int("FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", 16), int("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", 16), int("5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", 16), int("6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", 16), int("4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", 16) ) try: pubkey = cls.uncompress_pubkey(cpubkey) pubkey = binascii.unhexlify(pubkey)[1:] except Exception as e: return False,'wrong publickey' try: m = binascii.unhexlify(message) except Exception as e: return False,"wrong transaction" try: s = binascii.unhexlify(signature) except Exception as e: return False,'wrong signature' try: vk = VerifyingKey.from_string(pubkey, curve=NIST256p, hashfunc=hashlib.sha256) res = vk.verify(s, m, hashfunc=hashlib.sha256) return res,'' except Exception as e: print('verify failth:%s' % e) return False,'failth'
def __init__(self, private_key: bytes): self.private_key = private_key self.public_key = None bitcoin.change_curve( 115792089210356248762697446949407573530086143415290314195533631308867097853951, 115792089210356248762697446949407573529996955224135760342422259061068512044369, 115792089210356248762697446949407573530086143415290314195533631308867097853948, 41058363725152142129326129780047268409114441015993725554835256314039467401291, 48439561293906451759052585252797914202762949526041747995844080717082404635286, 36134250956749795798585127919587881956611106672985015071877198253568414405109 ) length = len(self.private_key) if length != 32: raise ValueError("Invalid private key") if length == 32: try: pubkey_encoded_not_compressed = bitcoin.privkey_to_pubkey( private_key) pubkey_points = bitcoin.decode_pubkey( pubkey_encoded_not_compressed, 'bin') pubx = pubkey_points[0] puby = pubkey_points[1] self.public_key = cryptography.ECDSA.secp256r1().Curve.point( pubx, puby) except Exception: raise ValueError("Could not determine public key")
def setup_curve(self): bitcoin.change_curve( 115792089210356248762697446949407573530086143415290314195533631308867097853951, 115792089210356248762697446949407573529996955224135760342422259061068512044369, 115792089210356248762697446949407573530086143415290314195533631308867097853948, 41058363725152142129326129780047268409114441015993725554835256314039467401291, 48439561293906451759052585252797914202762949526041747995844080717082404635286, 36134250956749795798585127919587881956611106672985015071877198253568414405109 )
def reset_curve_to_eth(): # this is standart btc/eth params for curve # this function reset it because 1) this params is global in bitcoin-1.1.42 lib and 2) this params are changing in neo KeyPair init P = 2**256 - 2**32 - 977 N = 115792089237316195423570985008687907852837564279074904382605163141518161494337 A = 0 B = 7 Gx = 55066263022277343669578718895168534326250603453777594175500187360389116729240 Gy = 32670510020758816978083085130507043184471273380659243275938904335757337482424 bitcoin.change_curve(P, N, A, B, Gx, Gy)
def SetupSignatureCurve(): """ Setup the Elliptic curve parameters. """ bitcoin.change_curve( int("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", 16), int("FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", 16), int("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", 16), int("5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", 16), int("6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", 16), int("4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", 16) )
def setup_curve(self): # bitcoin.change_curve( # int("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", 16), # int("FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", 16), # int("FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", 16), # int("5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", 16), # int("6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", 16), # int("4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", 16) # ) bitcoin.change_curve( 115792089210356248762697446949407573530086143415290314195533631308867097853951, 115792089210356248762697446949407573529996955224135760342422259061068512044369, 115792089210356248762697446949407573530086143415290314195533631308867097853948, 41058363725152142129326129780047268409114441015993725554835256314039467401291, 48439561293906451759052585252797914202762949526041747995844080717082404635286, 36134250956749795798585127919587881956611106672985015071877198253568414405109 )
#!/usr/bin/env python from bitcoin import change_curve, fast_add, fast_multiply, inv import random # define a 16-bits curve (not secure) P = 10177 A = 1 B = P-1 G = (1,1) N = 10331 change_curve(P, N, A, B, G[0], G[1]) # generate private and public key k = random.randint(1, N) Q = fast_multiply(G, k) print("SEARCH - {0}".format(k)) # Pollard rho def new_xab(x, a, b): S = x[0] % 3 if S == 0: a = (a + 1) % N x = fast_add(x, G) elif S == 1: a = (a * 2) % N b = (b * 2) % N x = fast_add(x, x) elif S == 2: b = (b + 1) % N x = fast_add(x, Q)
def setUp(self): import bitcoin # reset Elliptic curve parameters to secp256k1 bitcoin.change_curve(bitcoin.P, bitcoin.N, bitcoin.A, bitcoin.B, bitcoin.Gx, bitcoin.Gy)