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))
但使用相同私钥时,生成的公钥与在线工具结果不一致。
我理解的生成流程如下:
- 生成随机私钥;
- 通过“私钥×固定点G”生成公钥:
- 采用*双加(Double-and-Add)*算法避免重复累加G,因数值过大无法直接循环累加;
- 所有加法运算后需取模
P(固定大质数); - 除法运算实际为模
P下的逆元,通过扩展欧几里得算法求解。
我不确定模运算(%P)的正确位置,尝试过多次调整仍未解决问题,且因数值和运算量过大无法分步测试,希望得到帮助排查问题。
内容的提问来源于stack exchange,提问作者hib0823
相关产品推荐
相关产品推荐

