Add sage script for generating parameters
このコミットが含まれているのは:
コミット
fee32327c1
@ -1,7 +1,7 @@
|
||||
# Supersingular Isogeny Key Encapsulation
|
||||
|
||||
Repository keeps simple Go's implementation of
|
||||
SIKE based on field p503 (Round2).
|
||||
SIKE based on field p434 and p503 (Round2).
|
||||
|
||||
## Speed
|
||||
|
||||
|
66
tools/sidh.sage
ノーマルファイル
66
tools/sidh.sage
ノーマルファイル
@ -0,0 +1,66 @@
|
||||
# P434
|
||||
e2 = 0xD8
|
||||
e3 = 0x89
|
||||
# P503
|
||||
# e2=0xFA
|
||||
# e3=0x9F
|
||||
#e2=0x174
|
||||
#e3=0xEF
|
||||
|
||||
Nsk2_max_val = (2^e2) - 1
|
||||
Nsk2_bytes = floor(e2/8)
|
||||
Nsk3_S = ceil(RDF(log(3^e3,2)))
|
||||
Nsk3_bytes = floor(Nsk3_S/8)
|
||||
Nsk3_max_val = (2^Nsk3_S) - 1
|
||||
|
||||
p = 2^e2 * 3^e3 - 1
|
||||
Fp = GF(p)
|
||||
R.<x> = Fp[]
|
||||
Fp2 = Fp.extension(x^2 + 1, 'i')
|
||||
i = Fp2.gen()
|
||||
E0Fp = EllipticCurve(Fp, [0,6,0,1,0])
|
||||
E0Fp2 = EllipticCurve(Fp2, [0,6,0,1,0])
|
||||
|
||||
# Montgomery R
|
||||
# 448 = 7*(8*8)
|
||||
R = 2^448
|
||||
# P503
|
||||
# R = 2^512
|
||||
|
||||
def calc_Y_in_Fp2(x, xi):
|
||||
fp2X= Fp2(x+xi*i)
|
||||
fp2Y2 = Fp2(fp2X^3 + fp2X)
|
||||
ret = fp2Y2.sqrt()
|
||||
return ret
|
||||
|
||||
def calc_proj_point_A(fp2X, fp2Y): return (3^e3 * E0Fp2((fp2X, fp2Y)))
|
||||
def calc_proj_point_B(fp2X, fp2Y): return (2^e2 * E0Fp2(fp2X, fp2Y))
|
||||
|
||||
def tau(P): return E0Fp2(-P.xy()[0], i*P.xy()[1])
|
||||
def hd(val):
|
||||
return ", 0x".join([x.hex().upper() for x in Integer(val).digits(base=2^64)])
|
||||
def hcp(point):
|
||||
print("X: "); hd(point[0])
|
||||
print("Y: "); hd(point[1])
|
||||
print("Z: "); hd(point[2])
|
||||
def print_fp2_hex(Fp2_el):
|
||||
fp2_pol = Fp2_el.polynomial()
|
||||
print("A: FpElement{0x" + hd(fp2_pol[1]) + "},")
|
||||
print("B: FpElement{0x" + hd(fp2_pol[0]) + "}}")
|
||||
|
||||
def print_fp2_in_mont_hex(Fp2_el, text):
|
||||
print(text)
|
||||
mul = Integer(R)*Fp2_el
|
||||
fp2_pol = mul.polynomial()
|
||||
print("A: FpElement{0x" + hd(fp2_pol[0]) + "},")
|
||||
print("B: FpElement{0x" + hd(fp2_pol[1]) + "}}")
|
||||
|
||||
Integer(2^4 - 1).digits(2)
|
||||
|
||||
print("\n P =\n"+hd(p))
|
||||
print("\n pX2 =\n"+hd(2*p))
|
||||
print("\n p+1 =\n"+hd(p+1))
|
||||
print("\n R^2 mod p =\n"+hd((R^2) % p))
|
||||
print("\n1/2 * R mod p =\n"+hd(((1/2)*R) % p))
|
||||
print("\n R mod p =\n"+hd(R % p))
|
||||
print("\n 6 * R mod p =\n"+hd(((6*R) % p)))
|
読み込み中…
新しいイシューから参照
ユーザーをブロックする