Skip to main content

mini-cryptography

mini-cryptography: mini ECDSA cryptography and Mekle tree root calculation

Mini-cryptography is a library that has ECC (Elliptic Curve Cryptography) arithmetic operations, including ECDSA (Elliptic Curve Digital Signature Algorithm) signature formation and verification. It also has a merkle tree root calculation.

   φ  Documentation: Mini-cryptography
   φ  Source-code: Github
   φ  Bug reports: Github

This library is suited for learning, but it is better not to use it for production.

Content

   φ  Dependencies
   φ  Installation
   φ  Uninstallation
   φ  User guide
      φ  ECDSA
         φ  Data for ECDSA examples
         φ  ECDSA examples
      φ  Merkle
         φ  Data for Merkle examples
         φ  Merkle examples
   φ  License

Dependencies

Mini-cryptography supports Python 3.7+.
Installation automatically includes the tinyec library.

Installation

The library can be installed from PyPI:

pip install mini-cryptography

Uninstallation

The library can be uninstalled using:

pip uninstall mini-cryptography

User guide

There are 2 main classes:
   φ  Ecdsa - has ECDSA arithmetic operations, including signature formation and verification;
   φ  Merkle - has a merkle tree root calculation.

Required libraries

from mini_cryptography import merkle
from mini_cryptography import ecdsa
import hashlib

ECDSA

Other required classes:
   φ  Point - ECDSA point that has x and y coordinates;
   φ  Field - describes the ECDSA field.

Data for ECDSA examples

Secp384r1 is 384-bit prime field Weierstrass curve. Also known as P-384 ansip384r1:

a = 39402006196394479212279040100143613805079739270465446667948293404245721771496870329047266088258938001861606973112316
b = 27580193559959705877849011840389048093056905856361568521428707301988689241309860865136260764883745107765439761230575
n = 39402006196394479212279040100143613805079739270465446667946905279627659399113263569398956308152294913554433653942643
p = 39402006196394479212279040100143613805079739270465446667948293404245721771496870329047266088258938001861606973112319
G = ecdsa.Point(
    26247035095799689268623156744566981891852923491109213387815615900925518854738050089022388053975719786650872476732087,
    8325710961489029985546751289520108179287853048861315594709205902480503199884419224438643760392947333078086511627871
)
secp384r1 = ecdsa.Field(a, b, n, p, G)
curve = ecdsa.Ecdsa(field=secp384r1, name="secp384r1")

Points

point1 = ecdsa.Point(
    19577993669543055159462232654227477804059834554938749056365059575367343238573934152231932832497698572508881172084304,
    34797297628126597108728033628292920232095535295240081944254459873403593475466847089395925227525676205111687199013609
)
point2 = ecdsa.Point(
    2643888095364097454558349481745047911629089192351741699089972264282318601908091592262966275642198233545325090846186,
    12384549089646028340756024322986515983214437514151244063613237375835994573258040845173892755352541890195338888681840
)
ECDSA examples

Points sum

new_point = sum_points(point1, point2)
Result:
New point (
    22152009089199730593582524338115427010336291169893373839910753311913746007332469659451755453856401184556487920772225,
    21415530147108271193135517297779083081913015961082356748098427685923206883047231450346172563957532258197936273940105
)

Points multiplication

multiplier = 9868959070921577617284768940259093768032668379810297735137924030066340321810481073797782613683403119141615137083587
new_point = multiply_points(point1, multiplier)
Result: 
New point (
    14103764458811902000156928461250459647654661504776098395816220167714718139473397796549037360732342313833270939242263,
    17395148190829553535748807655250157906889415207238492158034708401150356646081290450883354819984464883347616139045011
)

Generate random private key [1, n-1]

privateKey = curve.private_key_generator()
Result: privateKey = 20989443543778090555157442102131049817299902423795685309899862760056430951462397686708870733055917820122718887042439

Multiplication of G (base) point from the given multiplier

public_key = curve.G_multiplication(privateKey) # or curve.calculate_public_key(privateKey)
Result: 
G(x, y) (
    30040694804942853208177610713088115928148181688856632998897580287365858436344609590182460206850552050293936278998346,
    17559245262757783022105893899857708160332511010412356224688036071313308531776780869864952047367968387454976435887533
)

Generate random k [1, ... n-1]

k = curve.k_generator()
Result: 11000

Sign message

message = 'Religio, Doctrina, Civilitas, prae omnibus Virtus'
hash = int(hashlib.sha1(message.encode()).hexdigest(),base=16)

r, s = curve.sign_message(privateKey, k, hash=hash)
Result:
Signature (
	r = 22152009089199730593582524338115427010336291169893373839910753311913746007332469659451755453856401184556487920772225, 
	s = 33247802217962351080804096577524498301009516670239406026864057032340769378746165513387841747729702616554540985061660
)

Verify signature validity

verification = curve.verify_signature(r, s, hash, public_key)
Result: True

Merkle

Data for Merkle examples
hashList = [
    '01000000295c297aee86096dcf6092',
    '0100000007bdc63ab3e74058a87b92',
    '01000000017b23260463311a4d1936',
    '0100000007bdc63ab3e74058a87b92'
]
Merkle examples

Merkle root calculation from transactions

merkle.Merkle().merkle_root(hashList, 0) #if 0 transactions are hashed, then 1 transactions are not hashed. 
Result: '92599579e207c2553a712247ab0f2026876d2b078324b724e709d715d22e6dbb'

Calculate transaction hash

merkle.Merkle().transaction_hash(hashList[0])
Result: b'3860b826dfc02feed1bbeb908eb0b2c0f5ea32a1b12ef1e8d87d2bf0e3802795'

License

GNU General Public License v3 or later (GPLv3+)

Release files for mini-cryptography 0.0.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for mini-cryptography 0.0.2
File Size Uploaded
mini-cryptography-0.0.2.tar.gz 26.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for mini-cryptography 0.0.2
File Interpreter ABI Platform
mini_cryptography-0.0.2-py3-none-any.whl Python 3 none any Details

Total release size: 53.4 kB

Release files / mini-cryptography-0.0.2.tar.gz

Download URL mini-cryptography-0.0.2.tar.gz
Size 26.9 kB
Tags Source
SHA-256 checksum
How to use checksums
20b1d9a1563404eae0a253a92e49367316e9bb7a7d81494d83a6e88bc4e30a3c
BLAKE2b-256 checksum
How to use checksums
25ceed03ca39ad913f52e68894485fdabf3d915790337d5295a65f4bc9ed8386
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.10.0

Release files / mini_cryptography-0.0.2-py3-none-any.whl

Download URL mini_cryptography-0.0.2-py3-none-any.whl
Size 26.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
33583a927dc933a434e3e46498bd5772fcb594f4ec08b21058b780aa69843fd2
BLAKE2b-256 checksum
How to use checksums
0f735193455afdd13fa994a2c82aa5ed901a27f2cf0d99ac5c3d8ddbca255c5b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.10.0

Release history Release notifications | RSS feed

This release

0.0.2 This release

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page