2021SC@SDUSC
https://github.com/kriskwiatkowski/pqc
提交给 NIST PQC 标准化流程的量子安全签名和 KEM 方案。
该项目目标是在 C 和 Rust 中提供易于使用的 API 以支持实验。 该代码源自提交给 NIST 后量子加密标准化的 PQClean 项目 。
用户不应期望此代码提供任何级别的安全性。 该库不打算用于实时生产系统。
Name | NIST Round | x86 optimized |
---|---|---|
Kyber | 3 | x |
NTRU | 3 | x |
SABER | 3 | x |
FrodoKEM | 3 | |
NTRU Prime | 3 | x |
HQC-RMRS | 3 | x |
Dilithium | 3 | x |
Falcon | 3 | |
Rainbow | 3 | |
SPHINCS+ SHA256/SHAKE256 | 3 | x |
SIKE/p434 | 3 | x |
CMake 用于构建库:
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make
构建输出两个库,一个静态 libpqc_s.a和动态 libpqc.so,可与项目链接。
API
库提供了简单的 API,包装了 PQClean。 例如,要使用 KEM,应按以下方式调用库:
#include <pqc/pqc.h>
const params_t *p = pqc_kem_alg_by_id(KYBER512);
std::vector<uint8_t> ct(ciphertext_bsz(p));
std::vector<uint8_t> ss1(shared_secret_bsz(p));
std::vector<uint8_t> ss2(shared_secret_bsz(p));
std::vector<uint8_t> sk(private_key_bsz(p));
std::vector<uint8_t> pk(public_key_bsz(p));
pqc_keygen(p, pk.data(), sk.data());
pqc_kem_encapsulate(p, ct.data(), ss1.data(), pk.data());
pqc_kem_decapsulate(p, ss2.data(), ct.data(), sk.data());
p = pqc_sig_alg_by_id(DILITHIUM2);
size_t sigsz = sig.capacity();
pqc_keygen(p, pk.data(), sk.data());
pqc_sig_create(p, sig.data(), &sigsz, msg.data(), msg.size(), sk.data());
pqc_sig_verify(p, sig.data(), sig.size(), msg.data(), msg.size(), pk.data());
cd test/katrunner
curl http://amongbytes.com/~flowher/permalinks/kat.zip --output kat.zip
unzip kat.zip
cargo run -- --katdir KAT