楕円曲線暗号

**楕円曲線暗号**（だえんきょくせんあんごう、**Elliptic Curve Cryptography**、**ECC**）とは、楕円曲線上の離散対数問題 (EC-DLP) の困難性を安全性の根拠とする暗号。1985年頃にとが各々発明した。

具体的な暗号方式の名前ではなく、楕円曲線を利用した暗号方式の総称である。DSAを楕円曲線上で定義した楕円曲線DSA (ECDSA)、ディフィー・ヘルマン鍵共有（DH鍵共有）を楕円化した楕円曲線ディフィー・ヘルマン鍵共有 (ECDH) などがある。公開鍵暗号が多い。

EC-DLPを解く準指数関数時間アルゴリズムがまだ見つかっていないため、それが見つかるまでの間は、RSA暗号などと比べて、同レベルの安全性をより短い鍵で実現でき、処理速度も速いことをメリットとして、ポストRSA暗号として注目されている。ただしP=NPが成立した場合、EC-DLPを多項式時間で解くアルゴリズムが存在するということになり、ECCの安全性は崩壊する（公開鍵暗号自体が崩壊）。また、送信者が暗号化時に適当な乱数（公開鍵とは違うモノ）を使うので鍵が同じでも平文と暗号文の関係が1対1でない点にも注意（ElGamal暗号でも同様）。

一部の楕円曲線には、DLPを解く多項式時間アルゴリズムが見つかっているため、注意が必要である。

## 歴史
暗号理論に楕円曲線を利用しようというアイディアは、1985年にニール・コブリッツ と ビクター・S・ミラー によって独立に提案された。楕円曲線暗号は、2004～2005年ごろから広く使用されるようになっている。

## 理論

実平面 \mathbb{R}^2 上の点を P(x,y) で表した場合、\mathbb{R}^2 上で定義される楕円曲線 E: y^2 = x^3 + \alpha x + \beta (ワイエルシュトラスの標準形)では、E 上の点に接弦法(またはバシェ(Bachet)の方法)
と呼ばれる加法的な2項演算により加群の構造を与えることができる(零元は通常は y 方向の無限遠点(0,∞)と定義される。これを O で表す)。

楕円曲線暗号で扱う楕円曲線とは、E 上の有理点を、ある素数 p で還元した有限体  \mathbf{F}_p 上の離散的楕円曲線 E( \mathbf{F}_p) であり、還元によって上記の加群の構造は E( \mathbf{F}_p) 上の加群の構造に写される。

### 楕円曲線上の加法
楕円曲線E 上の異なる2点を P_1\, (x_1,\, y_1),\, P_2\, (x_2,\, y_2)とする場合、その接弦法の加法を P_1 + P_2 で表すことにすると、これは以下の式で計算される。

まず、P_1 + O = O + P_1 = P_1 である。すなわち、無限遠点 O が零元であると定義する。

もし  x_1 = x_2, y_1 = - y_2  ならば、P_1 + P_2 = O  であると定義する。このとき P_2 を -P_1 と書き、 P_1 の逆元と呼ぶことにする。

O + O = O であるから、O の逆元は O 自身である。これは通常の加群の零元の条件を満たしている。

それ以外の場合、P_1 + P_2 は、2点 P_1,\,P_2 を通る直線と E との（P_1 および P_2 と異なる）交点の、y座標の符号を反転したものであると定義する。つまり P_3\,(x_3,y_3) = P_1 + P_2 と置けば、次のように計算される。
x_{3}=\phi^{2}-x_{1}-x_{2},
y_{3}=-\phi x_{3}-\psi.
ただし \phi,\, \psi は
\phi=\frac{y_{2}-y_{1}}{x_{2}-x_{1}},
\psi=\frac{y_{1}x_{2}-y_{2}x_{1}}{x_{2}-x_{1}}.

上の方法で定義された2項演算は加法として必要な次の性質を備えている。

*零元 O の存在
*各元P_1に対する逆元-P_1の存在
*可換性： P_1 + P_2 = P_2 + P_1 (定義式の対称性から明らか)
*結合性： (P_1 + P_2) + P_3 = P_1 + (P_2 + P_3) (煩雑であるが定義式を丁寧に解けば証明できる)

### 楕円曲線上での2倍算
楕円曲線E上の点 P_1\, (x_1,\,y_1) に対し、さらにP_1 を加算する場合、つまり P_1 + P_1 = 2 P_1 を求める場合、上記の方法は使えない(上記の方法で2点が重なっている場合であり、この点を通る直線の傾きが決まらないため)。

この場合、まず y_1 = 0 のときは、2P_1 = O である。また、2O = O+O = O である。

それ以外の場合は、2 P_1 は、P_1 での E の接線が E 自身と交わる（P_1 とは異なる）交点の、y座標の符号を反転したものである。すなわち P_4\, (x_4,\, y_4) = 2 P_1 と置けば、次のように計算される。
x_4 = \phi^2 - 2x_1,
y_4 = -\phi x_4-\psi.
この式は異なる二点の加算の場合と同じであるが、\phi,\, \psi の計算式が次のように変わる。
\phi=\frac{3x^2_1+ \alpha}{2y_1},
\psi=\frac{-3x^{3}_{1}- \alpha x_{1}+2y_{1}^2}{2y_{1}}.

### スカラー倍算
スカラー倍算（Scalar Multiplication）は楕円曲線上における掛け算である。楕円曲線上の点と点を掛けるのではなく、点に整数（スカラー）を掛けることに注意。

E上のある点 P_1を始点として、これに順次 P_1 自身を n-1 回加算して得られる点を nP_1で表すことにする。この操作は O に P_1 を n 回加算することと同じである。O に -P_1 を n 回加算すれば-nP_1が得られる。
このようにして、E上の点と整数の掛け算が定義できる。この操作をスカラー倍算（Scalar Multiplication）と呼ぶことにする。

P_1を始点として、加法により生成される点列(つまり全ての整数についてのP_1のスカラー倍算の集合)は、E 上の巡回群を作っている(これを \langle P_1 \rangleと表すことにする)。

### 楕円曲線上の有理点
楕円曲線のパラメーター \alpha,\, \beta が有理数の場合、2つの有理点(x,y が共に有理数の点)を加算して得られる点はやはり有理点である。つまり、E 上の全ての有理点の集合＋無限遠点 O を E(\mathbb{Q}) と表すと、E(\mathbb{Q}) は加法について E の部分加群を成している。また、E(\mathbb{Q}) 上のある有理点を始点として加法により生成される E(\mathbb{Q}) 上の点列は、E(\mathbb{Q}) 上の全ての点が成す加群の部分加群(巡回群)を成している。さらに始点が整点(x,y が共に整数の点)でない場合、この巡回群の位数は無限大である(Nagell-Lutzの定理)。

また、E( \mathbb{Q}) 全体が成す加群は、有限個の始点が生成する巡回群の直和になることが知られている(モーデルの定理)。

### 素数 ''p'' による還元
楕円曲線暗号で扱う楕円曲線とは、ある素数 p について、以下で説明する楕円曲線 E(\mathbb{Z}_p) を p で還元した有限体 \mathbf{F}_p 上の離散的楕円曲線であり、これを E(\mathbf{F}_p) と表すことにする(無限遠点 O も含む。誤解の恐れがないので無限遠点は E または E(\mathbb{Q}) のものと同じ記号を使うことにする。)。以下、順を追って説明する。

#### 有理数体 <math>\mathbb{Q}</math> の部分環 <math>\mathbb{Z}_p</math> の還元
0以外の全ての有理数は、2つの整数 u、v (u、vは互いに素な整数であり、v > 0)の分数 u/v の形で一意的に表すことができる(素因数分解の一意性による)。この形式を正規化された分数と呼ぶことにする(分数 0/1 を 0 の正規化された分数と見なすことにする)。正規化された分数 u/v の 分母 v が p を因数として含まない場合、u/v を p進整数 (または p-整数)と呼ぶ。全てのp進整数の集合を \mathbb{Z}_p とすれば、これは 有理数体 \mathbb{Q} の部分環を成しており、p進整数環と呼ばれる。 p進整数環 \mathbb{Z}_p から有限体 \mathbf{F}_p 上への写像 f_p を、次のように定義する。
f_p(u/v) = (u \bmod \,p)(v \bmod \,p)^{-1}  \bmod \,p
ただし、(v \bmod \,p)^{-1} は \mathbf{F}_p の元 v \bmod\,p の \mathbf{F}_p における逆元とする。\mathbf{F}_p の 0 以外の任意の元 v の \mathbf{F}_p における逆元 v^{-1} は常に存在し、フェルマーの小定理から v^{p-1} \equiv 1\,(\bmod \,p) であるから、v^{-1} = v^{p-2} \,\bmod \,p によって計算できる。

f_p は環 \mathbb{Z}_p から 有限体 \mathbf{F}_p への環準同型写像であり、 \mathbb{Z}_p 上の加法、乗法、逆元は \mathbf{F}_p 上の加法、乗法、逆元に写される。特に \mathbb{Z}_p における除算は、\mathbf{F}_p では逆元を乗ずる操作に写される。f_p の像が体であるから、その核は環 \mathbb{Z}_p の極大イデアルであり、これは単項イデアル p\mathbb{Z}_p に一致する。

#### 楕円曲線 <math>E(\mathbb{Z}_p)</math> の還元
有理数体\mathbb{Q} 上の楕円曲線 E(\mathbb{Q}) を \mathbb{Z}_p 上に制限したものを E(\mathbb{Z}_p) と表すことにする(無限遠点 O は含むものとにする)。

E(\mathbb{Z}_p) の素数 p による還元とは、E(\mathbb{Z}_p) に、次に定義する {\mathbb{Z}_p}^2 から {\mathbf{F}_p}^2 への写像 \tilde{f}_p を作用させることであるとする。

* \tilde{f}_p(O) = O
* \tilde{f}_p(x,y) = (f_p(x),f_p(y))

\tilde{f}_p は f_p の性質から、E(\mathbb{Z}_p) 上の接弦法による加法を E(\mathbf{F}_p) 上の加法に矛盾なく写す。つまり\tilde{f}_p は楕円曲線上の加法に関する準同型写像を成している。

\mathbb{Z}_p 上で定義された楕円曲線 E(\mathbb{Z}_p): y^2 = x^3 + \alpha x + \beta (\alpha, \beta はp進整数) を素数 p で還元した離散的楕円曲線 E(\mathbf{F}_p) は \mathbf{F}_p 上では次の式で定義される。
:E(\mathbb{\mathbf{F}_p}): y^2 = x^3 + ax + b \,\,(\bmod \,p)
ただし、x,y は \mathbf{F}_p の元であり、a = f_p(\alpha),\, b = f_p(\beta)  とする。このようにして定義された離散的楕円曲線は、グラフにすれば最早曲線ではなく、離散した点の集まりにしか見えない(ただし分布は直線 y=0 に対して対称である)。

上述のEにおける接弦法の加法の計算式は、E(\mathbb{\mathbf{F}_p})ではx_{2}-x_{1} または 2y_1 による除法が、 \mathbf{F}_p における逆元 (x_{2}-x_{1})^{-1} または (2y_1)^{-1} による乗法に置き換えられ、全体としては次のように書き換えられる。

P_1\,(x_1,y_1),\,P_2\,(x_2,y_2) をE(\mathbb{\mathbf{F}_p})上の任意の2点とする。

 x_1 = x_2, y_1 = - y_2  の場合、P_1 + P_2 = O。

それ以外の場合、P_3\,(x_3,y_3) = P_1 + P_2 と置けば、
x_{3}=\phi^{2}-x_{1}-x_{2} \,(\bmod \,p)
y_{3}=-\phi x_{3}-\psi \,(\bmod \,p)

ただし \phi,\, \psi は P_1 \ne P_2 の場合、
\phi=(y_{2}-y_{1})(x_{2}-x_{1})^{-1} \,(\bmod \,p)
\psi=(y_{1}x_{2}-y_{2}x_{1})(x_{2}-x_{1})^{-1} \,(\bmod \,p)

P_1= P_2 の場合、
\phi=(3x^2_1+ a)(2y_1)^{-1} \,(\bmod \,p)
\psi=(-3x^{3}_{1}- a x_{1}+2y_{1}^2)(2y_{1})^{-1} \,(\bmod \,p)

前述のように、\mathbf{F}_p の 0 以外の任意の元 v の \mathbf{F}_p における逆元 v^{-1} は、フェルマーの小定理から計算できる。

なお、前述のように、E(\mathbb{Q}) 上においては、始点が整点でない巡回加群の位数は無限大であるが、楕円曲線 E(\mathbb{Z}_p) の \tilde{f}_p による像である \mathbf{F}_p 上の楕円曲線 E(\mathbf{F}_p) は有限集合であり、当然位数も有限となる。

### ベースポイントと巡回群の位数
楕円曲線 E(\mathbf{F}_p) 上のある点 G から、2 G, 3 G, 4 G, \ldots  を計算していくと、次々と異なる（楕円曲線上の）点が得られるが、上述のように E(\mathbf{F}_p) は有限集合であるから、この点列はいずれは無限遠点 n G = O に到達する（ただし楕円曲線によってはそのようなGはG=Oしか無い事もある）。その後は、(n+1)G = G, (n+2) G = 2G, (n+3) G = 3 G, \ldots  と繰り返される。このように G からスカラー倍算によって得られる点の集合を \langle G \rangle = \{ G, 2 G, 3 G , \ldots, O \} と書くことにすると、\langle G \rangle は巡回群となる。 n は巡回群の位数と呼ばれ、\langle G \rangle を生成する元 G はベースポイントと呼ばれる。

E(\mathbf{F}_p) 上の全ての点の個数を \sharp E(\mathbf{F}_p) とすれば、これは高々 2p+1 個(無限遠点 O を含む)であり、位数 n はこれより小さくなるが、楕円曲線のパラメーター a,b,pに依存し、実際の値はSchoofのアルゴリズムまたはその改良版などを用いて計算しないと分からない( \sharp E(\mathbf{F}_p) の値の範囲については、ハッセの定理という手掛かりがある)。n が素数の場合、巡回群 \langle G \rangle の全ての元は \langle G \rangle の生成元であり、それらの位数は全て n になる。

h = \frac{1}{n} \sharp E(\mathbf{F}_p) で定義される値 h はコファクターと呼ばれるが、この値は必ず 1 より大きくなり、実用上はなるべく 1 に近いことが望ましいとされる。 a,b,p,G の取り方によっては、h \fallingdotseq 1 とすることが可能である(後述の secp256k1 では、h \fallingdotseq 1 である)。h \fallingdotseq 1 の場合、E(\mathbf{F}_p) 上の点は、ほぼ全て \langle G \rangle の元であるので、ベースポイントを見つけることは容易になる。モーデルの定理が示唆するように h \fallingdotseq 1 以外の場合も可能であり、h \fallingdotseq 2 となる実用的楕円曲線の仕様もある。

楕円曲線暗号においては、巡回群の位数 n が小さければ、次に説明する離散対数問題やディフィー・ヘルマン問題が比較的容易に解けてしまうため、セキュリティ強度(後述)を強くするためには、n がなるべく大きな素数となるように、パラメーター a,b,p,G を決定する必要がある。これは、多数のパラメーターの候補について、Schoofのアルゴリズムまたはその改良版などを用いて実際に n を計算するという試行錯誤により行われる。

楕円曲線のパラメーターの一例として、ビットコインで使われている楕円曲線暗号である secp256k1 のものを示す。 

p = 2^{256} - 2^{32} - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1
\, = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F
 E : \,y^2 = x^3 + 7
G = (G_x, G_y)
G_x = 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798
G_y = 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8
n = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141
h = 1

### 離散対数と離散対数問題
巡回群 \langle G \rangle の任意の要素（楕円曲線上の点）Q に対し、Q = dG を満たす d が \{0,1,\ldots , n-1\}  の中に常にただ一つ存在する。このような d を Q の離散対数と呼ぶ。また、\langle G \rangle から無作為に選ばれた Q を与えられ、その離散対数を求めよという問題を、**楕円曲線上の離散対数問題(EC-DLP)** と呼ぶ。d と Q の対応は1対1であり、d から Q を計算することは比較的容易だが、Q から d を計算することは実質的に不可能である。つまり d と Q の対応は一方向性関数になっている。この性質を利用して、d を秘密鍵とし、Q を公開鍵としたデジタル署名アルゴリズムが実用化されている(楕円曲線DSA (ECDSA))。

これの応用問題として、2者 A、B がそれぞれ秘密鍵 d_A,\, d_B を保持し、これから生成された公開鍵 Q_A,\, Q_B  (Q_A = d_A G, Q_B = d_B G) をそれぞれ公開しており、A、B は互いに相手の秘密鍵の値は知らない場合を考える。A は、公開されている Q_B に自分が保持している d_A をスカラー倍すれば Q_{AB} = d_A d_B G の値を得られるし、B は同様に、Q_A に d_B をスカラー倍すれば Q_{AB} = d_A d_B G の値を得られる。では d_A,\, d_B の両方の値を知らない第三者 C は Q_A および Q_B の値のみから Q_{AB} = d_A d_B G の値を得る方法はあるかというのが **楕円曲線上のディフィー・ヘルマン問題** と呼ばれる問題である。現在のところ解法としては、Q_A = d_A G または Q_B = d_B G についての離散対数問題を解く以外の方法は知られておらず、この問題を一方向性関数として使用することが可能である。つまり Q_{AB} = d_A d_B G を A、B のみが知る共通鍵として使用可能である(ディフィー・ヘルマン鍵共有)。

### スカラー倍算の効率化
暗号化・復号の過程において、Q=dP（P,\, Q は楕円曲線上の点）というスカラー倍算を行う。
ナイーヴな実装としては Q = ( \cdots ( ( P+P ) + P ) + \cdots ) + P というように Pを (d-1) 回加算（1回目は2倍算となる）するが、これでは効率が悪い。

スカラー倍算はRSA暗号などにおけるべき乗剰余演算とリンクしており、これの高速化手法もそれから流用できるものが多い。例えば、そのひとつとして有名なBinary法では、dを2進数表記し、dの各ビット d_i が "0" の場合は2倍算のみを行い、"1" の場合は2倍算と加算を行うことにより、ナイーブな実装と同じ計算をより高速に行なっている。この計算手法では、2倍算はべき乗剰余演算における自乗算、加算は掛け算にそれぞれ対応している。

この演算は楕円曲線暗号の根幹を成している部分であり、楕円曲線暗号を利用する際の時間の大半を占めている。ゆえに、ICカードなどハードウェア上に演算回路を実装する場合はサイドチャネル攻撃（特にSPA、DPA）のターゲットとなる箇所なので工夫が必要となる。

## 安全性と攻撃手法
### 離散対数問題のセキュリティ強度
(セキュリティ・レベル)は暗号の破られにくさを表す1つの指標(単位はビット)であり、セキュリティ強度が  l (ビット)であるとは、攻撃者が暗号から鍵(あるいは平文)を解読するために必要な単位操作の回数が  2^l 回程度であることを表している
。例えば 共通鍵暗号である AES-128 (鍵長 128 ビット) は、攻撃者が必要な単位操作の回数が  2^{128} 回になるように設計されている(つまり、全ての鍵について総当たり攻撃(Brute-force attack)を行わないと解読できないように設計されている。この場合はセキュリティ強度＝鍵長となる)。一方、RSA暗号の場合、これと同等のセキュリティ強度を得るには約 3072 ビットの鍵長が必要になる(つまり何らかの冗長性を利用して、攻撃者は必要な単位操作の回数を節約することが可能なことを意味している)。

離散対数問題(DLP)は、残念ながら総当たり攻撃によらなくても解読できることが分かっている。例えば、ポラード・ロー離散対数アルゴリズムを用いて離散対数を計算するのに必要な単位操作回数(この場合は楕円加算回数)はおよそ \sqrt{n\pi/4} 回である。従って、離散対数問題(およびそれと同等なディフィー・ヘルマン問題)のセキュリティ強度  l は、鍵長を  l_n = \log _2 n とした場合、l = \log _2 {\sqrt{n\pi/4}} = \frac{1}{2}(\log _2 n + \log _2 (\pi/4)) であるから、概略  l = \frac{1}{2} \log _2 n = \frac{l_n}{2}  となる。つまり鍵長 256 ビットの楕円曲線暗号(secp256k1 など) は、鍵長 128 ビットのAESと同程度のセキュリティ強度を有するということになる。この  l = \frac{l_n}{2}  という離散対数問題のセキュリティ強度の特性は、ワイエルシュトラスの標準形ではないエドワーズ曲線などの楕円曲線(Curve448、Curve25519など)を用いた場合も同様である。

アメリカ国立標準技術研究所(NIST)は、セキュリティ強度が 112 ビットの暗号は、2030年まで社会的な用途で使用を許容されるが、2031年以降はセキュリティ強度が 128 ビット以上の暗号のみが許容可能であると勧告している。

また、前述のように、一部の「anomalous な楕円曲線」と呼ばれる \mathbf{F}_p 上の離散的楕円曲線では、離散対数問題を解く多項式時間アルゴリズムが見つかっている。anomalous な楕円曲線とは、ある素数 p について \sharp E(\mathbf{F}_p) = p を満たす、かなり特殊な楕円曲線であり、この上の離散対数問題を (\log_2 p)^3 回程度の単位操作回数で解くアルゴリズムが提案されている。anomalous な楕円曲線の特徴 \sharp E(\mathbf{F}_p) = p は簡単に確認できるので、サボタージュなどの意図で故意に使用されない限り、セキュリティ上の脅威となることは今のところは無いと考えられる。

### サイドチャネル攻撃
楕円曲線上で楕円加算 *P + Q * を行う場合、加算(*P* ≠ *Q*)と2倍算(*P* = *Q*)では演算プロセスが大きく異なる。そのため、サイドチャネル攻撃（例えば、タイミング攻撃や単純電力解析/差分電力解析）への対策（例えば  など）が必要である。あるいは、を使うこともできる。この曲線は、加算と2倍算を同じ演算プロセスで実行できる特別な楕円曲線の族である。

### 量子コンピュータを用いた攻撃
離散対数問題を効率的に解くことのできるショアのアルゴリズムは、楕円曲線暗号の解読にも利用できる。256ビットの法を持つ楕円曲線暗号（128ビット安全）を破るためには、2330量子ビット、1,260億トフォリゲートのリソースを持つ量子コンピュータが必要であると見積もられている。
一方、アメリカ国立標準技術研究所の勧告（NIST SP 800-57）によりこれと同等のセキュリティレベルとされる3072ビット鍵のRSA暗号を破るためには、6146量子ビット、18.6兆トフォリゲートが必要であり、量子コンピュータにとっては、RSA暗号に比べ楕円曲線暗号は攻撃しやすい。いずれにせよ、これらのリソースは現在実存する量子コンピュータのリソースをはるかに超えており、このようなコンピュータの構築は10年以上先になると見られている。

同種写像暗号は、楕円曲線の同種写像を用いた暗号方式であり、量子コンピュータに対して耐性がある（耐量子）と考えられている。同種写像暗号の例としてディフィー・ヘルマン鍵共有と同様に鍵共有を行うSIDHがある。従来の楕円曲線暗号と同じ体の演算を多く使用し、必要な計算量や通信量は現在使用されている多くの公開鍵システムと同程度である。

## 注釈

## 解読
* 2004年4月10日: ECC2 109ビットの解読に成功 (certicom)。
* 2009年7月8日: ECC 112ビットの解読に成功（SONY・PS3使用）http://lacal.epfl.ch/page81774.html

## 脚注

## 参考文献
* 
*
*
* 
* 

## 関連文献
（拡充予定）
; 和書
* 有田正剛、境隆一、只木孝太郎、趙晋輝、松尾和人：「暗号理論と楕円曲線」、森北出版、ISBN 978-4-627-84751-4 (2008年9月5日).
* 宮地充子：「代数学から学ぶ暗号理論：整数論の基礎から楕円曲線暗号の実装まで」、日本評論社、ISBN 978-4-535-78679-0 (2012年3月10日).

## 関連項目
* 暗号理論
* 楕円曲線暗号の特許
* 楕円曲線ディフィー・ヘルマン鍵共有
* 楕円曲線DSA