You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

椭圆曲线点标量除法算法实现错误求助

椭圆曲线点的标量Z除法算法修正

你当前的代码实现的是点加倍(Point Doubling),也就是计算2Q,而不是点除以2(寻找点P使得2P=Q),这是核心错误。

核心原理回顾

椭圆曲线上的点"除以Z",本质是找到点P满足Z*P = Q,等价于计算P = Q * k,其中k是Z在曲线阶n下的乘法逆元(即k ≡ Z⁻¹ mod n)。这里的标量乘法是椭圆曲线群上的运算,而非有限域GF(p)上的运算。

对于Secp256k1曲线,其阶n是素数:

n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141

2的模n逆元为pow(2, n-2, n),也可以直接计算(n+1)//2(因为n是奇数,(n+1)/2 *2 =n+1 ≡1 mod n)。

修正后的代码

# Secp256k1曲线上的点坐标
Q_x = 0xc6047f9441ed7d6d3045406e95c07cd85c778e4b8cef3ca7abac09b95c709ee5
Q_y = 0x1ae168fea63dc339a3c58419466ceaeef7f632653266d0e1236431a950cfe52a

# Secp256k1曲线参数
p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F
a = 0x0000000000000000000000000000000000000000000000000000000000000000
b = 0x0000000000000000000000000000000000000000000000000000000000000007
n = 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141

def mod_inverse(x, mod):
    return pow(x, mod-2, mod)

# 椭圆曲线点加法(包含点加倍逻辑)
def point_add(x1, y1, x2, y2, p, a):
    if x1 == x2 and y1 == y2:
        # 点加倍
        s = (3 * pow(x1, 2, p) + a) * mod_inverse(2 * y1, p) % p
    else:
        # 普通点加法
        s = (y2 - y1) * mod_inverse(x2 - x1, p) % p
    x3 = (pow(s, 2, p) - x1 - x2) % p
    y3 = (s * (x1 - x3) - y1) % p
    return x3, y3

# 椭圆曲线标量乘法(快速幂实现)
def scalar_mult(k, x, y, p, a):
    # 初始化结果为无穷远点,用(None, None)表示
    res_x, res_y = None, None
    current_x, current_y = x, y
    while k > 0:
        if k % 2 == 1:
            if res_x is None:
                res_x, res_y = current_x, current_y
            else:
                res_x, res_y = point_add(res_x, res_y, current_x, current_y, p, a)
        current_x, current_y = point_add(current_x, current_y, current_x, current_y, p, a)
        k = k // 2
    return res_x, res_y

# 计算2的模n逆元
k = pow(2, n-2, n)
# 等价于 k = (n + 1) // 2

# 计算点除以2:Q * k
P_x, P_y = scalar_mult(k, Q_x, Q_y, p, a)

# 输出结果
print("点除以2的结果:")
print("x =", hex(P_x))
print("y =", hex(P_y))

结果验证

运行上述代码后,输出将与你期望的结果一致:

x = 0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798
y = 0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8

通用Z除法扩展

对于任意Z(需与曲线阶n互质,即gcd(Z, n)=1),只需将上述代码中的k改为pow(Z, n-2, n),即可实现点除以Z的运算。

内容的提问来源于stack exchange,提问作者manu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 04:54:55