post_quantum 1.0.0-prerelease.1 post_quantum: ^1.0.0-prerelease.1 copied to clipboard
Dart implementation of the Kyber and Dilithium algorithms.
post_quantum #
Dart implementation of NIST's post-quantum algorithm candidates.
Features #
This library includes the following algorithms:
- Kyber, a post quantum Key Encapsulation Mechanism.
- Dilithium, a post quantum Signature scheme.
Usage #
Key Encapsulation with Kyber #
// Instantiate Kyber KEM.
var kyber = Kyber.kem512();
// Define a key generation seed.
var seed = base64Decode("AAECAwQFBgcICQoLDA0ODwABAgMEBQYHCAkKCwwNDg8AAQIDBAUGBwgJCgsMDQ4PAAECAwQFBgcICQoLDA0ODw==");
// Generate keys from seed.
var (pk, sk) = kyber.generateKeys(seed);
// Define a KEM nonce.
var nonce = base64Decode("Dw8ODg0NDAwLCwoKCQkICAcHBgYFBQQEAwMCAgEBAAA=");
// Encapsulate nonce and retrieve cipher and shared key.
var (cipher, sharedKey1) = kyber.encapsulate(pk, nonce);
// Or decapsulate the cipher and retrieve the shared key.
var sharedKey2 = kyber.decapsulate(cipher, sk);
Encryption and decryption with the internal Kyber PKE #
// Instantiate Kyber's internal PKE.
var kyber = KyberPKE.pke512();
// Define a key generation seed.
var seed = base64Decode("AAECAwQFBgcICQoLDA0ODwABAgMEBQYHCAkKCwwNDg8=");
// Generate keys from seed.
var (pk, sk) = kyber.generateKeys(seed);
// Set the message.
var msg = base64Decode("Dw4NDAsKCQgHBgUEAwIBAA8ODQwLCgkIBwYFBAMCAQA=");
// Define an encryption randomizer.
var coins = base64Decode("Dw8ODg0NDAwLCwoKCQkICAcHBgYFBQQEAwMCAgEBAAA=");
// Encrypt the message with the public key.
var cipher = kyber.encrypt(pk, msg, coins);
// Decrypt the cipher with the private key.
var decryptedMsg = kyber.decrypt(sk, cipher);
Signing and validating with Dilithium #
// Instantiate Dilithium.
var dilithium = Dilithium.level2();
// Define a key generation seed.
var seed = base64Decode("AAECAwQFBgcICQoLDA0ODwABAgMEBQYHCAkKCwwNDg8=");
// Generate keys from seed.
var (pk, sk) = dilithium.generateKeys(seed);
// Set the message.
var msg = base64Decode("Dw4NDAsKCQgHBgUEAwIBAA8ODQwLCgkIBwYFBAMCAQA=");
// Sign the message with the private key.
var signature = dilithium.sign(sk, msg);
// Verify the signature with the public key.
var isValid = dilithium.verify(pk, msg, signature);
Disclaimer #
This library has not been reviewed by security specialists, and therefore should not be treated as cryptographically secure.
Acknowledgements #
This implementation is based on the python implementation written by Giacomo Pope. Please go and check and support all of his projects.