Ed25519 実装の詳細
Curve25519 と Edwards 曲線
Edwards 曲線デジタル署名アルゴリズム Ed25519 で
は、Curve25519 と双有理同値の次の楕円曲線が使用
されます。有限体の位数は、素数 p = 2255 - 19 です。
-x2 + y2 = 1 + dx2y2
d = - 121665121666


d は実装における定数 _D に対応します。また、_L
基点の位数を表す素数です。
l = 2252 + 27742317777372353535
 851937790883648493


基点 _B は、y = u - 1u + 1 および u = 9 より次の通りと
なります。
B = (-((45)2 - 1- 121665121666(45)2 + 1)12, 45)

x 座標と y 座標に対応したスカラー倍算 _MUL2 は、ス
カラーのビット列の表現に従って、1 の場合に点の加算
_ADD2 を行い、点の和をループの進行に伴い _DBL2
2 の累乗倍する動作内容です。奇数倍の場合は、最下位
ビットが 1 であることを用いて _ADD2 の出力を結果と
します。T = XYZ を追加した拡張座標を使用して、演
算を実装します。

_DBL2 は次の式を実行します。
X = 2X0Y0(2Z02 + X02 - Y02)
Y = (X02 + Y02)(X02 - Y02)
Z = (X02 - Y02)(2Z02 + X02 - Y02)
T = 2X0Y0(X02 + Y02)


_ADD2 は次の式を実行します。
X = 4(X0Y1 + X1Y0)(Z0Z1 - dT0T1)
Y = 4(X0X1 + Y0Y1)(Z0Z1 + dT0T1)
Z = 4(Z0Z1 + dT0T1)(Z0Z1 - dT0T1)
T = 4(X0Y1 + X1Y0)(X0X1 + Y0Y1)


_2D は、_ADD2 に使用する式変形の定数 2d です。

_ENC_DECx 座標と y 座標を公開鍵や署名とし
て扱うために使用します。_ENC では y 座標の値と x
座標の最下位 1 ビットを保存します。_DEC は点を復元
します。y 座標が 0 以上 p 未満であることを確認した
後、x 座標を、y 座標と x 座標の最下位 1 ビットから
復元します。x 座標は y 座標のみを含む平方根であり、
値を確定するために x 座標の最下位 1 ビットを使用し
ます。偶数の場合に正、奇数の場合に負と定義され、こ
のビットが 0 の場合は偶数、1 の場合は奇数です。x
と偶数・奇数が相違する場合には 0 - x を割り当てます。
x = 0 で相違するとき、入力は無効と判断します。また、
x の解が存在しない場合や、y 座標が範囲外である場合
にも入力が無効となります。_DEC の戻り値は 0 または
1 で、入力が無効な場合に 1 となります。x が示す平方
根は次の通りに求めます。
x2 = y2 - 1dy2 + 1 mod p

_SQRT には、上記の分子と分母を個別に入力します。
p = 5 mod 8 であることから、以下の特殊な式を使用
できます。定数 _IMG(-1)12 mod p です。この値
は、2p - 14 mod p を計算して得ることができます。

x = (y2 - 1dy2 + 1)p + 38 mod p

 = (y2 - 1)(dy2 + 1)3
  ((y2 - 1)(dy2 + 1)7)p - 58 mod p

x = (-1)12(y2 - 1)(dy2 + 1)3
  ((y2 - 1)(dy2 + 1)7)p - 58 mod p


dy2 + 1 の除算を乗算に変更する際、Fermat の小定理
から 1 の乗算を利用し、指数を p - 1 - p + 38 にしま
す。p - 58 = 2252 - 3_INV と同様に計算できます。
x は 2 通り考慮し、元の式を満たすものが平方根です。
(dy2 + 1)x2 = y2 - 1 mod p

_SQRT の戻り値は 0 または 1 です。平方根が存在しな
い場合は 1 を返します。

_NEQ:
入力を比較して等しい場合に 0、等しくない場合に 1 を
返します。定数時間で比較するため、排他的論理和を累
積したビット列と、反転した列に 1 を加算したものの論
理和から最上位ビットを確認します。1 の加算は、最下
位から連続する 1 のビットの一つ先に 1 を追加し、下
位をすべて 0 にします。1 を追加した位置より上位に影
響はなく、反転したビットとの論理和により、常に 1 と
なります。最上位ビットが 0 となる場合は、反転したビ
ット列がすべて 1 であり、加算後に 0 と 0 の論理和と
なる場合に限られます

Ed25519 の署名生成と検証
最初の手順は鍵ペアの生成です。秘密鍵 a の SHA-512
出力の前半 32 バイトを _X25519 のスカラー入力と同
様に変更した H8(a) を使用して、スカラー倍算を行い
公開鍵 P = H8(a)B を得ます。

署名生成には、秘密鍵 a の SHA-512 出力の後半 32 バ
イト H32(a) も使用します。署名対象のメッセージ m
を連結した SHA-512 出力の l の剰余
H(H32(a) | m) mod l でスカラー倍算した
R = (H(H32(a) | m) mod l)B を、署名の前半 32
バイトとします。スカラー倍算で自動的に mod l が適
用されますが、内部変数の範囲の制約から、実装におい
ては剰余計算を先に実行します。

次に、署名の前半 R と公開鍵 P、メッセージ m を連結
し、SHA-512 出力の l の剰余を求めます。これに秘密
鍵の SHA-512 出力 H8(a) を乗算、l の剰余とします。
署名の後半 32 バイトは R の導出で使用したスカラーを
用いて次の通りとなります。
s = (H(H32(a) | m) mod l)
 + ((H(R | P | m) mod l)
  H8(a) mod l) mod l


_SUB3:
戻り値は繰り上がりを管理する内部変数の、配列の範囲
を超える最初の 1 ビットです。負の場合、符号付き右シ
フトで上位から 1 がコピーされる動作を利用します。演
算の結果、負の数となる場合に 1 を返します。条件付き
の代入で利用し、定数時間で実行できます

署名の検証は、入力の確認から開始します。署名の後半
32 バイト sl より小さく、公開鍵 P が有効な座標で
あることを確認します。正しい Ed25519 の署名には次
の式が成立します。s の生成式の両辺を、B のスカラー
倍算として比較することが可能で、R の座標の復元も省
略できます。
sB = R + (H(R | P | m) mod l)P
sB - (H(R | P | m) mod l)P = R


Barrett 法:
l の剰余を求めるために、一部の計算で p の剰余の代わ
りに _MOD3 を適用しています。0 以上 (28)64 未満の
入力 c(28)31 以上 (28)32 未満である l を用いて、
剰余を次のように考えます。28 はバイト境界をもとに
決定しています。
cl = c(28)31 (28)64l 1(28)33
c mod l = c - floor(cl)l


定数 _MUfloor((28)64l) に対応します。除算毎に小
数点以下の切り捨てを行った場合、
floor(cl) - floor(
 floor(c(28)31)floor((28)64l)1(28)33)


0 以上 2 以下となるため、最大 2l の減算を追加す
ることで、剰余計算を再現できます。また、c mod l
を得る減算では、差のビット表現が (28)33 未満の範囲
であることから、すべての配列要素を巡回しない演算を
実装することができます
関連項目:

ダウンロード

ライブラリ概要

X25519

更新履歴
[広告]



ライブラリへ戻ります

トップページへ戻ります
COPYRIGHT © 2019 mScroll