https://aaron67.cc/2020/09/26/ec-point-operation/
对定义在有限域上的椭圆曲线
E
=
(
p
,
a
,
b
,
G
,
n
,
h
)
E = (p, a, b, G, n, h)
E
=
(
p
,
a
,
b
,
G
,
n
,
h
)
y
2
≡
x
3
+
a
x
+
b
(
m
o
d
p
)
y^2 \equiv x^3 + ax + b \pmod{p}
y
2
≡
x
3
+
a
x
+
b
(
m
o
d
p
)
本文将通过代码计算下面两个问题:
已知曲线上的点
P
=
(
x
P
,
y
P
)
P = (x_P, y_P)
P
=
(
x
P
,
y
P
)
和
Q
=
(
x
Q
,
y
Q
)
Q = (x_Q, y_Q)
Q
=
(
x
Q
,
y
Q
)
,求点
R
=
P
+
Q
R = P + Q
R
=
P
+
Q
已知整数
k
k
k
,求点
K
=
k
⋅
G
K = k \cdot G
K
=
k
⋅
G
比特币使用的椭圆曲线由
Secp256k1
标准定义,我们可以事先声明好这些参数,并实现一些基础方法。
import collections
EllipticCurve = collections.namedtuple('EllipticCurve', 'name p a b g n h')
curve = EllipticCurve(
name='Secp256k1',
p=0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f,
a=0,
b=7,
g=(0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798, 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8),
n=0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141,
h=1,
)
def on_curve(point):
"""Returns True if the given point lies on the elliptic curve."""
if point is None:
# None represents the point at inf