格子暗号とLWE/RLWE
なぜ格子暗号が量子計算機でも破れないのか。SVP/CVPの困難さ、誤りを混ぜるLWE/RLWEの仕組み、KyberとDilithiumの設計思想までを原理から腑に落とせる。
- 1.格子暗号の安全性は、高次元格子で最短ベクトルを探すSVPや最近ベクトルを探すCVPが古典・量子いずれでも指数時間しか知られていないことに依拠する。Shorの周期発見が効かないのが量子耐性の根拠。
- 2.LWEは連立一次方程式にわざと小さな誤差eを混ぜてb=A·s+eとし、ガウス消去を破綻させる問題。平均ケースの困難性が最悪ケースの格子問題に帰着する点が理論的な強みで、Ring-LWE/Module-LWEは多項式環で鍵サイズを縮める。
- 3.Kyber(ML-KEM)はModule-LWEに基づくKEMでFO変換によりIND-CCA2を得る。Dilithium(ML-DSA)はFiat-Shamir with AbortsでModule-LWE/SISに依拠する署名。両者は同じ環と数論変換NTTを共有する。
格子とは何か:基底と難しい問題
ポスト量子暗号の主力である格子暗号は、名前のとおり格子(lattice)という幾何学的対象の上に立っています。格子とは、n 個の一次独立なベクトル(基底)b1,...,bn の整数結合で表せる点すべての集合です。
L = { z1·b1 + z2·b2 + ... + zn·bn : zi は整数 }
同じ格子は無数の基底で表せます。ここが暗号の肝で、**互いに直交に近く短い「良い基底」**を持てば格子上の計算は易しく、**歪んで長い「悪い基底」**しか知らないと同じ問題が途端に難しくなります。公開鍵として悪い基底を、秘密鍵として良い基底を配る――これが格子暗号の素朴な発想です。
難しさの中身は2つの問題に集約されます。
- 最短ベクトル問題(SVP):格子の非ゼロで最も短いベクトルを求める。
- 最近ベクトル問題(CVP):格子外の任意の点
tに対し、最も近い格子点を求める。
2次元・3次元なら最近格子点は目で見て分かります。しかし次元が数百に上がると、点の候補が指数的に増え、「近そう」に見えて実は遠い点だらけになります。良い基底があれば座標を丸めるだけでCVPが解けますが、悪い基底では丸め誤差が累積して答えを外します。近似版(各点を定数倍まで許すγ-SVP/γ-CVP)ですら、多項式係数の近似では古典でも量子でも指数時間の解法しか知られていません。この「次元の呪い」が安全性の土台です。
LWE:誤りを混ぜて方程式を壊す
SVP/CVPを暗号でそのまま使うのは扱いづらいため、実際の設計は LWE(Learning With Errors、誤り付き学習)という形に落とし込みます。秘密ベクトル s を隠したい主体が、公開の乱数行列 A と小さな誤差ベクトル e を使って
b = A · s + e (mod q)
を大量に公開します。攻撃者に見えるのは (A, b) の対だけ。ここから s を復元するのがLWE問題です。
誤差 e が無ければ b = A·s は単なる連立一次方程式で、ガウスの消去法が一瞬で s を吐き出します。要はわざとノイズを混ぜることで消去法が破綻します。消去の過程で誤差が掛け算・足し算のたびに増幅され、最終的に真の解を覆い隠すからです。この「ノイズ付き方程式を解く」ことが、幾何学的には格子上の**有界距離復号(BDD、誤差が格子の最小距離より十分小さいという制約付きのCVP)**を解くことと等価になります。行列 A が張る格子に対し、b は格子点 A·s から誤差 e だけずれた点であり、最も近い格子点を当てれば s が分かる――つまりLWEはCVPの特殊ケースの言い換えです。
LWEが特別なのは、Regev(2005)が示した最悪ケース/平均ケース帰着にあります。通常の暗号は「ランダムに選んだ鍵の大半が難しい」ことを祈るしかありませんが、LWEはランダムに生成したLWEインスタンスを平均的に解ける攻撃があれば、あらゆる格子の最悪ケースのSVP近似すら量子的に解けることが証明されています。つまり「たまたま弱い鍵を引く」余地が理論上ほぼ無い。RSAやECCには無いこの保証が、格子暗号を推す大きな根拠です。
誤差の大きさとモジュラス q の比 q/‖e‖ の取り方が設計の要です。誤差が小さすぎると格子構造が透けて解読され、大きすぎると正規の復号が誤差に埋もれて失敗します。両者の隙間を突いて、復号は通るが解読は通らないパラメータを選びます。
Ring-LWE と Module-LWE:鍵を小さくする
素のLWEは安全ですが、行列 A が n × n 規模になり、鍵と暗号文が巨大になります(数百キロバイト級)。実用化を阻んだこのサイズ問題を解いたのが、代数構造の導入です。
Ring-LWE(RLWE)は、スカラーの代わりに多項式環 Zq[x]/(x^n + 1) の要素を成分に使います。この環では、乱数「行列」の役割をたった1本の多項式 a が担い、その巡回的な構造から実質 n × n 相当の情報が n 個の係数だけで表せます。結果として鍵サイズは1桁以上縮みます。さらに n を2冪に取り、モジュラス q を q ≡ 1 (mod 2n) を満たす素数に選ぶと、多項式の積を**数論変換(NTT、数論版の高速フーリエ変換)**で O(n log n) に高速化でき、性能でも決定的に有利になります。
ただしRLWEは「1本の多項式で全部を表す」強い構造ゆえ、その代数構造を突く未知の攻撃への不安が残ります。そこで折衷案が **Module-LWE(MLWE)**です。
| 方式 | 成分の型 | 鍵サイズ | 構造への依存 | 採用例 |
|---|---|---|---|---|
| 素のLWE | 整数(大きな行列) | 非常に大きい | なし(最も保守的) | 初期研究 |
| Ring-LWE | 多項式1本 | 小さい | 強い(環1つ) | NewHope 等 |
| Module-LWE | 多項式の小行列(例2×2〜4×4) | 小さい | 中間 | Kyber / Dilithium |
MLWEは多項式を成分とする小さな行列(Kyberなら 2×2〜4×4 程度)を使います。行列のランクを増減させるだけで安全性を細かく調整でき、単一の環に全面依存しないため構造攻撃への余裕も確保できます。この設計判断が、NISTが最終的にModule系を選んだ理由の一つです。
Kyber と Dilithium の設計思想
NISTが標準化した2つの主力アルゴリズムは、いずれもこのModule-LWEを土台に、目的の異なる暗号プリミティブを構築しています。
**Kyber(ML-KEM、FIPS 203)**は共通鍵を届ける KEM(鍵カプセル化)です。中核は素朴なLWE型の公開鍵暗号(PKE)ですが、これは受動的な攻撃にしか安全でない(IND-CPA)ため、そのままでは不正な暗号文を送りつける選択暗号文攻撃に弱い。そこで Fujisaki-Okamoto(FO)変換を被せます。FO変換は、復号後に得た平文から暗号文を作り直し、元の暗号文と一致するか検証する仕組みで、少しでも細工された暗号文を確実に弾きます。これにより IND-CCA2(能動的攻撃に対する強い安全性)を達成します。
**Dilithium(ML-DSA、FIPS 204)**は署名方式で、Module-LWEに加え、短い解を探す困難さである Module-SISにも依拠します。方式は Fiat-Shamir with Aborts。署名は「秘密鍵 s を知っている」というゼロ知識証明をハッシュで非対話化したもので、z = y + c·s(c はメッセージ由来のチャレンジ、y はランダムなマスク)という形をとります。
z = y + c·s の y が完全に一様なら z は s を統計的に隠します。ところが z の一部の係数が範囲を外れると、そこから s の情報が滲み出ます。Dilithiumはこれを防ぐため、範囲外の z が出たら署名を捨ててやり直す――これが「with Aborts」(棄却サンプリング)の由来です。ECDSAでnonceを1度でも使い回すと秘密鍵が即復元されたのと同じ構図で、格子署名でもマスクの生成ミスやサイドチャネル漏洩は破滅的。自前実装せず検証済みライブラリを使うのが鉄則です。
Kyberと Dilithiumが同じ環 Zq[x]/(x^n + 1)(ともに n = 256)とNTTを共有するのは偶然ではなく、同一ハードウェア/ソフトウェア資産を使い回せるようにした意図的な設計です。KEMと署名の両方を1組の演算基盤で賄えるため、組込みからサーバーまで実装コストを抑えられます。
量子耐性の根拠
最後に、なぜこれが量子計算機でも破れないとされるのかを整理します。RSAやECC/DHを崩壊させるShorのアルゴリズムは、素因数分解と離散対数を周期発見に帰着させ、量子フーリエ変換で周期を一気に求めるものでした。ところが格子問題には利用できる周期構造が無い。SVP/CVPの困難さは代数的な周期ではなく高次元の幾何に根ざすため、Shorの手口がそもそも適用できません。
では量子計算機は格子に無力かというと、そうではありません。既知の最良の攻撃は格子基底簡約(BKZ など)を核とする手法で、量子版でもGroverによる探索の平方根加速が乗る程度です。つまり量子であっても計算量は依然として指数関数的にとどまり、鍵長を適切に取れば安全余裕が保たれます。実際のパラメータは、こうした最良攻撃のコストをビット安全性として見積もり(Kyber-768で古典・量子とも十分な余裕を確保)、そこに実装上の誤り率や将来の攻撃改良への保険を上乗せして決めています。
格子暗号の量子耐性は「Shorが効かない」+「現時点で効率的な量子攻撃が見つかっていない」という2点に支えられた経験的な安全性です。数学的に「絶対に破れない」ことが証明されたわけではありません。だからこそ実務では、移行戦略で解説するように、既存の楕円曲線鍵交換(X25519)と Kyberを両方破らないと鍵が漏れないハイブリッド構成を採り、格子側に未知の欠陥が出ても古典側で守れる二重化が推奨されます。
まとめ
格子暗号の安全性は、高次元格子のSVP/CVPが古典・量子いずれでも指数時間しか知られていないことに立脚します。LWEは連立方程式に小さな誤差を混ぜてCVPに帰着させる問題で、最悪ケース/平均ケース帰着という強い理論保証を持ちます。Ring-LWE/Module-LWEは多項式環で鍵を縮め、Module構造が効率と保守性の折衷を実現しました。
これを土台に、KyberはFO変換でIND-CCA2なKEMを、Dilithiumは棄却サンプリングを核とする署名を構成し、同じ環とNTTを共有します。量子耐性の根拠はShorの周期発見が幾何的な格子問題に効かないことにあり、既知の量子攻撃でも指数時間が残る点です。ただし絶対証明ではないため、暗号の基礎を押さえたうえで、実務ではハイブリッド化と暗号アジリティで備えるのが定石です。
セキュリティ Article
格子暗号とLWE/RLWEを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
格子暗号
比較で見る軸
難易度: advanced / カテゴリ: セキュリティ / タグ数: 6
導入後に効く点
LWEは連立一次方程式にわざと小さな誤差eを混ぜてb=A·s+eとし、ガウス消去を破綻させる問題。平均ケースの困難性が最悪ケースの格子問題に帰着する点が理論的な強みで、Ring-LWE/Module-LWEは多項式環で鍵サイズを縮める。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- セキュリティ
- タグ数
- 6
判断チェックリスト
- 自社の用途が「格子暗号 / LWE」に近いか確認する。
- 強みである「格子暗号の安全性は、高次元格子で最短ベクトルを探すSVPや最近ベクトルを探すCVPが古典・量子いずれでも指数時間しか知られていないことに依拠する。Shorの周期発見が効かないのが量子耐性の根拠。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。