楕円曲線暗号のための数学7(マルチスカラー倍算概要)
初めに
ここでは楕円曲線の複数の点のスカラー倍算の和を高速に求める方法を紹介します。
この処理はゼロ知識証明zkSNARKなどで頻繁に利用されます。
記号の準備
マルチスカラー倍算、英語ではmsm (multi-scalar multiplication) と呼ばれることが多いのですが、それぞれの点
既存手法の問題点
GLV法の中で紹介したマルチスカラー倍算は
単独のスカラー倍算では、出力の dbl
を繰り返しながら、ビットが立っているときだけ加算add
しました。
dbl
操作をまとめることで効率化しました。
この方法は dbl
の操作(1回だけ)に比べてadd
の比率が大きくなる(
逆に、add
に必要なルックアップテーブルは
x_i が小さく n が大きいときの考察
2ビットしかない場合、
と表現できます。コードとしては
T = [0]*n
for i in range(n):
if x[i]:
T[x[i]] += P[i]
とすれば、
Q=T[0] + 2T[1] + ... m T[m-1] の計算方法
ここでも、T[i] をそれぞれ
たとえば
より一般的には後ろからの部分和
図で表すと、
Pythonで記述すると次のようになります。
def f(T):
Q = 0
R = 0
for i in range(m-1,-1,-1):
R += T[i]
Q += R
return Q
ループの中身を追いかけると、
i | R | Q |
---|---|---|
m-1 | T[m-1] | T[m-1] |
m-2 | T[m-1] + T[m-2] | 2T[m-1]+T[m-2] |
m-3 | T[m-1] + T[m-2] + T[m-3] | 3T[m-1] + 2T[m-2] + T[m-3] |
... | ... | ... |
0 | T[m-1] + ... + T[0] | mT[m-1] + ... + T[0] |
と欲しい結果が得られています。
全体のアルゴリズム
今までの考察をまとめると次の方法で計算します。
入力 : 楕円曲線の点
出力 :
-
GLV法の自己準同型写像を用いて
のビット数を半分にしてx_i を2倍にする。n - 改めてそれらを
,P_1, \dots, P_n とする。x_1, \dots, x_n とする。Q=0 -
をx_i ビットずつ区切り、上位部分を切り出して、今回紹介した方法で和を求める。w - ステップ3で求めた和を
回w dbl
してから に加算する。Q
ステップ3, 4を
より詳細なパラメータの決め方については次回考察します。
Discussion