我正在编写一个椭圆曲线密码学的小项目,当我使用仿射坐标系时程序运行良好,这意味着每个点由 2 个坐标(x',y')表示。
现在我试图用雅可比坐标系替换仿射坐标系,其中每个点由 3 个坐标 (x,y,z) 表示,x' = x/z² 和 y' = y/z³。
我想知道如何将仿射坐标转换为雅可比坐标**。在某些教程中,人们使用公式:(x,y) = (x,y,1),这意味着 z 坐标始终设置为 1。但我不确定它是否正确。
然后对于椭圆曲线上的点加法,计算 P(x1,y1,z1) + Q(x2,y2,z2) = R(x3,y3,z3)。我在我的程序中使用了以下公式:
u1 = x1.z2²
u2 = x2.z1²
s1 = y1.z2³
s2 = y2.z1³
h = u2 - u1
r = s2 - s1
x3 = r² - h³ - 2.u1.h²
Y3 = r. (U1.h² - x3) - s1.h³
z3 = z1.z2.h
但是当我测试我的程序时,我得到了一些负坐标,例如(-2854978200,-5344897546224,578)。当我尝试使用公式 (x'=x/z²,y'=y/z³) 将结果转换回仿射坐标系时,我得到 (-8545, -27679),实际上 x 坐标是 -8545.689。 ... jacobian x 坐标不能被 z² 整除。
如果坐标不是整数怎么办?如果他们是消极的?我尝试使用曲线的字段大小进行 MOD,但结果也不正确。
所以使用雅可比坐标的点(x,y,1)
是正确的,但不是唯一的。所有满足的点(a^2.x,a^3.y,a)
都是等价的。在我的程序中,曲线是在素数字段中定义的,所以当我计算时,u1, u2, s1, s2 ...
我应该将 MOD p 应用于每个变量?
而对于将最终结果转换回仿射坐标,例如 x 坐标,实际上它不是除法,而是模逆?例如,我的曲线是在有限素数域中定义的p=11
,并且我有一个使用雅可比坐标的点(15,3,2)
,要将雅可比 x 坐标转换为仿射 x 坐标,我必须计算2^2 = 4 => x = 4^-1 mod p => x = 3
和15.3 mod p = 1
,所以仿射 x 坐标为 1,对吗?
雅可比坐标的目的是避免加法过程中的分裂。但正如 Thomas Pornin 所说,当我们计算 时P1 + P2 = P3
,有一些特殊情况需要处理。
- P1 和 P2 都是无限的:
P3=infinite
. - P1 是无限的:
P3=P2
. - P2 是无限的:
P3=P1
. - P1 和 P2 具有相同的 x 坐标,但不同的 y 坐标或两个 y 坐标都等于 0:
P3=infinite
。 - P1 和 P2 有不同的 x 坐标:
Addition formula
。 - P1 和 P2 具有相同的坐标:
Doubling formula
。
这是我的 C 函数的原型:
jac_addition(jacobian *, point *, jacobian *);
jac_doubling(jacobian *, jacobian *);
point
是表示在仿射坐标系中定义的点的结构,jacobian
对于雅可比系统。
问题是当我处理那些特殊情况时,尤其是第四个,我仍然将两个点都转换回仿射坐标,或者我无法比较它们的坐标,这意味着我仍然需要计算除法。