楕円曲線暗号のための数学4(ウィンドウ法)
初めに
楕円曲線暗号のための数学2(バイナリ法によるスカラー倍算)では楕円曲線の点のスカラー倍算をバイナリ法を用いた方法を紹介しました。今回はより高速に計算できるウィンドウ法を紹介します。
記号の復習
楕円曲線の点からなる素数位数
点
バイナリ法の復習
def mul(P : Ec, n : int):
bs = bin(n)[2:] # nを2進数展開
Q = Ec() # zero
for b in bs: # 上位ビットから順次計算
Q = dbl(Q)
if b == '1':
Q = add(Q, P)
return Q
ウィンドウ法
ウィンドウ法は
たとえば
ウィンドウ法
def mulWin(P : Ec, n : int, w : int):
l = n.bit_length()
mask = (1<<w) - 1
Q = Ec() # zero
T = [Q]
# T = [0, P, 2 P, 3 P, ..., (2^w-1) P]
for i in range(1, 2**w):
T.append(add(T[i-1], P))
for i in reversed(range(0, l, w)):
for i in range(w):
Q = dbl(Q)
t = (l >> w) & mask
Q = add(Q, T[t])
return Q
ウィンドウ法は
したがって、全体では
そこで、
コストが最小となる
l | 128 | 256 | 384 |
---|---|---|---|
w | 4 | 4 | 5 |
ウィンドウ法 | 47 | 79 | 108 |
バイナリ法 | 64 | 128 | 192 |
テーブル作成コストの半減
前節のように
ループ内の操作を再確認しましょう。
for i in range(w):
Q = dbl(Q)
t = (l >> w) & mask
Q = add(Q, T[t])
もし
と変形できます。「
このように dbl の操作と add の操作の順序を交換することで
この変換をしてもループ内の dbl と add の回数は変わりません。ただ、テーブルのインデックスが奇数のみでよくなったので、テーブル作成のコストが
演算コスト :
奇数インデックスのみのテーブル作成
T = [P]
P2 = dbl(P)
# T = [P, 3 P, 5 P, ..., (2^w-1) P]
for i in range(1, 2**(w-1)):
T.append(add(T[i-1], P2))
コストが最小となる
ウィンドウ法の括弧内は最小となる
l | 128 | 256 | 384 |
---|---|---|---|
バイナリ法 | 64 | 128 | 192 |
ウィンドウ法 | 47 (4) | 79 (4) | 108 (5) |
修正ウィンドウ法 | 39 (4) | 67 (5) | 92 (5) |
バイナリ法に比べて
Discussion