SIDH 実装の詳細
超特異同種写像 Diffie-Hellman 鍵共有 (SIDH)
SIDH は、超特異楕円曲線の点に同種写像を適用して得
られる楕円曲線を、公開鍵または共通の値とする方法で
す。秘密鍵は、同種写像を構成する点のスカラーです。
楕円曲線を共通の値に変換するには、j-不変量を計算し
ます。ライブラリの SIDH 実装では、751 ビットの素数
p = 23723239 - 1 を使用して、位数 p2 の有限体上の
超特異楕円曲線 y2 = x3 + 6x2 + x を初期値としてい
ます。i2 = -1 を用いて有限体を複素数で表現できます。

A と B の通信において、それぞれ次の点が割り当てられ
ています。点の位数は A、B について 23723239 です。
f(x) = x3 + 6x2 + x とします。
PA = 3239(zPA + i, f(zPA + i)12)
QA = 3239(zQA + i, f(zQA + i)12)
PB = 2371(zPB, f(zPB)12)
QB = 2371(zQB, f(zQB)12)


zPAzQAzPBzQB は次の条件に従って与えられる
最小の非負の整数です。
zPA  2371PA = (-3 ± 2(2)12, 0)
zQA  2371QA = (0, 0)
zPB  ±f(zPB)12 mod p が存在
zQB  ±f(zQB)12 mod p が不存在

A、B の秘密鍵 ab
RA = PA + aQA
RB = PB + bQB

の形式で格子を構成する 0 以上の整数で、値の上限は
2372 - 13239 - 1 です。b は 751 - 372 = 379 ビ
ットをすべて使用すると上限を超えるため、378 ビット
にします。複素数の格子は楕円曲線に相当することから、
RA または RB を基に A と B は同種写像を計算するこ
とができます。

複素数の実装:
位数 p の有限体上の 2 要素により表現され、1 個は i
の係数です。要素間は、i2 = -1i の乗算を適用して、
実数の要素による複素数と同様の演算を利用できます。
(z1 + z2i) + (z3 + z4i)
 = (z1 + z3) + (z2 + z4)i
(z1 + z2i) - (z3 + z4i)
 = (z1 - z3) + (z2 - z4)i
(z1 + z2i)2
 = (z1 + z2)(z1 - z2) + 2z1z2i
(z1 + z2i)(z3 + z4i)
 = (z1z3 - z2z4)
 + ((z1 + z2)(z3 + z4) - z1z3 - z2z4)i
1z1 + z2i
 = z1z12 + z22 - z2z12 + z22i


_BASIS:
Gen_ に代入する定数は、位数 p2 の有限体上にある P
QP - Q を並べたものを使用します

_LADDER:
秘密鍵のビット表現を下位から参照する Montgomery
Ladder です。この方法では、2 乗側を固定して乗算側
を選択します。2 乗側の式は次の通りです。Q の射影
座標を更新し、次の位にあたる点 2Q を生成します。
X = (XQ + ZQ)2(XQ - ZQ)2
Z = ((XQ + ZQ)2 - (XQ - ZQ)2)
 ((XQ - ZQ)2
 + A + 24((XQ + ZQ)2 - (XQ - ZQ)2))


乗算側の式は次の通りです。PP - Q をビットの値
に応じて交換し、PP + Q へ更新します。
X = ZP - Q((XQ + ZQ)(XP - ZP)
 + (XQ - ZQ)(XP + ZP))2
Z = XP - Q((XQ + ZQ)(XP - ZP)
 - (XQ - ZQ)(XP + ZP))2


P - Q はビットが 0 の場合に、更新された P を保存し
ます。スカラー倍算の結果は P - Q 側から取得するた
め、最上位ビットが 1 の場合は点を交換します

同種写像は、楕円曲線の点への写像を合成したものとな
ります。各段で楕円曲線の係数を新たに得て、その曲線
上に点を移します。

     

上図は同種写像のループ部分を表したものです。左上の
頂点は秘密鍵から定義された点 R0 です。垂直、水平の
線は、スカラー倍算と同種写像の適用を表します。この
例では、R0 の位数が 49、スカラー倍算は 4 を単位と
しています。Rn から Rn + 1 への同種写像を構成する
点は 48 - nRn (n0 以上 8 以下) であり、図におい
て線が終端されている位置の点です。最適化はスカラー
倍算を事前に割り当てて実装します。R8 から R9 への
同種写像によって、公開鍵または共通の値となる楕円曲
線へ移ります。公開鍵は、共通の値を得るために点が必
要となるため、通信の相手方が基礎とする点 P'Q'
P' - Q' に同種写像を適用した 3 点とします。公開鍵
による新しい楕円曲線上で、再び秘密鍵から同種写像を
構成することで写像を合成し、楕円曲線を共有します。

楕円曲線の係数:
同種写像の計算では、曲線の係数を射影座標で記述した
By2 = Cx3 + Ax2 + Cx (A = 6B = 1C = 1)
を使用します。射影座標によって有限体の逆数の計算を
削減できます。
スカラー倍算 (アフィン座標) A + 24
A のスカラー倍算 (射影座標) A + 2C4C
B のスカラー倍算 (射影座標) A - 2CA + 2C

アフィン座標に対しては A を単体で使用し、射影座標
の場合は、上記について A24_PC24 または A24_N
A24_P として保持します。これらの他に計算過程で生
じる中間の値も利用されます。また、j-不変量を求める
_J_INV には、AC を等しい比率で分解した 4A
4C を代入します

_E4N:
A の同種写像は位数 4 を単位としています。スカラー
倍算は 2 倍算で実装できます。
X = 4C(XR + ZR)2(XR - ZR)2
Z = ((XR + ZR)2 - (XR - ZR)2)
 (4C(XR - ZR)2
 + (A + 2C)((XR + ZR)2 - (XR - ZR)2))


_GET4:
同種写像の適用で得られる曲線の係数を取得します。
_EVAL4 で利用するため、中間の値も保存します。
A' + 2C' = 4X44
4C' = 4Z44
Coeff[0]  4Z42
Coeff[1]  X4 - Z4
Coeff[2]  X4 + Z4

_EVAL4:
_GET4 で求めた楕円曲線へ点を移します。
X' = ((X4 + Z4)(X - Z)
 + (X4 - Z4)(X + Z))2
 (((X4 + Z4)(X - Z)
 + (X4 - Z4)(X + Z))2
 + 4Z42(X + Z)(X - Z))
Z' = ((X4 + Z4)(X - Z)
 - (X4 - Z4)(X + Z))2
 (((X4 + Z4)(X - Z)
 - (X4 - Z4)(X + Z))2
 - 4Z42(X + Z)(X - Z))


_E3N:
B の同種写像は位数 3 を単位とします。
X = 2XR((A - 2C)(XR - ZR)4
 - (A + 2C)(XR + ZR)4
 + ((A + 2C)(XR + ZR)2
 - (A - 2C)(XR - ZR)2)
 (4XR2 - (XR + ZR)2 - (XR - ZR)2))2
Z = 2ZR((A - 2C)(XR - ZR)4
 - (A + 2C)(XR + ZR)4
 - ((A + 2C)(XR + ZR)2
 - (A - 2C)(XR - ZR)2)
 (4XR2 - (XR + ZR)2 - (XR - ZR)2))2


_GET3:
A' - 2C' = (4X32 - (X3 - Z3)2)
 (8X32 - (X3 + Z3)2 + 2(X3 - Z3)2)
A' + 2C' = (4X32 - (X3 + Z3)2)
 (8X32 + 2(X3 + Z3)2 - (X3 - Z3)2)

Coeff[0]  X3 - Z3
Coeff[1]  X3 + Z3

_EVAL3:
X' = X((X3 - Z3)(X + Z)
 + (X3 + Z3)(X - Z))2
Z' = Z((X3 + Z3)(X - Z)
 - (X3 - Z3)(X + Z))2


_INV3:
アフィン座標に変換するための 1Z を求めます。計算量
を減らすため、1Z1Z2Z3 を求めて Z1Z2Z3 の乗
算により分解します

_GET_A:
公開鍵の 3 点から楕円曲線の係数 (アフィン座標) A
計算します。
A = (xP - Q(xP + xQ) + xPxQ - 1)24xPxQxP - Q
 - xP - xQ - xP - Q


_J_INV:
j-不変量を計算します。次の式は係数を射影座標で表し
た曲線に対して定義されます。
256(A2 - 3C2)3C4(A2 - 4C2)

Montgomery 形式
位数 p の有限体上の演算について Montgomery 形式の
剰余を使用します。この形式は、(2768)2 mod p の乗
算と (2768)-1 の乗算 _MR をあわせて、有限体上の値
mm2768 mod 2p とするものです。乗算は余分な
2768 を除去するための _MR が必要です。公開鍵や共通
の値には、_MR_MOD を追加して mod p にします。
2768 mod p の乗算と _MR を組み合わせて 2768 を消
去し、Montgomery 形式から元に戻します。
_MO  2768 mod p
_M2  (2768)2 mod p

_MR:
0 以上 p2768 未満の入力に対して、0 以上 2p 未満の
値を出力します。入力は乗算部分 _MUL の出力と同じ型
であり、(2768)-1 を乗算して 2768 の数を調節する作
用を含みます。_MRM + (Mp' mod 2768)p2768 を実
行します。この式は、p の特性と後述の Comba 法によ
って、M + (M mod 216)(p + 1)216 を連結して実装で
きます。2768 に対する分子は必ず割り切れて、余りが
発生しません。定数 _P1p + 1 に対応します。下位
に長く連続する 0 を持ち、部分的に乗算を省略できます。
(3)(2)(1)(0) : A_ * [3][2][1] : _P1 --------------------- (0)[1] (0)[2] (1)[1] (0)[3] (1)[2] (2)[1] (1)[3] (2)[2] (3)[1] (2)[3] (3)[2] (3)[3] [7][6][5][4][3][2][1] [0] : A0d_ --------- --- (3)(2)(1) (0) : A_ ------------ [3][2][1][0] : A_
上図は、実装の配列要素のサイズを変更して記述してい
ます。M を更新して式を実行する動作は Comba 法で
実装します。A0d_ は入力、2768 以上の範囲で A_
出力に対応します。ループ中で A_ の参照されない要素
があり、初期化の省略や上書きが可能となります

_MOD:
0 以上 2p 未満の入力について mod p を求めます。
_MR によって十分に値が削減されるため、_MOD の実行
を省略できます。定数 _Pp に対応します

SIDH 実装の演算では、乗算で実行される _MR に剰余
計算をまとめています。剰余計算の省略は、入力や出力
の範囲を考慮する必要があり、p - 1 以上 2768 未満で
ビットが保持されるように構成します。_SUB の右辺は、
L_ + (F_ - R_)F_ によって 2p4p (定数 _P2
_P4) 未満とする上限があります。_ADDM_SUBM は、
2p による 1 ビットの値の削減を追加したもので、値の
範囲を調節します。

_NEG:
2p によって入力の符号を反転します。差の右辺に相当
します

_DSUB:
_MUL の出力型について Ad_ - A0d_ - A1d_ を計算
します。この演算結果が正である場合に利用可能で、値
の削減を行うことなく 0 以上 p2768 未満の値が出力さ
れます。_MSUB は、p2768 による値の削減を含む差の
計算を実行します

_DIV:
ビットシフトを用いて、入力を 2 で割った値を出力しま
す。入力が奇数の場合、p の加算を利用して偶数へ変換
します

有限体上の逆数を求める _INV は、p のビット表現を使
用した 2 乗と乗算の組み合わせで実装します。乗算は最
大 5 ビットの奇数を単位とするよう _PM に割り当てて、
入力の奇数乗を組み合わせます。2 乗の長さは、1 のビ
ットまで乗算を省略するように _PS へ割り当てます。p
のビット表現は次の通りです。
0000 6FE5 D541 F71C 0E12 909F 97BA DC66 8562 B504 5CB2 5748 084E 9867 D6EB E876 DA95 9B1A 13F7 CC76 E3EC 9685 49F8 78A8 EEAF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF
左上が上位、右下が下位となります。最初に p - 34 乗を
求めます。_PS_PM は、上図の下位 2 ビットを除く
部分から作成します。2 乗 2 回と 1 乗の乗算を追加し
p - 2 乗を求めます
関連項目:

ダウンロード

ライブラリ概要

更新履歴

X25519
[広告]



ライブラリへ戻ります

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