密码学/素数曲线/雅可比坐标
<密码学
雅可比坐标用于表示素数曲线上的椭圆曲线点 当域反演的成本明显高于域乘法时,与仿射坐标相比,雅可比坐标可以提高速度。在雅可比坐标中,三元组 表示仿射点 .
令 (X, Y, Z) 是一个点 (不等于无穷远点),以雅可比坐标表示。那么它的倍点 (X', Y', Z') 可以通过以下方式计算
if (Y == 0) return POINT_AT_INFINITY S = 4*X*Y^2 M = 3*X^2 + a*Z^4 X' = M^2 - 2*S Y' = M*(S - X') - 8*Y^4 Z' = 2*Y*Z return (X', Y', Z')
注意:如果 a = -3,那么 M 也可以计算为 M = 3*(X + Z^2)*(X - Z^2),节省了 2 次域平方运算。
令 P=(X, Y, Z) 是一个点 (不等于无穷远点),以雅可比坐标表示。那么,在 a = -3 的情况下,它的 "m 倍点" (2^m)P 可以通过以下方式计算
Y = 2*Y W = Z^4 while(m--) if (Y == 0) return POINT_AT_INFINITY A = 3*(X^2 - W) B = X*Y^2 X = A^2 - 2B Z = Z*Y if (m) W = W*Y^4 Y = 2*A*(B - X) - Y^4 Y = Y/2 return (X, Y, Z)
可以从 修改后的雅可比坐标 倍点运算中推导出一个备用重复倍点运算,其成本为 (4m)M + (4m+2)S,适用于任何 a 值。对于较小的 a 值(例如 0 或 -3),成本将降低到 (4m-1)M + (4m+2)S,与上面显示的算法相比具有竞争力。
令 (X1, Y1, Z1) 和 (X2, Y2, Z2) 是两个点 (都不等于无穷远点),以雅可比坐标表示。那么它们的和 (X3, Y3, Z3) 可以通过以下方式计算
U = X1*Z2^2 H = X2*Z1^2 - U S = Y1*Z2^3 R = Y2*Z1^3 - S if (H == 0) if (R == 0) return POINT_DOUBLE(X1, Y1, Z1) else return POINT_AT_INFINITY X3 = R^2 - H^3 - 2*U*H^2 Y3 = R*(U*H^2 - X3) - S*H^3 Z3 = H*Z1*Z2 return (X3, Y3, Z3)
U1 = Y2 * Z1 U2 = Y1 * Z2 V1 = X2 * Z1 V2 = X1 * Z2 if (V1 == V2) if (U1 == U2) return POINT_DOUBLE(X1, Y1, Z1) else return POINT_AT_INFINITY U = U1 - U2 V = V1 - V2 W = Z1 * Z2 A = U ^ 2 * W - V ^ 3 - 2 * V ^ 2 * V2 X3 = V * A Y3 = U * (V ^ 2 * V2 - A) - V ^ 3 * U2 Z3 = V ^ 3 * W return (X3, Y3, Z3)
令 (X1, Y1, Z1) 是一个点,以雅可比坐标表示,而 (X2, Y2) 是一个点,以仿射坐标表示 (都不等于无穷远点)。可以从常规的雅可比点加法中轻松推导出一个公式来添加这些点,方法是将每个 "Z2" 替换为 "1"(从而减少四个域乘法和一个域平方运算)。
令 (X1, Y1, Z1) 是一个点,以雅可比坐标表示,而 (X2, Y2, Z2, Z2^2, Z2^3) 是一个点,以楚德诺夫斯基坐标表示 (都不等于无穷远点)。那么可以使用上面给出的加法公式轻松计算它们的和 (X3, Y3, Z3) (节省一个域乘法和一个域平方运算)。