我目前是 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))
我正在将我的代码的结果与该网站的结果进行比较:https://paulmillr.com/noble/ 但是,我无法从同一个私钥中获得相同的公钥。
这是我认为的过程:
2-1.使用 Double-and-Add 方法可以避免将 G [私钥] 次相加,因为两个数字都太大了。
2-2.所有添加后面都跟有 (mod P)。 P也是一个很大的数,固定的。
2-3。所有的划分都不是字面上的划分。它是 (mod P) 的倒数。求解 (mod P) 的逆是通过使用扩展欧几里得算法(代码中的“逆”函数)来完成的。
由于我不确定在代码中将“%P”放在哪里,所以我尝试了几个地方放置“%P”,但到目前为止没有运气,最终得到了当前的代码。我无法实际一步步测试结果,因为数量和过程量太大了。
可以使用 LightPHE 非常简单地构建比特币的曲线。
# !pip install lightphe
from lightphe.elliptic_curve_forms.weierstrass import Weierstrass
# construct bitcoin curve
curve = Weierstrass(curve = "secp256k1")
# base point
G = curve.G
# define private key
k = 1837837
# calculate public key
Q = curve.double_and_add(G, k)
print(f"Public key is {Q}")