楕円曲線暗号のための数学2(バイナリ法によるスカラー倍算)
初めに
前回、楕円曲線暗号に必要な楕円曲線の点の加算を高速化するために射影座標を導入しました。
今回は楕円曲線の点の整数倍を計算する方法を紹介します。
スカラー倍算の定義
楕円曲線の点
楕円曲線の点の集合は加法群で、結合則が成り立つのでこの表記が使えます。
この操作をスカラー倍算と呼びます。
ECDH鍵共有や楕円ElGamal暗号などで必須の演算です。
バイナリ法
以降、プログラムの中では楕円曲線の点のクラスを Ec, 点
単に
def mul(P : Ec, n : int):
Q = Ec()
for i in range(n):
Q = add(Q, P)
return Q
とすれば一応求まります。しかし、このやり方は
そこで、スカラー倍算を高速に計算する方法がいろいろ提案されています。まず一番基本的なバイナリ法を紹介します。
ここで
そのとき 出力変数
右から左へのバイナリ法
def mul1(P : Ec, n : int):
bs = bin(n)[2:] # n を2進数展開して最初の `0b` を取り除いた文字列
Q = Ec() # zero
T = P
for b in reversed(bs): # 下位ビットから順次計算
if b == '1':
Q = add(Q, T)
T = dbl(T)
return Q
このやり方は計算途中で
逆に、
左から右へのバイナリ法
def mul2(P : Ec, n : int):
bs = bin(n)[2:]
Q = Ec() # zero
for b in bs: # 上位ビットから順次計算
Q = dbl(Q)
if b == '1':
Q = add(Q, P)
return Q
バイナリ法の計算コスト
バイナリ法の演算コストを評価しましょう。add, dbl演算のコストをそれぞれ
addlは
すると平均的に
これはどちらのバイナリ法でも同じですね。
Discussion