Calix PQC
NIST FIPS 203 · FIPS 204 · mức an toàn 3

Mật mã vẫn an toàn khi máy tính lượng tử ra đời.

Calix PQC là bản cài đặt từ chính tiêu chuẩn của hai thuật toán hậu lượng tử NIST chuẩn hoá năm 2024 — ML-KEM-768 cho trao đổi khoá và ML-DSA-65 cho chữ ký số — được đối chiếu từng byte với vector kiểm thử của chính NIST.

  • ML-KEM-768
  • ML-DSA-65
  • AES-256-GCM
  • HMAC_DRBG SHA-512
  • WebAssembly
52 / 52bài kiểm thử tự động đạt ở mỗi lần dựng
212 / 212ca NIST ACVP khớp qua BoringSSL acvptool
2252ca tham chiếu công bố trên trang này
0phép chia trên dữ liệu bí mật trong mã máy
Vì sao là bây giờ

Mã hoá hôm nay, đọc được vào ngày mai.

RSA và mật mã đường cong elliptic bị thuật toán Shor phá trên máy tính lượng tử đủ lớn. Dữ liệu ghi lại hôm nay có thể được lưu và giải mã sau này. Chuyển sang chuẩn hậu lượng tử của NIST là cách duy nhất, và phải bắt đầu trước khi cỗ máy đó xuất hiện.

1

Thu thập nay, giải mã sau

Bí mật tồn tại lâu dài — y tế, tài chính, hồ sơ nhà nước — đã đáng để bị ghi lại. Trao đổi khoá là phần phải đổi trước tiên.

2

Tiêu chuẩn đã chốt

NIST công bố FIPS 203 (ML-KEM) và FIPS 204 (ML-DSA) vào tháng 8/2024. Đây là các thuật toán mà chính phủ và nhà cung cấp đang chuyển sang.

3

Đúng là bắt buộc

Một bản cài đặt sai tinh vi còn tệ hơn không có. Calix PQC được chấm bằng vector của NIST, bản cài đặt độc lập và lỗi cố ý chèn vào — xem báo cáo kiểm chứng.

Công nghệ

Hai thuật toán. Một thư viện gọn gàng.

Cả hai được cài đặt bằng Rust mà không mượn crate hậu lượng tử nào, nên mọi dòng chạm vào dữ liệu bí mật đều kiểm toán được — và cùng nằm sau một giao diện C nhỏ gọn.

FIPS 203 · đóng gói khoá

ML-KEM-768

Cho hai bên thống nhất một bí mật 32 byte trên kênh công khai. Trước đây là CRYSTALS-Kyber.

Mức an toànNIST 3 (≈ AES-192)
Khoá đóng gói1,184 bytes
Khoá giải đóng gói2,400 bytes
Bản mã1,088 bytes
Bí mật chung32 bytes
Sinh khoá · mã hoá · giải mã≈ 0.5 · 0.8 · 0.6 ms (ARM64)
Gia cốtừ chối ngầm, kiểm khoá theo FIPS 203 §7.2/§7.3
FIPS 204 · chữ ký số

ML-DSA-65

Chữ ký chống chối bỏ, không thể giả mạo kể cả với kẻ tấn công lượng tử. Trước đây là CRYSTALS-Dilithium.

Mức an toànNIST 3
Khoá công khai1,952 bytes
Khoá bí mật4,032 bytes · hoặc hạt 32 byte
Chữ ký3,309 bytes
Sinh khoá · ký 1 KB · kiểm 1 KB92 · 193 · 68 µs (Apple M3 Pro)
Chế độML-DSA thuần, ký hedged, ngữ cảnh ≤ 255 B
Định dạng dữ liệu

Một phong bì, giống hệt trên mọi nền tảng.

Mã hoá trên iOS, giải mã trên Android, bằng Go hay trên trình duyệt: bố cục byte cố định. ML-KEM sinh khoá; AES-256-GCM bảo vệ dữ liệu và xác thực phần đầu.

Chi phí mỗi thông điệp: 1.121 byte. Blob của các phiên bản cũ (0x04 Kyber vòng 3, 0x05 ML-KEM + ChaCha20-Poly1305) vẫn đọc được; dữ liệu mới luôn là 0x06.

Kỹ thuật bảo mật

Dựng để vượt qua kiểm toán.

Qua được vector kiểm thử chứng minh phần toán đúng. Phần còn lại là những gì kẻ tấn công, hay kiểm toán viên, thực sự sẽ soi.

Không chia trên dữ liệu bí mật

Phép chia phần cứng có thời gian phụ thuộc giá trị — lớp lỗi rò rỉ KyberSlash. Bản WebAssembly release và bản debug không tối ưu được rã mã máy và tìm lệnh chia ở mỗi lần dựng (tests/ct/no-div.sh).

Chèn lỗi cố ý để thử bài kiểm

Tám lỗi ML-DSA cố ý (biên MakeHint, dấu SampleInBall, thứ tự ExpandA, bộ đếm ExpandMask, gợi ý không chuẩn, hằng Decompose…) được chèn lần lượt. Cả tám đều làm bộ kiểm thử đỏ.

Đối chiếu bản độc lập

Khoá, chữ ký, kết quả kiểm và phản ứng khi lật một bit của ML-DSA được so từng byte với crate RustCrypto ml-dsa độc lập (300 ca mỗi lần chạy, 10.000 ca khi cần); ML-KEM được đối chiếu với crate ml-kem độc lập.

Chịu được đầu vào độc hại

Khoá có hệ số ngoài miền bị từ chối (780 khoá sai chuẩn chính thức), khoá giải đóng gói sai H(ek) bị loại, bản mã bị sửa đi qua cơ chế từ chối ngầm, trường độ dài giả mạo không thể đọc tràn, và phần đầu blob được xác thực.

Ngẫu nhiên an toàn khi fork

Nonce và ngẫu nhiên của chữ ký hedged lấy từ HMAC_DRBG (SP 800-90A, SHA-512) nạp hạt từ hệ điều hành, kiểm bằng 480 ca CAVP, tự nạp lại hạt sau khi fork và từ chối khi quá chu kỳ reseed.

Bề mặt nhỏ, tự chủ

Mã lưới, Keccak và NTT là tự viết; phụ thuộc duy nhất là AES-GCM, HMAC/SHA-2, getrandom, subtle và zeroize. Khoá tạm được xoá khỏi bộ nhớ. Tổng khoảng 3.600 dòng Rust, kể cả test.

Kiểm chứng

Đừng chỉ tin lời chúng tôi.

Mọi vector, commit nguồn và checksum đều công khai. Tải các tệp NIST ngay từ trang này và chạy trên bất kỳ cài đặt nào, kể cả của chúng tôi.

Thuật toánTiêu chuẩnBộ kiểmKết quả
ML-KEM-768FIPS 203NIST ACVP · keyGen · encaps · decaps · key checksPASS
ML-KEM-768FIPS 203C2SP/CCTV · modulus · strcmp · unlucky samplingPASS
ML-DSA-65FIPS 204NIST ACVP · keyGen · sigGen · sigVerPASS
AES-256-GCMSP 800-38DNIST CAVP · 750 encrypt/decrypt casesPASS
HMAC_DRBGSP 800-90ANIST CAVP · 480 SHA-512 casesPASS
Nền tảng

Viết một lần bằng Rust. Chạy mọi nơi.

Một lõi, một header C, sẵn binding cho các nền tảng đội sản phẩm thực sự dùng.

iOS · macOSXCFramework, static + dynamic
AndroidJNI · arm64-v8a, armeabi-v7a, x86_64, x86
Flutterdart:ffi wrapper
Gocgo package
WebWebAssembly + TypeScript types
Windowsx64 DLL
Kotlin · Swiftwrapper sẵn để chép vào
C / C++p_pqc.h
// Go — encrypt to a post-quantum public key, then sign
kp, _ := ppqc.GenerateKeyPair()                    // ML-KEM-768
blob, _ := ppqc.Encrypt(kp.PublicKey, []byte("hello"))
plain, _ := ppqc.Decrypt(kp.SecretKey, blob)

sk, _ := ppqc.MLDSAKeyPairFromSeed(seed)            // ML-DSA-65, 32-byte seed
sig, _ := ppqc.MLDSASign(sk.SecretKey, msg, []byte("ctx"))
ok := ppqc.MLDSAVerify(sk.PublicKey, msg, []byte("ctx"), sig)