はじめに
これは
物工/計数 Advent Calendar 2022
の 6 日目の記事です.
はじめまして.計数 3 年の佐藤 (
@u_zennei
) です.この記事では,RSA 暗号に対する攻撃手法として,楕円曲線素因数分解法 (および,その進化形) を紹介します.
あらかじめことわっておくと,攻撃手法と言っても,* 実際に RSA 暗号を破るような危険性はありません*.実際に使われている秘密鍵がこの手法によって攻撃されうる確率は無視できるほど小さいので,安心して読んでください.
この記事を書いた目的は,攻撃手法を紹介すること自体よりも,代数学が実際にどのように応用されているかを感じてもらうことにあります (そのため,代数数理工学の内容をベースに読めるように書きました) .
なお,私は未だ学部生として修行中の身であり,記事中にも至らぬ点が多々あるかと思います.ご指摘やご意見をドシドシ頂ければ幸いです.
RSA 暗号と素因数分解アルゴリズム
RSA 暗号は,大きな整数の素因数分解が困難であることを利用した公開鍵暗号方式です.大きな整数が高速に素因数分解できれば,RSA 暗号は破れることになります.
……というだけではあまりにも味気ないので,やや駆け足ですが RSA 暗号と素因数分解アルゴリズムについて紹介したいと思います.
RSA 暗号のしくみ
RSA 暗号は公開鍵暗号の一種で,大きな素数同士をかけあわせることは簡単だが,素因数分解は難しい,という (経験的) 事実を利用しています.以下に,その手順を述べます.
Alice が Bob へ秘密のメッセージを送ろうとしている状況を考えます.Bob は,あらかじめ以下の手順によって自身の公開鍵と秘密鍵を生成しておきます.
- 十分大きな素数 をランダムに選び, とする.
- 自然数 を, を満たすように取る.
- 自然数 を, を満たすように取る.
- を自身の秘密鍵として保存する. を自身の公開鍵として,Alice に渡す.
Alice は,Bob へ送りたいメッセージを, 未満の自然数 に (何らかのきまりで) エンコードします.そして, によって暗号文 を計算し,Bob へ送信します.Bob は, によって平文 を復元できます.
何気なく書いていますが,この手順が可能であることにも代数の知識を結構使います.
- まず, とは乗法群 の群位数です. という制約は の元であるために必要です ( でなくてもよいのですが,計算量が少なくなるように小さく取ります).
- そして, は Bezout の公式によって 未満で一意に定まります.それを求めるには拡張 Euclid 互除法を使って を解けばよいです.
- 最後に,Bob が により平文を復元できることは, が中国剰余定理と Fermat の小定理により成り立つことを用いています.
さて,悪意ある第三者が通信路上で暗号文 を入手したとき,平文 を復元するにはどうすればよいでしょうか? パッと思いつくのは,
- を満たす を,頑張って見つける ( は公開鍵なので,第三者も知っているとしてよい).
- 秘密鍵 を頑張って見つけて,Bob と同じように として求める.
の 2 つです.特に, の素因数 を多項式時間で計算できれば, も直ちに求まるので, を拡張 Euclid 互除法により解くことで が見つかります.すなわち,高速に自然数を素因数分解できるアルゴリズムさえ見つかれば,RSA 暗号は本質的に破られるのです.「RSA 暗号は素因数分解の困難さを利用している」と言われる所以はここにあります.
素因数分解アルゴリズム
現時点では, から を求めることも,秘密鍵 を解読することも,多項式時間で行えるアルゴリズムは見つかっていません.特に,素因数分解の多項式時間アルゴリズムは見つかっていません.
(なお,単純に と割っていけば で素因数が見つかる (試し割り法) から,多項式時間では? という気もしてきますが,違います.計算量は入力のサイズに対する関数で考えます.自然数 を素因数分解するときの入力サイズは なので,試し割り法は指数時間アルゴリズムです.)
素因数分解さえできれば RSA は事実上破れるので,現在に至るまで,高速な素因数分解アルゴリズムが探究されてきました.現状で最速の素因数分解アルゴリズムは一般数体ふるい法で,準指数時間 で動きます.その次に,複数多項式二次ふるい法,楕円曲線法と続きます.
楕円曲線法は現時点で 3 番目に速いアルゴリズムで,準指数時間 で動きます.数体ふるい法・複数多項式二次ふるい法と異なり,計算時間が ではなく に依存することが特徴です.もっとも,RSA 暗号では素因数 も十分大きいので,この特徴はあまり活かされないのですが.
以下では,楕円曲線法について詳しく述べます.
楕円曲線素因数分解法 (ECM)
楕円曲線素因数分解法 (まどろっこしいので,以下 Elliptic Curve Method の頭字語である ECM と呼びます) は,ごく大雑把にいうと,楕円曲線の Abel 群に対する Lagrange の定理を用いて素因数分解を行なうアルゴリズムです.ECM は H. W. Lenstra によって提案されたもので,古典的なアルゴリズムの部類に入ると思います (完全に余談ですが,H. W. Lenstra には 3 人の兄弟がいて,その全員が数学や数理工学の研究者です).
ECM について説明する前に,前提となる楕円曲線の概念を導入します.楕円曲線とは大雑把に言えばある種の平面曲線で,曲線上の点同士の「加法」を定めることで Abel 群の構造が入ります.
楕円曲線の Abel 群
楕円曲線は射影平面上で定義されるので,まずその辺りの道具立てを定義します.射影平面とは,直感的には,空間において原点を通る直線上の点を全て同一視して得られる平面のことです.
(このあたりの定義は最終的には使わないので,飛ばして定義 5 以降を読まれても差し支えないと思います)
射影空間
を体として, なる空間を考える. のとき, として同値関係を定める. による同値類全体がなす集合を 次元射影空間と呼ぶ.特に のとき,射影平面と呼ぶ.
射影平面の各点は,アフィン平面 (通常の の点全体) に「無限遠点」を加えたものと自然に同一視できます.
射影座標
とする. の による同値類を と書き,これを射影座標と呼ぶ.このとき, であり,この点は の点 と同一視できる.また, は無限遠点に対応する.
さて,この射影座標を用いて,楕円曲線を定義します.
楕円曲線
を体, とする. 上の楕円曲線 とは,射影座標 を用いた方程式
を満たす点の全体である.
この定義は,アフィン座標を用いて書き直すこともできます.そのためには,「分母を払う」処理をしたあとで,無限遠点を付け加えればよいです.
楕円曲線 (アフィン座標)
を体, とする. 上の楕円曲線 とは,アフィン座標 を用いた方程式
を満たす点の全体に,** 無限遠点 ** を付け加えたものである.
更に,体 の標数が ではないとき,更にきれいな形で楕円曲線を表せます.
楕円曲線 (Weierstrass 標準形)
を標数が でも でもない体, とする. 上の楕円曲線 とは,アフィン座標 を用いた方程式
を満たす点の全体に,** 無限遠点 ** を付け加えたものである.
この方程式による定義が,おそらく楕円曲線の定義として最もポピュラーだと思います.せっかく射影平面を定義しておいて申し訳ないですが,以降は楕円曲線を上記のアフィン座標による Weierstrass 標準形で扱うことにします.主に有限体 (ただし,) 上の楕円曲線を扱うので,一つ例を出しておきましょう.
有限体上の楕円曲線
上の楕円曲線 を Weierstrass 標準形
により定義すると,
さて,楕円曲線には,点同士の加法が入ります.加法の定義は多分にテクニカルです. のとき, の和 を,「 と を通る直線が楕円曲線と交わる点を, 軸に対して折り返したもの」で定めます. のときは, を通る接線を代わりに考えます.この操作を,実数体に限らない任意の体について一般化して加法を定めます.
楕円曲線の点の加法
を標数が でも でもない体とし, を 上の楕円曲線とする. の和を以下のように定める.
- のとき. として, とする.ただし, の分母が になるなら, とする.
- のとき. として, とする.ただし, の分母が になるなら, とする.
この加法により,楕円曲線 に Abel 群 の構造が入ります.単位元は です.実は,きちんと Abel 群になることの証明はかなり大変 (例えば,(縫田, 2020) ではこの証明に 13 ページを割いています) なので,ここでは省略します.
こうして楕円曲線の Abel 群が得られたわけですが,群構造はかなり非自明です.例えば,Weierstrass 標準形の方程式 が与えられたときに,有理点 (楕円曲線上の点のことをこう呼びます. 上の楕円曲線がよく研究されていたことの名残りだと思います) を全列挙することは相当難しいです. 上では有理点がそもそも存在するのか,存在するとして有限個か無限個か (つまり,群が無限か有限か),ということを判定するのですら難しいようです.一方で, 上の楕円曲線については,少なくとも有理点が存在することは保証されます.しかし有理点を具体的に見つけ出すことは難しいです.群位数も explicit には求まらないのですが,幸いにも群位数を多項式時間で計算するアルゴリズムは存在します (Schoof-Elkies-Atkin のアルゴリズム).ともあれ,こうした構造の複雑さが暗号では盛んに利用されます.
以下で述べる ECM の他にも,楕円曲線暗号や楕円曲線 Diffie-Hellman 鍵交換 (ECDHE) に楕円曲線が利用されています.これらは,楕円曲線上の離散対数問題 (秘密の自然数 があり,有理点 と だけ与えられたときに, を復元する問題) が難しいことを利用しています.最近では,耐量子計算機暗号 (e.g. CSIDH) において楕円曲線が使われているようです (耐量子計算機暗号については,(縫田, 2020) が参考になります).
さて,ECM は,有限体上の楕円曲線の 群位数 がある限られた範囲で (ほとんど) 一様に分布することを用いています.その裏付けとなる定理を (Silverman, 2009) より紹介します.
Hasse
を素数, を楕円曲線とする.このとき,
ただし, でその群位数を表す.
つまり,有限体上の楕円曲線の点はだいたい 個存在し,「誤差」は を超えないということです.更に,位数は の範囲においてほぼ一様に分布することが知られています.
ECM の流れ
ECM は,上述の位数に関する事実と,Lagrange の定理を組み合わせて利用しています.この節では,アルゴリズムの流れと,それが動作する理由を説明します.
以下, を相異なる素数, とします. の非自明な約数 (すなわち ) さえ見つければ,再帰的に素因数分解が可能です.そこで,素因数分解を直接行なう代わりに,入力された の非自明な約数を見つけることを考えます.
ECM の処理の流れは以下のようになります (擬似コード環境がなさそうなので箇条書きにしますが,気持ちは擬似コードのつもりです).入力を とします.
- を十分大きな自然数とし, とする.
- 上の楕円曲線 と,その上の点 をランダムに選ぶ ( を初期点と呼ぶ).
- を計算する.その過程で非自明な約数が見つかることがある.見つかればそこで終了し,見つからなければ と を選びなおして繰り返す.
たった 3 項の箇条書きですが,怪しい点がいくつかあります.
まず, 上の楕円曲線というのは,これまでの定義から外れています. は合成数であり, は体にならないからです (楕円曲線は体上で定義されていたことを思い出してください).しかし,ここはグッと我慢して,そのようなセッティングが可能だと認めてください (環上での楕円曲線の定義を厳密に正当化するにはスキーム論を使うらしく,私は不勉強にして詳細を把握していません).楕円曲線を Weierstrass 標準形で定義すれば,有理点は方程式を で満たす座標だと思えばよく,点の加法も におけるのと同じように で考えればよいです.唯一問題が生じるのは,点の加法における での除法の存在ですが,これについては後述します.
次に,楕円曲線上の初期点 をランダムに選ぶという処理はそう簡単ではありません (先述の通り,与えられた楕円曲線の有理点を具体的に見つけることは難しいため).そこで,実際には,先に点 の座標 を決めておき, をランダムに選んだあとで, として楕円曲線 を取ることにします.すなわち,初期点の座標を決め打ちしておいて,それがきちんと有理点になるような楕円曲線を (後出しで) 構成するわけです.
また, の計算ですが,真面目に を 回繰り返すのは非効率なので,繰り返し二乗法 (楕円曲線については double-and-add method という呼ばれ方が多いです) を利用します. に対して を計算しておき, を復元します.
最後に,「 を計算する過程で の非自明な約数が見つかる」という点について説明します (ここが ECM の本質です).Lagrange の定理により,任意の初期点 に対して,
が成り立ちます (「群位数」倍すると単位元になる).そのため, が の倍数であれば, となります.
このとき,点の計算において何が起きるでしょうか? 無限遠点が得られるということは,座標計算のどこかで「ゼロ割り」が生じているはずです.点の和を計算するとき, 上の割り算が必要なのは, の計算においてのみです.ゼロ割りが生じるのは, のとき,かつそのときに限られます ( における可逆元は と互いに素な数であることを思い出してください).
さて,こうなるともはや の計算は進められない代わりに, を満たす整数 が得られています.このとき, のいずれかですが, となるのはよほど運の悪い場合に限られます.したがって, を計算することで か が得られます.これで ECM が成功します.
以上の説明に基づくと,ランダムに選んだ楕円曲線の位数が を割り切る (Lagrange の定理が使える) ことこそ,ECM が成功する条件であることが分かります. は を約数として持つので,楕円曲線の位数が十分小さい素数同士の積で書けるならば,その条件が満たされます.ここで,楕円曲線の位数がある範囲で一様に分布することが効いてきます.もし群位数が特定の値,例えば しか取らなかったならば,運悪く が非常に大きな素因数を含んでいたとき, をものすごく大きく取らなければなりません.しかし,実際には群位数は十分ランダムなので,何度か楕円曲線を取り替えていれば,いつかは群位数が を割り切るような曲線を見つけられます.これが,ECM が素因数を見つけられる理屈です.
実装と例
拙いですが,ECM を C++ により実装したものを
GitHub
に置いています.これを使って数値例を示します.
ECM により, の素因数分解を試してみます. とします.
まず,初期点 を取り,楕円曲線 を により定めます. を計算するために, までを計算すると,それぞれの座標は以下のようになります.
これらから, を計算すると,
となって, が求まってしまいました.曲線を取り直してやりなおします.初期点 を取り,楕円曲線 を により定めます.このとき,
と求まりますが, を計算するために の座標を考えると, の分母 であり, となって, の素因数が見つかりました.この曲線では が成立したことになります.
ECM の計算時間について,以前手元で簡単に試した結果を述べておきます.AMD Ryzen 7 1700 コア スレッドの PC を つ束ね, ノードの並列計算環境で ECM を走らせたところ, 桁 ( bit) の合成数から素因数を見つけるのに 秒, 桁 ( bit) の合成数から素因数を見つけるのに約 秒 (約 46 時間) かかりました.
これは素朴なアルゴリズムと比べると桁違いに速い (例えば,試し割り法で 桁の合成数を素因数分解するのは,一生かかっても無理でしょう) のですが,それでも RSA 暗号の解読は絶望的です.現在は RSA 暗号で使う合成数のサイズとして bit 以上が推奨されています.よほど脆弱な鍵でも bit 以上が使われています. bit の素因数分解に 日かかるようでは, bit の素因数分解は無理でしょう.
ECM より速い 2 つのアルゴリズム (一般数体ふるい法,複数多項式二次ふるい法) では,これよりも計算時間が改善しますが,それでも本質的には解読は難しいと考えられています.現在までに素因数分解された最大の合成数は bitで,要した計算時間は core-years だそうです (Boudot et al., 2020).今のところ我々は,鍵に使う合成数を十分大きく取れば,RSA 暗号を安全に使うことができます.(大昔に生成した鍵長 bit 以下の鍵を使いつづけている人は今すぐ更新するべきだ,ということでもあります;ssh-keygen は bit 未満の鍵を生成できないので,よほどレアなケースにはなりますが……)
一方で,極めて特殊な条件下では,今まで述べてきた一般的なアルゴリズムとは別の手法により,現実的な時間での素因数分解が可能です.例えば,素因数 と が非常に近い場合などは,「特殊な条件」の一つです.このとき, の十分近くに限って試し割りを繰り返せば素因数が見つかってしまいます.以下では,「特殊な条件」に限った攻撃手法の一つとして,素因数 が と書ける場合に対する素因数分解法を述べます.
虚数乗法を用いた ECM
理論
ECM のポイントは,「位数が小さな素数の小さな冪の積となっている楕円曲線があれば,その上で点を 倍することで,Lagrange の定理によりゼロ割りが発生し,素因数分解ができる」ことでした.
さて,ここでもし群位数が既知の楕円曲線 があったらどうでしょうか? もしそんな楕円曲線があれば,適当な点を取って,ちょうど群位数の回数だけ足し上げることで,ただちに の素因数が求まるでしょう.楕円曲線を何度も取りなおして,運良く群位数が を割り切るようになるまで試す必要がなくなります.そして,点の加法は double-and-add method により群位数の対数オーダーで実行できますし,群位数は Hasse の定理によりたかだか なので,全体として の多項式時間で素因数分解が走ります.
そして, が特定の条件を満たすなら,群位数が既知の楕円曲線を実際に構成できます.その条件とは, により,
と書けることです.このとき,位数がちょうど の楕円曲線 を の確率で構成することができます (具体的には,Hilbert 類多項式 の根を -invariant に持つ楕円曲線を取ればよい).
この記事の範囲で理屈を説明するのはとても無理なので,気持ちだけサラッと触れておきます (ここは読み飛ばしてもらっても大丈夫です).上述の条件が満たされるとき,
と書けます.このとき,虚二次体 のある部分環による虚数乗法を持つ (自己準同型環が のある部分環と同型になる) 楕円曲線が存在します.さて, は Frobenius 自己準同型と呼ばれる写像のトレースですが, において はノルムが でトレースが の元となっています.このとき, が ずつの確率で成り立ちます. であれば, が従います.
(なお, のリストがマジックナンバーすぎると思った人もいるかもしれませんが,これらの数 () には Heegner 数という名前がついています.詳しくは「虚二次体の類数」といったワードで調べてみてください.)
さて,位数 の楕円曲線が得られたので,あとは適当な初期点 を取って 倍すれば,ECM の原理によって素因数分解に成功します.問題は有理点 を取るのが難しいことです.従来の ECM では,初期点を先に決めて,楕円曲線を「後出し」することで問題を回避していました.しかし,使う楕円曲線が先に決まっている以上,この手は使えません.
そこで,以下のような手法を取ります ( (白勢, 2016) による ).得られた位数 の楕円曲線の方程式を とします.初期点 の 座標を適当に決め打ちし, とします. が において平方元である確率は です ( のちょうど半分は平方元). が既知ならば 上で平方根を求めるアルゴリズムによって が見つかるのですが,そうではありません.ここで,多項式環の剰余環
を考えて,その上の楕円曲線 に話を移します. は の有理点となっています.そこで を計算すると,分母に の倍数に対応する の元が生じる (ゼロ除算) ことで素因数が見つかります.「 の倍数に対応する の元」とはなんでしょうか? そのような元の特徴付けを試みます.
写像 を, として定めます (先述の通り は計算できないのですが, は議論のために導入した写像で,実際に計算する必要はありません).これは代入写像であって,well-defined な全射準同型になっています.よって,準同型定理から,
が成り立ちます.さて, が の倍数 (すなわち ) に対応しているとします.このとき, です (同型は単位元を単位元に移す).ゆえに,
よって, を計算することなく, における単位元 ( の倍数) として を得ることができます.
(補足 : この計算は本質的に終結式と結びついており,終結式の計算を考えることで の制約を外せる,という研究があります (相川, 2018) .)
以上の議論をまとめると, の代わりに, 上で ECM を走らせ,座標の分母に可逆でない元 が現れたならば, が の素因数を与えることになります.このアルゴリズムが成功する確率は,選んだ楕円曲線で となっている確率 () と, が の平方元となっている確率 () の積なので, となります.
実装
このアルゴリズムの実装は,先述した
リポジトリ
の CM ブランチに置いています.
この手法では,一回あたりの試行では 反復しか回らず,各試行は の確率で成功するので,全体の処理は が数千 bit であっても数秒で終了します.手元の環境では, bit の合成数を 秒弱で素因数分解できました.
しかしながら,最初に述べた通り,これは RSA 暗号への本質的な脅威となりません.その理由は, が満たすべき条件が厳しすぎるからです.条件を満たす がどのくらいあるか,ラフに見積もってみましょう.そのためには, がどのくらいの頻度で数直線上に並んでいるか見れば十分です. の取りうる値は有限なので,動かせるパラメータは のみです.すると, は 乗のオーダーで値が増えていきます.一方で,素数はもっと密に存在します (素数定理より).実のところ,ランダムに取った素数 が と書ける確率は, 程度であるとされています. は通常 以上で取るので,その確率は極めて小さいことが分かります (観測可能な宇宙の粒子数は 個くらいらしいです.宇宙から粒子をランダムにピックして特定の一つをたまたまツモる確率よりもなお圧倒的に小さいのです).
おわりに
ここまで読んでいただき,ありがとうございました.
代数学がどのように使われているか,自分の語れる範囲で少し書いてみました (私の不勉強により釈迦に説法をする羽目になっていないか少し不安ですが……).なんとなくの雰囲気でも伝わったなら嬉しいです.
最後になりましたが,明日以降の
物工/計数 Advent Calendar 2022
もお楽しみに!