Вот что у меня есть.
Код: Выделить всё
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))
Однако я не могу получить тот же открытый ключ из тот же закрытый ключ.
Я думаю, вот этот процесс:
- Создайте случайный закрытый ключ.
Создайте открытый ключ, используя (закрытый ключ * a фиксированная точка G)
2-2. Все дополнения сопровождаются (mod P). P тоже очень большое фиксированное число.
2-3. Не все подразделения являются подразделениями в буквальном смысле слова. Это инверсия (mod P). Решение обратного числа (mod P) выполняется с помощью расширенного алгоритма Евклида («обратная» функция в коде).
Поскольку я не был уверен, куда поместить «%P» кода, я попробовал несколько мест, вставив «%P», но пока безуспешно, и в итоге получил текущий код. Я не мог проверить результат шаг за шагом, потому что цифры и объем процесса были слишком большими.
Подробнее здесь: https://stackoverflow.com/questions/757 ... yptography