Генератор открытых ключей на Python (криптография на основе эллиптических кривых SECP256K1)Python

Программы на Python
Ответить
Anonymous
 Генератор открытых ключей на Python (криптография на основе эллиптических кривых SECP256K1)

Сообщение Anonymous »

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

Подробнее здесь: https://stackoverflow.com/questions/757 ... yptography
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»