Search code examples
pythoncryptographyecdsa

Python : Create ECC Keys from private and public key represented in raw bytes


I have following ECC private and public key pairs:

Private key : 0x63bd3b01c5ce749d87f5f7481232a93540acdb0f7b5c014ecd9cd32b041d6f33

Public Key : 0x04017655e42a892cc71bccedcb1cd421d03530e1d7edb52cef143c5562c4c6f0129fa5a37738013e64a1ff0e6cb7068815a13000eb162cb7a0214dfcf3c8fa101c

Curve : SECP256R1

I want to load these keys in Python to perform signing operations. Can you please suggest possible steps?

(I am comfortable to use "openssl ec" tools if necessary.)


Solution

  • Here is a simple example (using python 3 + cryptography module) loading your key to sign/verify:

    from cryptography.hazmat.backends import default_backend
    from cryptography.hazmat.primitives import hashes, serialization
    from cryptography.hazmat.primitives.asymmetric import ec
    from cryptography.exceptions import InvalidSignature
    
    
    private_value = 0x63bd3b01c5ce749d87f5f7481232a93540acdb0f7b5c014ecd9cd32b041d6f33
    curve = ec.SECP256R1()
    signature_algorithm = ec.ECDSA(hashes.SHA256())
    
    # Make private and public keys from the private value + curve
    priv_key = ec.derive_private_key(private_value, curve, default_backend())
    pub_key = priv_key.public_key()
    print('Private key: 0x%x' % priv_key.private_numbers().private_value)
    print('Public point (Uncompressed): 0x%s' % pub_key.public_bytes(serialization.Encoding.X962, serialization.PublicFormat.UncompressedPoint).hex())
    
    # Sign some data
    data = b"this is some data to sign"
    signature = priv_key.sign(data, signature_algorithm)
    print('Signature: 0x%s' % signature.hex())
    
    # Verify
    try:
        pub_key.verify(signature, data, signature_algorithm)
        print('Verification OK')
    except InvalidSignature:
        print('Verification failed')
    

    This will display:

    Private key: 0x63bd3b01c5ce749d87f5f7481232a93540acdb0f7b5c014ecd9cd32b041d6f33
    Public point (Uncompressed): 0x04017655e42a892cc71bccedcb1cd421d03530e1d7edb52cef143c5562c4c6f0129fa5a37738013e64a1ff0e6cb7068815a13000eb162cb7a0214dfcf3c8fa101c
    Signature: 0x304402200308ac7b7a56e7227d665d8f652d849935b4876c5ecef252ed9713c975b0a6280220696c134bb6e115b9ac18790c27009938f081bfaf063e547ce75bad3c9682890b
    Verification OK