Skip to content

A Python package for Elliptic Curve Cryptography (ECC), supporting ElGamal, ECDH and ECDSA.

License

Notifications You must be signed in to change notification settings

lc6chang/ecc-pycrypto

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

82 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ecc-pycrypto

This Python package provides simple and user-friendly implementation of ECC, supporting ElGamal encryption, ECDH and ECDSA algorithms.

Introduction

Warning

This project is intended as an educational tool to help you learn and understand the concepts of ECC and how the algorithm works. Do not use it in production environments!

Installation

git clone git@github.com:lc6chang/ecc-pycrypto.git
cd ecc-pycrypto
pip3 install .

or

pip3 install git+https://github.com/lc6chang/ecc-pycrypto.git

Usages

Elliptic curve operations

from ecc import curve, registry

# Choose a curve from registry
P256 = registry.P256
# Define a point on the curve
P = curve.AffinePoint(
    curve=P256,
    x=0x9d8b7f25322574b60f9914b240d79bf35ba7284d0c93a0b76acac49b931cbde6,
    y=0x2aae8628ed337a97cecead2e61d0c188a979a4d1383382a3696b29b449072069,
)
# The base point
G = P256.G  # AffinePoint(curve=P256, x=484395..., y=361342...)
# The neutral point
O = P256.O  # InfinityPoint(curve=P256)
# Operations
assert P + O == P
assert P - P == O
assert 100 * O == O
assert P + P == 2 * P
print(20 * P - 5 * G)  # >>> AffinePoint(curve=P256, x=280875..., y=737429...)
# Define a custom curve
MY_CURVE = curve.ShortWeierstrassCurve(
    name="MY_CURVE",
    a=...,
    b=...,
    p=...,
    n=...,
    G_x=...,
    G_y=...,
)

ElGamal encryption

from ecc import curve, registry, key, cipher

# Plaintext bytes
plaintext_bytes = b"I am plaintext."
# Generate a key pair
pri_key, pub_key = key.gen_key_pair(registry.Curve25519)
# Encode plaintext bytes into a point on the curve
plaintext_point = curve.encode(plaintext_bytes, registry.Curve25519)
# Encrypt using ElGamal algorithm
C1, C2 = cipher.elgamal_encrypt(plaintext_point, pub_key)
# Decrypt
plaintext_point_decrypted = cipher.elgamal_decrypt(pri_key, C1, C2)
# Decode the decrypted point back to plaintext bytes
plaintext_bytes_decrypted = curve.decode(plaintext_point_decrypted)
# Verify
assert plaintext_bytes_decrypted == plaintext_bytes

ECDH shared secret

from ecc import registry, key, cipher

alice_pri_key, alice_pub_key = key.gen_key_pair(registry.Curve25519)
bob_pri_key, bob_pub_key = key.gen_key_pair(registry.Curve25519)
alice_shared = cipher.ecdh_shared(alice_pri_key, bob_pub_key)
bob_shared = cipher.ecdh_shared(bob_pri_key, alice_pub_key)
assert alice_shared == bob_shared

ECDSA sign and verify

from ecc import registry, key, cipher

plaintext_bytes = b"I am plaintext."
pri_key, pub_key = key.gen_key_pair(registry.Curve25519)
signature = cipher.ecdsa_sign(plaintext_bytes, pri_key, registry.Curve25519)
assert cipher.ecdsa_verify(plaintext_bytes, signature, pub_key)
assert not cipher.ecdsa_verify(plaintext_bytes[:-1], signature, pub_key)

About

A Python package for Elliptic Curve Cryptography (ECC), supporting ElGamal, ECDH and ECDSA.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages