所有椭圆曲线都可以写成 Weierstrass 形式
y² = x³ + ax + b
除少数例外[1]。
蒙哥马利椭圆曲线的形式为
由y² = x³ + A x² + x
扭曲的 Edwards 曲线具有如下形式
a x² + y² = 1 + d x² y²
每条蒙哥马利曲线都有一个扭曲的爱德华兹形式,反之亦然,但并非所有曲线都有蒙哥马利或扭曲的爱德华兹形式。
转换系数
下面是用于在各种形式之间转换系数的 Python 代码。请参阅[2]。
def Montgomery_to_Twisted_Edwards(B,A,p): # By^2 = x^3 + Ax^2 + x a = ((A + 2)*pow(B, -1, p)) % p d = ((A - 2)*pow(B, -1, p)) % p 返回 a, d def Twisted_Edwards_to_Montgomery(a,d,p): # ax^2 + y^2 = 1 + dx^2 y^2 x = pow(a - d, -1, p) B = (4*x) % p A = (2*(a + d)*x) % p 返回 B、A def Montgomery_to_Weierstrass(B,A,p): # By^2 = x^3 + Ax^2 + x a = (B**2 * (1 - A**2*pow(3, -1, p))) % p b = (B**3 * (2*A**3 - 9*A) * pow(27, -1, p)) % p 返回 a, b
微小的 Jubjub 曲线
下面的代码证实了上一篇文章中给出的Tiny Jubjub 曲线(TJJ)的形式是一致的。
# Twisted Edwards 定义 a、d、p = 3、8、13 B,A = Twisted_Edwards_to_Montgomery(a,d,p) 断言(B == 7) 断言(A == 6) wa,b = Montgomery_to_Weierstrass(B,A) 断言(wa == 8) 断言(b == 8)
宝贝朱布朱布
我查阅了 Baby Jubjub 曲线,发现了一些不相容的定义。大家都同意这个域是整数模素数
p = 21888242871839275222246405745257275088548364400416034343698204186575808495617
蒙哥马利曲线的形式是
y² = x³ + 168698x² + x
但这些来源在曲线的扭曲 Edwards 形式上有所不同。上面的代码显示,正确的扭曲 Edwards 形式是 [2] 中给出的:
168700 x ² + y ² = 1 + 168696 x ² y ²
现在,对于给定的蒙哥马利形式,可以找到多个爱德华兹形式,因此替代形式不一定是错误的。但是,当我将两者都转换为魏尔斯特拉斯形式并计算j不变量时,结果不同,因此曲线不等价。
相关文章
[1] 只要底层域不具有特征 2 或 3,所有椭圆曲线都可以写成魏尔斯特拉斯形式。密码学主要对特征是巨大素数(而不是 2 或 3)的域感兴趣。
[2] Marta Bellés-Muñoz、Barry Whitehat、Jordi Baylina、Vanesa Daza 和 Jose Luis Muñoz-Tapia。零知识电路的扭曲爱德华兹椭圆曲线。数学,9(23),2021。
魏尔斯特拉斯、蒙哥马利和爱德华兹的椭圆曲线形式首先出现在约翰·D·库克 (John D. Cook)的文章中。
原文: https://www.johndcook.com/blog/2025/08/13/weierstrass-montgomery-edwards/