ML-KEM (FIPS203) -- asymmetric, quantum-secure encryption
Project description
fips203
Python module
This Python module provides an implementation of FIPS 203, the Module-Lattice-based Key Encapsulation Mechanism Standard.
The underlying mechanism is intended to offer "post-quantum" asymmetric encryption and decryption.
Example
The following example shows using the standard ML-KEM algorithm to produce identical 32-byte shared secrets:
from fips203 import ML_KEM_512
(encapsulation_key, decapsulation_key) = ML_KEM_512.keygen()
(ciphertext, shared_secret_1) = encapsulation_key.encaps()
shared_secret_2 = decapsulation_key.decaps(ciphertext)
assert(shared_secret_1 == shared_secret_2)
Key generation can also be done deterministically, by passing a
SEED_SIZE
-byte seed (the concatenation of d and z) to keygen
:
from fips203 import ML_KEM_512, Seed
seed1 = Seed() # Generate a random seed
(ek1, dk1) = ML_KEM_512.keygen(seed1)
seed2 = Seed(b'\x00'*ML_KEM_512.SEED_SIZE) # This seed is clearly not a secret!
(ek2, dk2) = ML_KEM_512.keygen(seed2)
Encapsulation keys, decapsulation keys, seeds, and ciphertexts can all
be serialized by accessing them as bytes
, and deserialized by
initializing them with the appropriate size bytes object.
A serialization example:
from fips203 import ML_KEM_768
seed = Seed()
(ek,dk) = ML_KEM_768.keygen(seed)
with open('encapskey.bin', 'wb') as f:
f.write(bytes(ek))
with open('decapskey.bin', 'wb') as f:
f.write(bytes(dk))
with open('seed.bin', 'wb') as f:
f.write(bytes(seed)
A deserialization example, followed by use:
import fips203
with open('encapskey.bin', 'b') as f:
ekdata = f.read()
ek = fips203.EncapsulationKey(ekdata)
(ct, ss) = ek.Encaps()
The expected sizes (in bytes) of the different objects in each
parameter set can be accessed with EK_SIZE
, DK_SIZE
, CT_SIZE
,
SEED_SIZE
, and SS_SIZE
:
from fips203 import ML_KEM_768
print(f"ML-KEM-768 Ciphertext size (in bytes) is {ML_KEM_768.CT_SIZE}")
Implementation Notes
This is a wrapper around libfips203, built from the Rust fips203-ffi crate.
If that library is not installed in the expected path for libraries on your system, any attempt to use this module will fail.
This module should have reasonable type annotations and docstrings for the public interface. If you discover a problem with type annotations, or see a way that this kind of documentation could be improved, please report it!
See Also
Bug Reporting
Please report issues at https://github.com/integritychain/fips203/issues
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file fips203-0.4.1.tar.gz
.
File metadata
- Download URL: fips203-0.4.1.tar.gz
- Upload date:
- Size: 5.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 62bb232bab2e2917d926d0d36ae37f3a31d47c72e98121f314635cbb6b43faca |
|
MD5 | 31dac6815bfca71ab820d59e4b0296d4 |
|
BLAKE2b-256 | d32c699fbac865ec94ad04c94913bfc0a6d013d8de5bb50bced044c054857d3a |
File details
Details for the file fips203-0.4.1-py3-none-any.whl
.
File metadata
- Download URL: fips203-0.4.1-py3-none-any.whl
- Upload date:
- Size: 6.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4943691af72bec7214982a492a625f1dd069f440a9aec901fde9f8c4c500ef22 |
|
MD5 | 585c658a1e911184b1be66488af14319 |
|
BLAKE2b-256 | 2acaf27ec8192f3669a20b6b178e711a09ed51da4bc12fb0d69b7e4482054280 |