Python 中的公钥生成器(SECP256K1 椭圆曲线加密)

问题描述 投票:0回答:1

我目前是 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/ 但是,我无法从同一个私钥中获得相同的公钥。

这是我认为的过程:

  1. 创建随机私钥。
  2. 使用(私钥*固定点G)创建公钥

2-1.使用 Double-and-Add 方法可以避免将 G [私钥] 次相加,因为两个数字都太大了。

2-2.所有添加后面都跟有 (mod P)。 P也是一个很大的数,固定的。

2-3。所有的划分都不是字面上的划分。它是 (mod P) 的倒数。求解 (mod P) 的逆是通过使用扩展欧几里得算法(代码中的“逆”函数)来完成的。

由于我不确定在代码中将“%P”放在哪里,所以我尝试了几个地方放置“%P”,但到目前为止没有运气,最终得到了当前的代码。我无法实际一步步测试结果,因为数量和过程量太大了。

python bitcoin elliptic-curve secp256k1 euclidean-algorithm
1个回答
0
投票

可以使用 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}")
© www.soinside.com 2019 - 2024. All rights reserved.