# 耐量子暗号 (QRC)

## 概要

QRCは、従来の楕円曲線暗号 (ECDH-P256)と、NISTで標準化された耐量子暗号ML-KEM-1024 (モジュール格子ベース鍵カプセル化方式) を組み合わせることで、KeeperのAPIセキュリティを強化します。このハイブリッド方式により、現在の安全性と将来の量子耐性の両立を実現します。

QRCを有効にすると、コマンダーから送信されるすべてのAPIリクエストで二重構成の暗号化が使用され、いずれか一方の暗号方式が将来破られた場合でも、データ保護が維持されます。

## 要件

| 要件          | 詳細                              |
| ----------- | ------------------------------- |
| Pythonバージョン | 3.11以降                          |
| パッケージ       | `keeper-mlkem` (自動的にインストールされます) |

要件を満たしている場合、QRCは自動的に有効になります。追加の設定は不要です。

## 仕組み

QRCが有効な状態でコマンダーがAPIリクエストを送信する際の処理は、以下のとおりです。

1. **ECDHによる鍵交換**\
   コマンダーが一時的な楕円曲線鍵ペアを生成し、サーバーの公開鍵を用いてECDHを実行
2. **ML-KEMによるカプセル化**\
   サーバーのML-KEM-1024公開鍵を使用し、共有シークレットをカプセル化
3. **鍵導出**\
   2つのシークレットをHKDF-SHA256で結合し、AES-256鍵を生成
4. **暗号化**\
   生成された鍵を使用し、AES-GCMで通信鍵を暗号化

## 代替動作

以下の場合、コマンダーは自動的に従来の楕円曲線暗号方式に切り替わります。

* Pythonのバージョンが3.11未満の場合
* `keeper-mlkem` パッケージがインストールされていない場合
* 暗号化処理中にQRC関連のエラーが発生した場合

いずれの場合もユーザー側での操作は不要で、接続は中断されずに継続されます。

## QRCの有効状態の確認

QRCが有効かどうかは、デバッグログを有効にすることで確認できます。

```
keeper shell --debug
```

QRCが有効な場合、次のようなログが表示されます。

```
Using QRC hybrid encryption (ML-KEM key ID: 136, EC key ID: 10)
ECDH completed: 32 byte shared secret
ML-KEM-1024 completed: 32 byte secret, 1568 byte encapsulation
HKDF completed: derived 32 byte AES key
AES-GCM completed: 60 byte ciphertext
```

## セキュリティ上の利点

| 特性             | 説明                                                  |
| -------------- | --------------------------------------------------- |
| 量子耐性           | ML-KEM-1024により、Shorのアルゴリズムを用いた将来の量子コンピュータ攻撃への耐性を確保  |
| ハイブリッド防御       | 将来、ML-KEMまたはECDHのいずれかが破られた場合でも、もう一方の暗号方式によるデータ保護を維持 |
| NIST標準         | ML-KEMはNIST FIPS 203に準拠し、厳格な安全性検証を通過                |
| 定数時間処理         | C拡張による実装により、タイミング攻撃などのサイドチャネル攻撃を回避                  |
| AES-256-GCM暗号化 | 認証付き暗号により、機密性と完全性の両立を実現                             |
