"cryptography.hazmat.primitives.asymmetric.ec" - Generate EC Keys

This section provides a tutorial example on how to use 'cryptography.hazmat.primitives.asymmetric' module to generate EC private-public key pairs in Python scripts.

To generate EC private-public key pairs for production systems, you can use the cryptography.hazmat.primitives.asymmetric.ec module. Here is a Python example script that generates EC key pairs of a given curve name.

# cryptography-hazmat-ec-keys.py
# Copyright (c) 2025, HerongYang.com, All Rights Reserved.
#
import sys
if (len(sys.argv) < 2):
  print("Usage: python cryptography-hazmat-ec-keys.py 'list'|curve")
  exit()
cmd = sys.argv[1]

from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import serialization

if cmd=='list': 
  types = ec._CURVE_TYPES
  for key in types.keys():
    print(key.upper())
    # print(val)
else:
  curve = getattr(ec, cmd.upper())
  private_key = ec.generate_private_key(curve())
  public_key = private_key.public_key()
  print("Curve name: "+private_key.curve.__class__.__name__)
  print("Key size: "+str(private_key.key_size))
  print(f"x: {private_key.private_numbers().public_numbers.x}")
  print(f"y: {private_key.private_numbers().public_numbers.y}")
  print(f"d: {private_key.private_numbers().private_value}")
  print()
  print("Private key: \n"
    + str(private_key.private_bytes(
      serialization.Encoding.PEM,
      serialization.PrivateFormat.TraditionalOpenSSL,
      serialization.NoEncryption()      
    ), "utf-8")
  )
  print("Public key: \n"
    + str(public_key.public_bytes(
      serialization.Encoding.PEM,
      serialization.PublicFormat.SubjectPublicKeyInfo    
    ), "utf-8")
  )

List curves supported by the cryptography package

herong$ python3 cryptography-hazmat-ec-keys.py list 

PRIME192V1
PRIME256V1
SECP192R1
SECP224R1
SECP256R1
SECP384R1
SECP521R1
SECP256K1
BRAINPOOLP256R1
BRAINPOOLP384R1
BRAINPOOLP512R1

Generate private-public key pairs of a given curve

herong$ python3 cryptography-hazmat-ec-keys.py SECP256R1 

Curve name: SECP256R1
Key size: 256
x: 1448598621669265146687495365245166001695582165426594859805879...
y: 3746487251185212638022777276660681179127648368273248695396648...
d: 2771254253714437992124662222726178157117638306617714749456695...

Private key: 
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEID1EvkRMtGA9S5qvBZQZxFWcuPZTYC7Aidp0TJFP3q4QoAoGCCqGSM49
AwEHoUQDQgAEIAbHE7y/bPBxbPpqrMZPSJduPA3nYoysdnK2YDnm8ndS1F3LjovD
B7pr9xXvLj42Eqlk8EvVkrzlRcUzH56UMQ==
-----END EC PRIVATE KEY-----

Public key: 
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEIAbHE7y/bPBxbPpqrMZPSJduPA3n
YoysdnK2YDnm8ndS1F3LjovDB7pr9xXvLj42Eqlk8EvVkrzlRcUzH56UMQ==
-----END PUBLIC KEY-----

Visit https://cryptography.io/en/38.0.0/hazmat/primitives/asymmetric/ec/ for more details on the cryptography.hazmat.primitives.asymmetric.ec module.

Table of Contents

 About This Book

 Geometric Introduction to Elliptic Curves

 Algebraic Introduction to Elliptic Curves

 Abelian Group and Elliptic Curves

 Discrete Logarithm Problem (DLP)

 Finite Fields

 Generators and Cyclic Subgroups

 Reduced Elliptic Curve Groups

 Elliptic Curve Subgroups

 tinyec - Python Library for ECC

 EC (Elliptic Curve) Key Pair

 ECDH (Elliptic Curve Diffie-Hellman) Key Exchange

 ECDSA (Elliptic Curve Digital Signature Algorithm)

 ECES (Elliptic Curve Encryption Scheme)

Generating EC Keys in Python

"cryptography.hazmat.primitives.asymmetric.ec" - Generate EC Keys

 "serialization.load_pem_private_key()" - Load EC Private Key

 "Crypto.PublicKey.ECC" - Generate EC Keys

 Generating EC Keys in Java

 Standard Elliptic Curves

 Terminology

 References

 Full Version in PDF/EPUB