Goエコシステム向けの耐量子暗号
filippo.io/mlkem768 は、ML-KEM-768 の純粋な Go 実装であり、正確性と可読性に最適化されている。
- ML-KEM は NIST によって標準化が進められており、ほとんどの業界で採用が進んでいる耐量子鍵共有メカニズムである。
- パッケージはコード約 500 行、コメント 200 行、テスト 650 行で構成されており、
golang.org/x/crypto/sha3 を除いて依存関係はない。
- Go 標準ライブラリに統合される予定で、レビューのしやすさ、単純さ、徹底したテストを通じて高い安全性への信頼を提供するよう設計されている。
仕様検証のための実装
- 多くの実装と異なり、このコードは参照用の pq-crystals ライブラリから移植されたものではなく、ほかのコードベースを詳しく読まずにゼロから書かれている。
- FIPS 203 文書は、詳細な擬似コード、徹底した定義、一貫した型情報を提供しており、優れた実装ガイドになっている。
- コードの可読性と学習リソースとしての価値を高めるため、関数名や変数名、演算順序は FIPS 仕様に合わせて慎重に選ばれている。
実装に十分な多項式と線形代数
- 仕様が要求する数学的背景は比較的限定的だが、実装者の作業を容易にするために「Kyber 実装に十分な多項式と線形代数」が書かれている。
- 残りの部分は読者への演習問題として残されており、1) 素数 3329 に対する剰余演算、2) [0, 3329) から [0, 2ᵈ) への圧縮および展開関数の具体的実装、3) 定数時間演算の保証、が含まれる。
可読性と教育的価値
- 可読性は実装の主要な目標の 1 つであり、効果的なレビューを可能にし、次世代の保守担当者や暗号エンジニアのための学習リソースとしても機能する。
- 複雑な関数の可読性を高めるために、コードを長くし再利用性を低くする場合もある。
テストによる高い安全性への信頼
- 鍵生成、カプセル化、デカプセル化が正しく行われることを確認し、95% 以上のテストカバレッジを維持している。
- NIST や他の実装から得たテストベクトルとの相互運用性を保証し、期待値と比較して基本的な有限体演算を徹底的にテストしている。
- CCTV プロジェクトの一環として、他の実装でも再利用可能なテストベクトルを公開している。
性能
- 性能は主要目標ではないが、パッケージは実用に足るだけ十分に高速である必要がある。
- ML-KEM は十分に高速であり、このシンプルな実装でもアセンブリ最適化された P-256 や X25519 の実装と競争できる。
- 性能向上のために、Go のプログラミングパターンに従い、ヒープ割り当てを最小化するなどの工夫が行われている。
ML-KEM 実装を Kyber v3 として使う
- NIST は Kyber の Round 3 提出版にいくつかの小さな変更を加えている。
- いくつかの実験的プロトコルは Kyber v3(または "draft00")をベースに定義されているが、別パッケージを作る必要はない。
- ML-KEM を使って共有秘密 K を生成し、その後 Kyber の共有秘密を生成するために追加の鍵導出を適用できる。
GN⁺の見解
- 耐量子暗号の重要性: 量子コンピューティングの進展によって既存の暗号技術が脆弱になる可能性があるため、ML-KEM のような耐量子暗号技術の開発と標準化は非常に重要である。
- Go 言語の拡張性: この実装は Go 言語の拡張性と柔軟性を示しており、暗号ライブラリを標準ライブラリに統合する計画もあるため、Go 開発者コミュニティにとって有用なリソースになるだろう。
- 教育的価値: コードの可読性と教育的価値を重視したアプローチは、次世代の暗号エンジニアや関心のある開発者にとって大きな学習資源となるだろう。
1件のコメント
Hacker Newsのコメント
量子コンピューティングの現状に関する疑問
Kudelski Securityからの挨拶と共有
Go言語で実装された暗号システムに関する書籍の推薦
他言語(Java、C# など)の実装に関する質問
Go言語による純粋実装への懸念
Kyber v3対応への関心と質問
32ビットのシステムコールテーブルに関する冗談
Unicode変数名の使用への好感
FiloSottileの他プロジェクトへの称賛
NIST FIPS 203文書へのリンク共有