楕円曲線スカラー乗算は、楕円曲線上の点をそれ自体に繰り返し加算する演算です。楕円曲線暗号(ECC) で使用されます。文献では、この演算は楕円曲線のヘッセ形式で記述されるスカラー乗算として示されています。この演算は楕円曲線点乗算とも呼ばれますが、これは 2 点間の乗算であるという誤った印象を与える可能性があります。
基礎
有限体における何らかの方程式によって定義された曲線E ( E : y 2 = x 3 + ax + bなど)が与えられた場合、点乗算はその曲線に沿った点の繰り返し加算として定義されます。あるスカラー(整数)nと曲線E上にある点P = ( x , y )に対して、 nP = P + P + P + … + Pと表します。このタイプの曲線はワイエルシュトラス曲線として知られています。
現代の ECC のセキュリティは、nが大きい場合にQとPの既知の値からQ = nPからn を決定することの難しさ (他の暗号化システムとの類似性から楕円曲線の離散対数問題として知られています) に依存しています。これは、楕円曲線上の 2 つの点を追加すると (または 1 つの点をその点自体に追加すると)、楕円曲線上の 3 番目の点が生成され、その位置は最初の 2 つの位置とはすぐには明らかな関係がなく、これを何度も繰り返すと、基本的にどこにでもある可能性のある点nPが生成されるためです。直感的には、これは、円上に点P がある場合、その角度に 42.57 度を追加してもPから「それほど遠くない」点になる可能性がありますが、42.57 度を 1000 倍または 1001 倍追加すると、元の角度を見つけるためにもう少し複雑な計算が必要な点が生成されることと似ています。このプロセスを逆にして、つまりQ=nPおよびP が与えられ、n を決定するには、すべての可能なnを試してみるしかありませんが、 nが大きい場合、この作業は計算上不可能です。
ポイント操作

楕円曲線の点に対して一般的に定義されている演算は、加算、倍増、否定の 3 つです。
無限遠点
無限大点 は、楕円曲線演算の単位元です。これを任意の点に追加すると、別の点が生成されます。無限大点自体を追加する場合も同様です。つまり、
無限遠点は0とも表記されます。
ポイント否定
点の否定とは、それ自身に加えると無限遠点 ( ) になるような点を見つけることです。
E : y 2 = x 3 + ax + bという形式の楕円曲線の場合、否定はx座標は同じだがy座標が否定された点である。
ポイント追加
2つの異なる点PとQ がある場合、加法は曲線Eと点PとQによって定義される直線との交点の否定として定義され、点Rが得られます。[1]
楕円曲線Eがy 2 = x 3 + ax + bで与えられると仮定すると、これは次のように計算できます。
これらの式は、どちらの点も無限遠点ではない場合、および点の x 座標が異なる場合 (相互に逆ではない場合) に正しいです。これは、ハッシュ値がゼロになる可能性があるECDSA 検証アルゴリズムにとって重要です。
ポイント倍増
点PとQが一致する場合(同じ座標にある場合)は、加算は同様ですが、 P を通る明確に定義された直線がないため、演算は、 Pにおける曲線Eの接線という極限ケースを使用して閉じられます。
これは、導関数(dE/dx)/(dE/dy)をとって、上記のように計算されます。[2]
ここで、a は上記の曲線Eの定義方程式から得られます。
ポイント乗算
ポイント乗算を計算する最も簡単な方法は、加算を繰り返すことです。ただし、乗算を計算するより効率的な方法があります。
倍にして足す
最も単純な方法は、倍数化して加算する方法[3]で、モジュラー指数の平方乗算に似ています。アルゴリズムは次のように機能します。
sP を計算するには、 sのバイナリ表現から始めます: 、ここで 。
- 反復アルゴリズム、インデックス増加:
let bits = bit_representation(s) # s を表すビットのベクトル (LSB から MSB まで)
res = # 無限大を指す
let temp = P # 2倍になったP値を追跡する
ビット単位のビットの場合:
ビット == 1 の場合:
res = res + temp # ポイント追加
temp = temp + temp # 倍
戻り値
- 反復アルゴリズム、インデックスの減少:
let bits = bit_representation(s) # s を表すビットのベクトル (LSB から MSB まで)
i = 長さ(ビット) - 2 とします。
res = Pとする
while (i >= 0): # 2番目のMSBからLSBまで移動
res = res + res # 倍精度
ビット[i] == 1の場合:
res = res + P # 追加
私 = 私 - 1
戻り値
上記の反復法は両方ともタイミング解析に対して脆弱であることに注意してください。代替アプローチについては、以下の Montgomery Ladder を参照してください。
- 再帰アルゴリズム:
f(P, d)は
d = 0 の場合
0を返す # 計算完了
そうでなければd = 1の場合
Pを返す
そうでなければ、d mod 2 = 1 ならば
return point_add(P, f(P, d - 1)) # dが奇数の場合の加算
それ以外
return f(point_double(P), d / 2) # dが偶数の場合は2倍にする
ここで、fは乗算する関数、Pは乗算する座標、d は座標を自身に加算する回数です。例: 100P は2(2[P + 2(2[2(P + 2P)])])と表記され、6 回の点の倍精度演算と 2 回の点の加算演算が必要です。100Pはf(P, 100)に等しくなります。
このアルゴリズムでは、完全な点乗算を計算するために、log 2 ( d ) 回の点の倍加と加算の反復が必要です。このアルゴリズムには、ウィンドウ、スライディング ウィンドウ、NAF、NAF-w、ベクトル チェーン、モンゴメリ ラダーを使用するなど、さまざまなバリエーションがあります。
ウィンドウ方式
このアルゴリズムのウィンドウバージョン[3]では、ウィンドウサイズwを選択し、 のすべての値を計算します。アルゴリズムは表現を使用し、次のようになります。
Q ← 0
iがmから0までの場合
Q ← ポイントダブルリピート(Q, w)
d i > 0 ならば
Q ← point_add(Q, d i P) # d i Pの事前計算された値を使用する
Qを返す
このアルゴリズムは、倍増と加算のアプローチと同じ複雑さを持ちますが、ポイント加算 (実際には倍増よりも低速) が少なくなるという利点があります。通常、wの値は、事前計算段階がアルゴリズムの些細なコンポーネントになるように、かなり小さく選択されます。NIST 推奨曲線の場合、通常は が最適な選択です。nビット数の全体的な複雑さは、ポイント倍増とポイント加算 として測定されます。
スライディングウィンドウ方式
スライディング ウィンドウ バージョンでは、ポイントの追加とポイントの倍増をトレードオフします。ウィンドウ バージョンと同様のテーブルを計算しますが、のポイントのみを計算します。実質的には、ウィンドウの最上位ビットが設定されている値のみを計算します。次に、アルゴリズムは の元の倍増および加算表現を使用します。
Q ← 0
i が m から 0 までの場合
d i = 0の場合
Q ← ポイントダブル(Q)
それ以外t ← d(d iを含む)
からj(w − 1まで)の追加ビットを抽出する
私 ← 私 − j
j < w ならば
tを使用して倍増加算を実行する
Qを返す
それ以外
Q ← ポイントダブルリピート(Q, w)
Q ← ポイント追加(Q, tP)
Qを返す
このアルゴリズムの利点は、事前計算段階が通常のウィンドウ方式の約半分の複雑さで済むことですが、ポイントの倍増と引き換えに、ポイントの追加が遅くなります。実際には、前者が定数時間で実装できることを除けば、このアプローチよりもウィンドウ方式を使用する理由はほとんどありません。このアルゴリズムでは、ポイントの倍増と、最大でポイントの追加が必要です。
わ非隣接形式(わNAF法
非隣接形式では、ポイント減算はポイント加算と同じくらい簡単であるという事実を利用して、スライディングウィンドウ法と比較して(どちらも)実行回数を減らすことを目指します。まず、次のアルゴリズムを使用して、被乗数のNAFを計算する必要があります。
私 ← 0
(d > 0) の場合
(d mod 2) = 1の場合
d i ← d を 2 で割った値w
d ← d − d i
それ以外
d i = 0
d ← d/2
私 ← 私 + 1
(d i−1 , d i-2 , …, d 0 )
を返す
ここで符号付き剰余関数modsは次のように定義される。
(d mod 2 w ) >= 2 w−1の場合、
(d mod 2 w ) − 2 w を返す。
それ以外
d mod 2 wを返す
これにより、乗算を実行するために必要な NAF が生成されます。このアルゴリズムでは、点とその負の数 ( は乗算する点) を事前に計算する必要があります。一般的なワイエルシュトラス曲線では、であれば となります。つまり、負の数を計算するのは本質的に簡単です。次に、次のアルゴリズムで乗算 を計算します。
Q ← 0
j ← i − 1 から 0 まで
Q ← ポイントダブル(Q)
(d j != 0)の場合
Q ← point_add(Q, d j P)
Qを返す
wNAF は、平均してポイント追加の密度があることを保証します(符号なしウィンドウよりもわずかに優れています)。事前計算には 1 ポイントの倍増とポイント追加が必要です。その後、アルゴリズムは残りの乗算に ポイントの倍増とポイント追加を必要とします。
NAF の 1 つの特性は、すべての非ゼロ要素の後に少なくとも追加のゼロが続くことが保証されることです。これは、アルゴリズムがmods関数の出力を減算するたびにの下位ビットをクリアするためです。この観察は、いくつかの目的に使用できます。すべての非ゼロ要素の後に追加のゼロが暗黙的に存在し、保存する必要はありません。次に、2 による複数の連続除算を、すべての非ゼロ要素の後にによる除算を行い、すべてのゼロの後に 2 で除算することで置き換えることができます。
OpenSSLにFLUSH+RELOADサイドチャネル攻撃を適用すると、わずか200個の署名に対してキャッシュタイミングを実行するだけで完全な秘密鍵を明らかにできることが示されています。[4]
モンゴメリーラダー
モンゴメリラダー[5]アプローチは、固定された回数の演算で点乗算を計算します。これは、タイミング、消費電力、または分岐測定がサイドチャネル攻撃を実行する攻撃者にさらされている場合に役立ちます。アルゴリズムは、倍精度加算と同じ表現を使用します。
R 0 ← 0
R 1 ← P
i が m から 0 までの場合
d i = 0の場合
R 1 ← point_add(R 0 , R 1 )
R 0 ← ポイントダブル(R 0 )
それ以外
R 0 ← point_add(R 0 , R 1 )
R 1 ← ポイントダブル(R 1 )
// 正確性を維持するための不変プロパティ
R 1 == point_add(R 0 , P)をアサートする
R 0を返す
このアルゴリズムは、被乗数dの値に関係なく、同じ数のポイント加算と倍増を計算する点を除けば、実質的に倍増と加算のアプローチと同じ速度です。つまり、このレベルでは、アルゴリズムは分岐や電力消費を通じて情報を漏らしません。
しかし、OpenSSLにFLUSH+RELOADサイドチャネル攻撃を適用すると、非常に低コストで1つの署名に対してキャッシュタイミングを実行するだけで完全な秘密鍵を明らかにできることが示されています。[6]
モンゴメリーラダーのRustコード: [7]
/// 定数演算ポイントの乗算。
/// 注: メモリセーフではありません。
/// * `s`: 乗算するスカラー値
/// * 乗算は P₀ + P₁ + ... Pₛ と定義されます
fn sec_mul ( & mut self , s : big ) -> E521 { let mut r0 = get_e521_id_point (); let mut r1 = self . clone (); for i in ( 0 ..= s . validity_bits ()). rev () { if s . get_bit ( i ) { r0 = r0 . add ( & r1 ); r1 = r1 . add ( & r1 . clone ()); } else { r1 = r0 . add ( & r1 ); r0 = r0 . add ( & r0 . clone ()); } } r0 // r0 = P * s }
定数時間モンゴメリラダー
暗号実装のセキュリティは、実装のデータ依存のタイミング特性を悪用する、いわゆるタイミング攻撃の脅威に直面する可能性があります 。暗号実装を実行するマシンは、さまざまな入力を処理するためにさまざまな時間を消費するため、タイミングは暗号化キーによって異なります。この問題を解決するために、暗号アルゴリズムは、実装からデータ依存の可変タイミング特性を削除する方法で実装され、いわゆる定数時間実装につながります。ソフトウェア実装は、[8]で述べられているように、次の意味で定数時間であると見なされます。 「すべての入力依存の分岐、すべての入力依存の配列 インデックス、および入力依存のタイミングを持つその他の命令を回避します。」GitHubページ[9]には、暗号操作の実装、およびより一般的には秘密または機密の値を含む操作のコーディング規則がリストされています。
モンゴメリ・ラダーは、楕円曲線の点乗算のための -座標のみのアルゴリズムであり、モンゴメリ曲線と呼ばれる特定の曲線セット上の倍精度および加算規則に基づいています。このアルゴリズムには条件分岐があり、条件は秘密ビットに依存します。そのため、ラダーの直接的な実装は定数時間ではなく、秘密ビットが漏洩する可能性があります。この問題は文献[10] [11]で取り上げられており 、定数時間の実装がいくつか知られています。定数時間のモンゴメリ・ラダー・アルゴリズムは以下に示すように、2 つの関数 CSwap と Ladder-Step を使用します。アルゴリズムの戻り値 Z 2 p-2は、フェルマーの小定理を使用して計算されたZ 2 -1の値です。
アルゴリズムMontgomery-Ladder(x P ,n) 入力:ビットのスカラーと点の座標。 出力:の座標、のスカラー倍数。X 1 ← x P ; X 2 ← 1; Z 2 ← 0; X 3 ← x P ; Z 3 ← 1
前へ ← 0 から0までbit ← インデックスの ビット値 b ← ビット前ビット 前ビット ← ビット ( X 2、Z 2、X 3、Z 3 ) ← CSwap( X 2、Z 2、X 3、Z 3、b) ( X 2 ,Z 2 , X 3 ,Z 3 ) ← ラダーステップ( X 2 ,Z 2 , X 3 ,Z 3 ,X 1 )戻り値X 2 Z 2 p-2
ラダー内で使用されるラダーステップ関数 (以下に示す) は、アルゴリズムの中核であり、微分加算と倍増演算を組み合わせた形式です。フィールド定数 a 24は、a 24 =として定義されます。ここで、 は基礎となるモンゴメリ曲線のパラメータです。
関数ラダーステップ( X 2 ,Z 2 , X 3 ,Z 3 ,X 1 ) T 1 ← X 2 + Z 2 T 2 ← X 2 - Z 2 T 3 ← X 3 + Z 3 T 4 ← X 3 - Z 3 T 5 ← T 1 2 T 6 ← T 2 2 T 2 ← T 2 · T 3 T 1 ← T 1 · T 4 T 1 ← T 1 + T 2 T 2 ← T 1 - T 2 X 3 ← T 1 2 T 2 ← T 2 2 Z 3 ← T 2 · X 1 X 2 ← T 5 · T 6 T 5 ← T 5 - T 6 T 1 ← a 24 · T 5 T 6 ← T 6 + T 1 Z 2 ← T 5 · T 6 return ( X 2 ,Z 2 , X 3 ,Z 3)
CSwap関数は条件分岐を管理し、ラダーが定数時間実装の要件に従って実行されるのを助けます。この関数は、 = 1の場合にのみフィールド要素のペアX 2、Z 2とX 3、Z 3を交換し、これは秘密ビットに関する情報を漏らすことなく行われます。文献ではCSwapを実装するさまざまな方法が提案されています。[10] [11]モンゴメリラダーの定数時間要件を管理するためのよりコストのかからないオプションは、関数CSelectを通じて形式化された条件選択です。この関数はさまざまな最適化で使用されており、 [12]で正式に議論されています。
128 ビット セキュリティ レベルでの標準モンゴメリ曲線Curve25519の導入以来、さまざまなアーキテクチャで ECDH を計算するためのさまざまなソフトウェア実装があり、暗号開発者は、可能な限り最高のパフォーマンスを実現するために、基礎となるアーキテクチャのアセンブリ言語を使用して実装を記述してきました。研究[13]では、AMD64 アーキテクチャを対象とした 64 ビット アセンブリ実装がいくつか提供されました。実装は、高速アセンブリ言語暗号化プログラムを生成できるqhasm [14]というツールを使用して開発されました。これらのラダーの実装では関数 CSwap が使用されたことに注意してください。その後、手書きのアセンブリ プログラムを介してラダー実装を最適化する試みがいくつか行われ、その中から CSelect の概念が最初に[15]で使用され、次に[16]で使用されました。 [17] [18] [19] [20] AMD64に加えて、ARMのような他のアーキテクチャ上で効率的な実装を実現する試みも行われてきました。作品[21]と[22]はARMアーキテクチャを対象とした効率的な実装を提供しています。ライブラリlib25519 [23]と[24]は、 Curve25519用のモンゴメリラダーの効率的な実装を含む2つの最先端のライブラリです。ただし、ライブラリには他の暗号プリミティブの実装も含まれています。
Curve25519以外にも、さまざまなセキュリティ レベルで他の曲線上のラダーを計算する試みがいくつか行われてきました。224 ビットのセキュリティ レベルでの標準曲線Curve448上のラダーの効率的な実装も文献で研究されています。[15] [18] [20] 200 ビットをわずかに超えるセキュリティを提供する Curve41417 という曲線が提案されました[25]。この曲線では、Karatsuba 戦略のバリアントを使用して、関連する ECC ソフトウェアに必要なフィールド乗算を実装しました。Curve25519およびCurve448に匹敵するモンゴメリ曲線の検索に関する研究が行われ、対応するラダーの効率的なシーケンシャル[16]およびベクトル化実装[20]とともに、いくつかの曲線が提案されました。256 ビットのセキュリティ レベルでは、3 つの異なるモンゴメリ曲線を通じてラダーの効率的な実装にも対処されています。[26]
参考文献
- ^ 「楕円曲線 - 明示的な加算公式」。
- ^ 「楕円曲線 - 明示的な加算公式」。
- ^ ab Hankerson, Darrel; Vanstone, Scott; Menezes, Alfred (2004).楕円曲線暗号ガイド. Springer Professional Computing. ニューヨーク: Springer-Verlag. doi :10.1007/b97644. ISBN 0-387-95273-X. S2CID 720546。
- ^ Benger, Naomi; van de Pol, Joop; Smart, Nigel P.; Yarom, Yuval (2014). Batina, Lejla; Robshaw, Matthew (eds.). 「ああ、ああ...ほんの少しだけ」: 少量のサイドチャネルでも大きな効果があります(PDF)。 暗号化ハードウェアと組み込みシステム - CHES 2014。 コンピュータサイエンスの講義ノート。 Vol. 8731。 Springer。 pp. 72–95。doi :10.1007/978-3-662-44709-3_5。ISBN 978-3-662-44708-6。
- ^ Montgomery, Peter L. (1987). 「ポラード法と楕円曲線法による因数分解の高速化」. Math. Comp. 48 (177): 243–264. doi : 10.2307/2007888 . JSTOR 2007888. MR 0866113.
- ^ Yarom, Yuval; Benger, Naomi (2014). 「FLUSH+RELOAD キャッシュサイドチャネル攻撃を使用した OpenSSL ECDSA ナンスの回復」IACR Cryptology ePrint Archive。
- ^ レイ・ダスティン。「E521」 。 2023年2月25日閲覧。
- ^ Bernstein, Daniel J. 「Curve25519: 新しい Diffie-Hellman 速度記録」。Yung, M.、Dodis, Y.、Kiayias, A.、Malkin, T. (編) 『公開鍵暗号化 - PKC 2006』。Lecture Notes in Computer Science、vol 3958。Springer、ベルリン、ハイデルベルク。
- ^ Aumasson, Jean-Philippe. 「低レベル暗号化ソフトウェアのガイドライン」. GitHub . 2024年3月26日閲覧。
- ^ ab Bernstein, Daniel J.; Lange, Tanja. 「モンゴメリ曲線とモンゴメリラダー」。 Joppe W. Bos と Arjen K. Lenstra 編著『Topics in Computational Number Theory inspired by Peter L. Montgomery』、82~115 ページ。 Cambridge University Press、2017 年。
- ^ ab コステロ、クレイグ、スミス、ベンジャミン。「モンゴメリ曲線とその算術 - 大きな特性体の場合」。J. 暗号工学、8(3):227–240、2018年。
- ^ ナス、カウシク;サルカール、パラシュ。 「コンスタント・タイム・モンゴメリー・ラダー」。暗号学の ePrint アーカイブ、論文 2020/956。
- ^ バーンスタイン、ダニエル・J.デュイフ、ニールス。タンジャ、ランゲ。シュワーベ、ピーター。ヤン、ボイン。 「高速・高セキュリティな署名」。 J. 暗号工学、2(2):77–89、2012。
- ^ Bernstein、Daniel J.「qhasm: 高速ソフトウェアの作成を支援するツール」。
- ^ ab Oliveira, Thomaz; López, Julio; Hisil, Hüseyin; Faz-Hernández, Armando; Rodrı́guez-Henrı́quez, Francisco. 「ラダーの (事前) 計算方法: X25519 と X448 のパフォーマンスの向上」。Carlisle Adams および Jan Camenisch 編著、Selected Areas in Cryptography - SAC 2017 - 24th International Conference、オタワ、オンタリオ州、カナダ、2017 年 8 月 16 ~ 18 日、改訂版 Selected Papers、Lecture Notes in Computer Science の第 10719 巻、172 ~ 191 ページ。Springer、2017 年。コードは https://github.com/armfazh/rfc7748_precomputed で入手できます。
- ^ ab Nath, Kaushik; Sarkar, Palash. 「128ビットおよび224ビットのセキュリティレベルでの楕円曲線Diffie-Hellmanのセキュリティと効率のトレードオフ」。J Cryptogr Eng 12、107–121(2022)。コードは https://github.com/kn-cs/x25519 で入手可能です。
- ^ Chou, Tung. 「Sandy2x: 新しい curve25519 速度記録」。Orr Dunkelman および Liam Keliher 編著、Selected Areas in Cryptography - SAC 2015 - 22nd International Con- ence、Sackville、NB、カナダ、2015 年 8 月 12 ~ 14 日、Revised Selected Papers、Lecture Notes in Computer Science の第 9566 巻、145 ~ 160 ページ。Springer、2015 年。コードは https://tungchou.github.io/sandy2x/ から入手可能です。
- ^ ab Faz-Hernández, Armando; López, Julio; Dahab, Ricardo. 「ベクトル命令を使用した楕円曲線暗号の高性能実装」。ACM Trans. Math. Softw.、45(3):25:1–25:35、2019年。、Coceはhttps://github.com/armfazh/fld-ecc-vecで入手可能
- ^ Hisil, Hüseyin; Egrice, Berkan; Yassi, Mert. 「モンゴメリ曲線の完全セットのための高速 4 ウェイ ベクトル化ラダー」。International Journal of Information Security Science、第 11 巻、第 2 号、12-24 ページ。コードは https://github.com/crypto-ninjaturtles/montgomery4x から入手可能です。
- ^ abc Nath, Kaushik; Sarkar, Palash. 「モンゴメリラダーの効率的な4方向ベクトル化」。IEEE Transactions on Computers、vol. 71、no. 3、pp. 712-723、2022年3月1日。コードは https://github.com/kn-cs/vec-ladder で入手可能です
- ^ Bernstein, Daniel J.; Schwabe, Peter. 「NEON 暗号」。Emmanuel Prouff および Patrick Schaumont 編著、Cryptographic Hardware and Embedded Systems - CHES 2012 - 14th International Workshop、ルーベン、ベルギー、2012 年 9 月 9 ~ 12 日。議事録、Lecture Notes in Computer Science の第 7428 巻、320 ~ 339 ページ。Springer、2012 年。
- ^ レングレン、エミール。 「X25519 向けの AArch64 最適化実装」(PDF)。 GitHub。
- ^ Nath, Kaushik; Bernstein, Daniel J.「lib25519」。
- ^ ハリソン、ジョンR.「s2n-bignum」。
- ^ Bernstein, Daniel J.; Chitchanok, Chuengsatiansup; Tanja, Lange. 「Curve41417: Karatsuba 再考」。Batina, L.、Robshaw, M. (編) 暗号ハードウェアおよび組み込みシステム - CHES 2014。CHES 2014. Lecture Notes in Computer Science、vol 8731。Springer、ベルリン、ハイデルベルク。
- ^ Nath, Kaushik; Sarkar, Palash. 「256ビットセキュリティレベルでの効率的な楕円曲線Diffie-Hellman計算」。IET情報セキュリティ、14(6):633640、2020年。コードは https://github.com/kn-cs/mont256-dh および https://github.com/kn-cs/mont256-vec で入手可能です。
