Implmentation of lattice-based encryption method ring-LWE in pure Rust.
This provides the basic PKE (keygen, encryption, and decryption) operations for the ring learning-with-errors scheme.
This is not secure. It is not written in constant-time nor resistant to other side-channel attacks. This is intended for educational use and not for real-world applications.
In the src
directory,
cargo build
To build the binary.
cargo test
- Performs keygen/encrypt/decrypt for a test message.
- Checks homomorphic addition and multiplcation hold for small values.
Note: Parameters optional.
cargo run -- keygen --n 512 --q 12289 --t 2
where n
is the polynomial degree, q
is the ciphertext modulus, t
is the plaintext modulus.
If ommitted, the default parameters will be used.
cargo run -- keygen
This will generate a public/secret keypair printed to the console.
To save the key files to public.key
and secret.key
, use the --save-keys
flag:
cargo run -- keygen --save-keys
To encrypt a message using the public key using command line arguments:
cargo run -- encrypt <public_key> <message>
To encrypt a message using a public key file:
cargo run -- encrypt --pubkey-file public.key "Hello, world!"
To encrypt a message and save the ciphertext to file:
cargo run -- encrypt --pubkey-file public.key 'Hello, world!' --ciphertext-file ciphertext.txt
To decrypt an encrypted message using the secret key using command line arguments:
cargo run -- decrypt <secret_key> <ciphertext>
To decrypt an encrypted message using the secret key file:
cargo run -- decrypt --secret-file secret.key <ciphertext> --n 512 --q 12289 --t 2
To decrypt an encrypted message from a file ciphertext.txt
:
cargo run -- decrypt --secret-file secret.key --ciphertext-file ciphertext.txt
Benchmarks:
n | q | t | keygen | encrypt | decrypt | keygen_string | encrypt_string | decrypt_string |
---|---|---|---|---|---|---|---|---|
256 | 12289 | 2 | 41.565 µs | 70.024 µs | 29.741 µs | 69.703 µs | 99.181 µs | 43.751 µs |
512 | 12289 | 2 | 84.940 µs | 150.17 µs | 65.439 µs | 141.31 µs | 210.94 µs | 95.640 µs |
1024 | 12289 | 2 | 183.50 µs | 326.54 µs | 145.40 µs | 293.69 µs | 445.11 µs | 200.24 µs |