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.
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.
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.
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.
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.
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ả 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.
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àn | NIST 3 (≈ AES-192) |
|---|---|
| Khoá đóng gói | 1,184 bytes |
| Khoá giải đóng gói | 2,400 bytes |
| Bản mã | 1,088 bytes |
| Bí mật chung | 32 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 |
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àn | NIST 3 |
|---|---|
| Khoá công khai | 1,952 bytes |
| Khoá bí mật | 4,032 bytes · hoặc hạt 32 byte |
| Chữ ký | 3,309 bytes |
| Sinh khoá · ký 1 KB · kiểm 1 KB | 92 · 193 · 68 µs (Apple M3 Pro) |
| Chế độ | ML-DSA thuần, ký hedged, ngữ cảnh ≤ 255 B |
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.
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.
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).
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ử đỏ.
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.
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.
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.
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.
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.
// 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)