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

SECP256K1椭圆曲线手动生成公钥问题求助(Python实现)

SECP256K1手动生成公钥与在线工具结果不一致的问题排查

我是Python和密码学领域的新手,正尝试不使用相关库,手动从随机生成的私钥出发,基于SECP256K1椭圆曲线生成公钥。私钥生成方式不限,核心关注公钥的生成过程。

我编写的代码如下:

import random
import os
import time
import hashlib

def generate_private_key():
    global P
    while(True):
        key=str(random.random())+str(os.urandom(100))+str(time.time())
        key=hashlib.sha256(key.encode())
        key=int(key.hexdigest(),16)
        if(P>key):
            return key

def generate_public_key(private_key):
    global G
    global P
    bit=list(bin(private_key)[2:])
    point=(0,0)
    for i in bit:
        if i=='0':
            point=point_double(point, P)
        elif i=='1':
            point=point_double(point, P)
            point=point_add(point,G, P)
    return point


#Extended Euclidean Algorithm
def inverse(b,n):
    r1=n
    r2=b
    t1=0
    t2=1
    while(r2>0):
        q=r1//r2
        t=t1-q*t2
        t1=t2
        t2=t
        r=r1-q*r2
        r1=r2
        r2=r
    if t1>0: return t1
    else: return t1+t2
    

def point_double(point, P):
    (x,y)=point
    lam=3*(x**2)*inverse(2*y,P)
    xsum=lam**2-x*2
    ysum=lam*(x-xsum)-y
    return xsum%P, ysum%P

def point_add(p1, p2, P):
    (x1,y1)=p1
    (x2, y2)=p2
    if x1==x2 and y1==y2:
        return point_double(p1)

    lam=(y2-y1)*inverse(x2-x1, P)
    xsum= lam**2-(x1+x2)
    ysum= lam*(x1-xsum)-y1
    return xsum%P, ysum%P




P=0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F

G = (0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798,
0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8)

private_key=generate_private_key()

#my private key
print(hex(private_key))

#public key
print(generate_public_key(private_key))

但使用相同私钥时,生成的公钥与在线工具结果不一致。

我理解的生成流程如下:

  1. 生成随机私钥;
  2. 通过“私钥×固定点G”生成公钥:
    • 采用*双加(Double-and-Add)*算法避免重复累加G,因数值过大无法直接循环累加;
    • 所有加法运算后需取模P(固定大质数);
    • 除法运算实际为模P下的逆元,通过扩展欧几里得算法求解。

我不确定模运算(%P)的正确位置,尝试过多次调整仍未解决问题,且因数值和运算量过大无法分步测试,希望得到帮助排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 21:53:18