Elliptic Curve 的一点小总结

定义

在数学上,椭圆曲线(Elliptic curve,缩写为EC)为一平面代数曲线,由如下形式的方程定义

\[y^2=x^3 + ax + b \]

其中\(a\)\(b\)为实数。这类方程被称为short Weierstrass (韦尔斯特拉斯)方程。椭圆曲线的定义也要求曲线是非奇异的。几何上来说,这意味着图像里面没有尖点、自相交或孤立点。代数上来说,这成立当且仅当判别式

\[\Delta=-16(4a^3+27b^2) \]

不等于0。
有short Weierstrass自然也有long Weierstrass方程

\[y^2+a_1xy+a_3y=x^3+a_2x^2+a_4x+a_6 \]

(至于为什么没有\(a_5\)我也不知道,看过的资料里都是没有\(a_5\)的)
long Weierstrass形式可以转化为short Weierstrass形式。
\(y\longrightarrow y-\frac{(a_1x+a_3)}{2}\),化简后

\[y^2=x^3+Ax^2+Bx+C \]

再令\(x\longrightarrow x-\frac{A}{3}\)

\[y^2=x^3+ax+b \]

实数域

椭圆曲线的加法

由椭圆曲线的加法定义:两个点的连线交曲线的第三点并取与x轴的对称点。
如计算\(P=(X_p, Y_p)\)\(Q=(X_Q, Y_Q)\)的和\(R=(X_R, Y_R)\)

\[\lambda=\frac{Y_Q-Y_P}{X_Q-X_P} \]

\[X_R=\lambda^2-X_P-X_Q \]

\[Y_R=\lambda(X_P-X_R)-Y_P \]

\[Y_R=\lambda(X_Q-X_R)-Y_Q \]

\(P=Q\)的时候,\(P,Q\)的连线变成椭圆曲线的切线。此时对曲线方程的两边取微分,并且知道切线的斜率等于y的微分比x的微分

\[2yd_y=3x^2d_x+ad_x \]

整理后得

\[\lambda=\frac{d_y}{d_x}=\frac{3x^2+a}{2y} \]

计算\(X_R,Y_R\)的公式与上面相同。

有限域

实际上在定义在有限域上的椭圆曲线的加法也可以用实数域的公式,只不过除法变成求逆元

\[\lambda=(Y_Q-Y_P)(X_Q-X_P)^{-1} \pmod{p} \]

\(P=Q\)

\[\lambda=(3x^2+a)(2y)^{-1} \pmod{p} \]

但是计算乘法逆元总是复杂的(即使用拓展欧几里德算法)。所以介绍下射影平面坐标。

射影坐标

以上所讲的Weierstrass方程是仿射平面下的形式。仿射坐标到射影坐标的转换就是

\[(X, Y) \longrightarrow (X,Y,Z) \]

从射影坐标到仿射坐标的转换

\[(X,Y,Z)(X, Y) \longrightarrow (X,Y,Z)(\frac{X}{Z},\frac{Y}{Z}) \]

于是得到椭圆曲线射影坐标的形式

\[Y^2Z=X^3+aXZ^2+bZ^3 \]

无穷远点在数学上也是由射影平面来的。用坐标来表达就是\(Z=0\)的点。对于上面的方程来说就是\((0:Y:0)\)。一般来说会使用点\((0:1:0)\)来表示无穷远点。比如sagemath。

雅可比坐标

从仿射坐标到雅可比坐标

\[(x, y)\longrightarrow(X:Y:Z) \]

从雅可比坐标到仿射坐标

\[(X:Y:Z)\longrightarrow(X/Z^2,Y/Z^3) \]

由此可见\((\lambda^2X:\lambda^3Y:\lambda Z)\)对于非零的\(\lambda\)表示的是同一个点。

雅可比坐标的加法

这里就不用公式了,直接用sagemath吧

sage: from Crypto.Util.number import getPrime
sage: p = getPrime(128)
sage: p
301106202796104772606281479390414064437
sage: E = EllipticCurve(GF(p), [0, 7])
sage: E
Elliptic Curve defined by y^2 = x^3 + 7 over Finite Field of size 301106202796104772606281479390414064437
sage: P = E.lift_x(1234)
sage: P
(1234 : 151759733218367662729854605113112589945 : 1)
sage: Q = E.lift_x(4321)
sage: Q
(4321 : 20096162093032149077296625270192771385 : 1)
sage: P+Q
(297720150792495705916131422544224381584 : 267287806774622770961153728731746702305 : 1)
sage: X1, Y1, Z1 = P
sage: X2, Y2, Z2 = Q
sage: I1 = Z1^2; I2=Z2^2
sage: J1=I1*Z1
sage: J2=I2*Z2
sage: U1=X1*I2
sage: U2=X2*I1
sage: H=U1-U2
sage: F=4*H^2
sage: K1=Y1*J2; K2=Y2*J1
sage: R=2*(K1-K2)
sage: G = F*H
sage: V = U1*F
sage: X3 = R^2 + G -2*V; Y3=R*(V-X3)-2*K1*G; Z3=((Z1+Z2)^2-I1-I2)*H
sage: (X3, Y3, Z3)
(214535640891103999239269350061448120807,
 240487449847258905205618475831905609624,
 301106202796104772606281479390414058263)
sage: X3 *= inverse_mod(Z3, p)^2
sage: Y3*= inverse_mod(Z3, p)^3
sage: X3, Y3
(297720150792495705916131422544224381584,
 267287806774622770961153728731746702305)

雅可比坐标的倍点

同样直接用sagemath来表示,曲线的参数和P点与上面相同。

sage: N = Z1^2
sage: E = Y1^2
sage: B = X1^2
sage: L = E^2
sage: S = 2*((X1 + E)^2 - B - L)
sage: M=  3*B + 0*N^2
sage: X2 = M^2 - 2*S
sage: Y2 = M*(S-X2) - 8*L
sage: Z2 = (Y1+Z1)^2-E-N
sage: (X2, Y2, Z2)
(2318785766432, 3530945306848783384, 2413263640630552853427730835811115453)
sage: X2 *= inverse_mod(Z2, p)^2
sage: Y2 *= inverse_mod(Z2, p)^3
sage: Z2 *= inverse_mod(Z2, p)
sage: (X2, Y2, Z2)
(211487819687729717989558216870258642315,
 181567709617916269765770514916557993658,
 1)
sage: 2*P
(211487819687729717989558216870258642315 : 181567709617916269765770514916557993658 : 1)

解释一下这句M = 3*B + 0*N^2,原先的公式是

\[M=3B+aN^2 \]

\(a\)就是曲线的参数a,上面的曲线为

\[y^2=x^3+7 \quad(a=0,b=7) \]

更多的细节可以看论文

Twisted Edwards curve

定义

twisted Edwards curve也是定义在仿射平面上,形如

\[ax^2+y^2=1+dx^2y^2 \]

twisted Edwards curve上的加法

\[\left(x_{1}, y_{1}\right)+\left(x_{2}, y_{2}\right)=\left(\frac{x_{1} y_{2}+y_{1} x_{2}}{1+d x_{1} x_{2} y_{1} y_{2}}, \frac{y_{1} y_{2}-a x_{1} x_{2}}{1-d x_{1} x_{2} y_{1} y_{2}}\right) \]

twisted Edwards curve上的倍点

\[2(x_1,y_1)=\left(\frac{2x_{1}y_{1}}{ax_{1}^2+y_{1}^{2}}, \frac{y_{1}^2- a x_{1}^{2}}{2-a x_{1}^2- y_{1}^2}\right) \]

射影坐标

与Weierstrass curve一样

\[(X:Y:Z)\longrightarrow \left(\frac{X}{Z},\frac{Y}{Z}\right) \]

于是得到射影平面的形式

\[(aX^2+Y^2)Z^2=Z^4+dX^2Y^2 \]

加法

计算\((X_1:Y_1:Z_1)+(X_2:Y_2:Z_2)=(X_3:Y_3:Z_3)\)

\[\begin{array}{l} A=Z_{1} \cdot Z_{2} \\ B=A^{2} \\ C=X_{1} \cdot X_{2} \\ D=Y_{1} \cdot Y_{2} \\ E=d C \cdot D \\ F=B-E \\ G=B+E \\ X_{3}=A \cdot F\left(\left(X_{1}+Y_{1}\right) \cdot\left(X_{2}+Y_{2}\right)-C-D\right) \\ Y_{3}=A \cdot G \cdot(D-a C) \\ Z_{3}=F \cdot G \end{array} \]

倍点

计算\((X_3:Y_3:Z_3)=2(X_1:Y_1:Z_1)\)

\[\begin{array}{l} B=\left(X_{1}+Y_{1}\right)^{2} \\ C=X_{1}{ }^{2} \\ D=Y_{1}{ }^{2} \\ E=a C \\ F=E+D \\ H=Z_{1}{ }^{2} \\ J=F-2 H \\ X_{3}=(B-C-D) \cdot J \\ Y_{3}=F \cdot(E-D) \\ Z_{3}=F \cdot J \end{array} \]

Montgomery Curves and Twisted Edwards Curves

扭曲爱德华曲线在域\(\displaystyle{K}\)上双有理等价于蒙哥马利曲线,证明可以看论文。这里只是把论文中用sagemath的部分重新贴一下。

sage: R.<a,d,x,y>=QQ[]
sage: A=2*(a+d)/(a-d)
sage: B=4/(a-d)
sage: S=R.quotient(a*x^2+y^2-(1+d*x^2*y^2))
sage: u=(1+y)/(1-y)
sage: v=(1+y)/((1-y)*x)
sage: 0==S((B*v^2-u^3-A*u^2-u).numerator())
True

所以可以把扭曲爱德华曲线和蒙哥马利曲线进行互相转化。转化的过程可以看wiki

截图 2022-12-15 22-17-11.png

同时蒙哥马利曲线又可以与维尔斯特拉斯方程进行互相转化。

截图 2022-12-15 22-18-06.png

写了一个小demo:

from sage.all import *

def twisted_to_Montgomery(x, y, a, d, p):
    """The map for twisted Edwards curves point to Montgomery curves point
    x, y: twisted Edwards curves point
    a, d: twisted Edwards curves sach that a*x^2 + y^2 = 1 + d*x^2*y^2 
    P: The field K(p)
    Return: mapped point (u, v) and the Montgomery curves parmteres (A, B)
    """
    A = 2*(a + d) * inverse_mod(a-d, p) % p
    B = 4 * inverse_mod(a-d, p)

    u = (1+y) * inverse_mod((1-y), p) % p
    v =  u * inverse_mod(x, p)

    assert B*v**2 % p == (u**3 + A*u**2 + u) % p; "Error"

    return u, v, A, B

def Montgomery_to_Weierstrass(x, y, A, B, p):
    """The map from Montgomery curves point to Weierstrass curves point
    x, y: Montgomery curves point
    A, B: Montgomery curves sach that B*v^2 = u^3 + A*u^2 + u
    P: The field K(p)
    """
    a = (3 - A**2) * inverse_mod(3*B**2, p) % p
    b = (2*A**3 - 9*A) * inverse_mod(27*B**3, p) % p

    t = (3*x + A) * inverse_mod(3*B, p) % p
    v = y * inverse_mod(B, p) % p

    assert v**2 % p == (t**3 + a*t + b) % p; "Error"

    return t, v, a, b

def twisted_to_Weierstrass(x, y, a, d, p):
    """The map for twisted Edwards curves point to Weierstrass curves point
    x, y: twisted Edwards curves point
    a, d: twisted Edwards curves sach that a*x^2 + y^2 = 1 + d*x^2*y^2
    P: The field K(p)
    Return: mapped point (t, v) and the Weierstrass curves parmteres (a, b)
    """
	u, v, A, B = twisted_to_Montgomery(x, y, a, d, p)
    return Montgomery_to_Weierstrass(u, v, A, B, p)

ECDLP

定义

椭圆曲线密码学(ECC)依赖于椭圆曲线离散对数问题(ECDLP)的困难。对于两个点\(P,Q\),有

\[Q=l*P \]

计算\(l\),这个问题称为ECDLP。或者记作\(log_PQ\)。ECDLP本身是十分困难的,但是椭圆曲线参数的选择会降低ECDLP的困难度。下面介绍两个Weak Elliptic Curve。

Pohlig-Hellman Attack

假设我们现在有一个曲线\(E(p): y^2=x^3+ax+b\),以及曲线上的两个点\(P,Q\)且满足\(Q=k*P\)。点\(P\)的阶为\(n=\#<P>\)。Pohlig-Hellman Attack的主要思想是把原先在阶为\(n\)下的ECDLP转化为若干个在\(P\)的子群下的ECDLP,最后用中国剩余定理恢复在模\(n\)下的\(k\)。这种算法在\(n\)是光滑数是尤其有效。

Sage中的discrete_log方法使用的就是Pohilg-Hellman Attack算法。

sage: m = 21345332
sage: p = 4516284508517
sage: E = EllipticCurve(GF(p), [7,1])
sage: Q = E.gens()[0]
sage: mQ = m*Q
sage: print(E.order().factor())
11 * 13 * 31582419389
sage: time mRec = discrete_log(mQ, Q, operation='+'); mRec
CPU times: user 5.13 s, sys: 23.6 ms, total: 5.16 s
Wall time: 5.16 s
21345332

Smart's Attack

Smart's Attack 适用于\(\#F(p)=p\)的曲线。
脚本可以参考这个smart's attack

more see

奇异椭圆曲线

待补充

posted @ 2023-02-12 17:22  tr0uble  阅读(296)  评论(0编辑  收藏  举报