跳转到内容

密码学/素数曲线/楚德诺夫斯基坐标

来自维基教科书,开放的书籍,开放的世界

<密码学

楚德诺夫斯基坐标 用于表示素数曲线 y^2 = x^3 + ax + b 上的椭圆曲线点。当域求逆的成本明显高于域乘法时,它们比仿射坐标 提供了速度优势。在楚德诺夫斯基坐标 中,五元组 (X, Y, Z, Z^2, Z^3) 代表仿射点 (X / Z^2, Y / Z^3)。

点加倍 (5M + 6S 或 5M + 4S)

[编辑 | 编辑源代码]

设 (X, Y, Z, Z^2, Z^3) 为用楚德诺夫斯基坐标 表示的一个点 (不等于无穷远点)。那么它的两倍 (X', Y', Z', Z'^2, Z'^3) 可以通过以下方式计算

if (Y == 0)
  return POINT_AT_INFINITY
S = 4*X*Y^2
M = 3*X^2 + a*(Z^2)^2
X' = M^2 - 2*S
Y' = M*(S - X') - 8*Y^4
Z' = 2*Y*Z
Z'^2 = Z'^2
Z'^3 = Z'^2 * Z'
return (X', Y', Z', Z'^2, Z'^3)

注意:如果 a = -3,那么 M 也可以计算为 M = 3*(X + Z^2)*(X - Z^2),从而节省了 2 个域平方运算。

点加 (11M + 3S)

[编辑 | 编辑源代码]

设 (X1, Y1, Z1, Z1^2, Z1^3) 和 (X2, Y2, Z2, Z2^2, Z2^3) 为两个用楚德诺夫斯基坐标 表示的点 (都不等于无穷远点)。那么它们的和 (X3, Y3, Z3, Z3^2, Z3^3) 可以通过以下方式计算

U1 = X1*Z2^2
U2 = X2*Z1^2
S1 = Y1*Z2^3
S2 = Y2*Z1^3
if (U1 == U2)
  if (S1 != S2)
    return POINT_AT_INFINITY
  else 
    return POINT_DOUBLE(X1, Y1, Z1, Z1^2, Z1^3)
H = U2 - U1
R = S2 - S1
X3 = R^2 - H^3 - 2*U1*H^2
Y3 = R*(U1*H^2 - X3) - S1*H^3
Z3 = H*Z1*Z2
Z3^2 = Z3^2
Z3^3 = Z3^2 * Z3
return (X3, Y3, Z3)

混合加法 (带仿射点) (8M + 3S)

[编辑 | 编辑源代码]

设 (X1, Y1, Z1, Z1^2, Z1^3) 为用楚德诺夫斯基坐标 表示的一个点,(X2, Y2) 为仿射坐标 中的一个点 (都不等于无穷远点)。通过将“Z2”的所有出现都替换为“1”(从而减少三个域乘法),可以很容易地从常规的楚德诺夫斯基点加法推导出添加这些点的公式。

混合加法 (带雅可比点) (11M + 3S)

[编辑 | 编辑源代码]

有关更多详细信息,请参阅 雅可比坐标

华夏公益教科书