Как мне поместить мою скалярную функцию умножения для генерации открытого ключа Ethereum в кусочный оператор для Sympy?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как мне поместить мою скалярную функцию умножения для генерации открытого ключа Ethereum в кусочный оператор для Sympy?

Сообщение Anonymous »

Я пишу код на Python и хочу генерировать открытые ключи Ethereum из целых чисел закрытого ключа. У меня уже есть полный код для этого, но я хочу использовать кусочный оператор, чтобы Sympy мог его использовать, потому что он не может использовать нормальные условия, если они не находятся в кусочном операторе.
Функция, которую я сейчас рассматриваю:

Код: Выделить всё

def scalar_multiply(k, G, p):
"""Multiply point G by scalar k using point addition."""

result = None # Start with the point at infinity
addend = G

while k != 0:
if k % 2 == 1:
if result is None:
result = addend
else:
result = point_add(result, addend, p)

# Point doubling
addend = point_add(addend, addend, p)
k //= 2 # Right shift k by 1

return result
В этих операторах вместо циклов while и if и всего, что в них включено, я хочу сделать кусочное выполнение с помощью Sympy. Я не хочу иметь никаких циклов в функции скалярного умножения, я просто хочу, чтобы все объяснялось по частям. Полный код моего проекта приведен ниже, поэтому вы можете запустить его самостоятельно:

Код: Выделить всё

from sympy import symbols, Piecewise
import math
def modinv(a, p):
"""Compute modular inverse of a mod p using extended Euclidean algorithm."""
return pow(a, p - 2, p)

def point_add(P1, P2, p):
"""Add two points P1 and P2 on the elliptic curve over the field of size p."""
x1, y1 = P1
x2, y2 = P2

# Define m based on the conditions for point addition and doubling
m = Piecewise(
((y2 - y1) * modinv(x2 - x1, p) % p, x1 != x2), # Point addition case
((3 * x1 ** 2) * modinv(2 * y1, p) % p, x1 == x2), # Point doubling case
(0, True) # Default case if none of the conditions match
)

# Define (x3, y3) as a tuple
x3 = (m ** 2 - x1 - x2) % p
y3 = (m * (x1 - x3) - y1) % p

# Calculate result as an integer combining x3 and y3
result2 = x3 * (10 ** 64) + y3
return (x3,y3)

def scalar_multiply(k, G, p):
"""Multiply point G by scalar k using point addition."""

result = None # Start with the point at infinity
addend = G

while k != 0:
if k % 2 == 1:
if result is None:
result = addend
else:
result = point_add(result, addend, p)

# Point doubling
addend = point_add(addend, addend, p)
k //= 2 # Right shift k by 1

return result

# secp256k1 curve parameters
p = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F # Field prime
G = (0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798, # Generator point (G_x, G_y)
0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8)

k = 5

# Compute the public key
public_key = scalar_multiply(k, G, p)

print(public_key)
Все, что вам нужно сделать, это использовать то же самое, что и функцию point_add. Видите, как обстоят дела в Piecewise? Я хочу, чтобы функция скалярного умножения была такой же, но я не знаю, как это сделать.
Этот код сейчас не использует Sympy, но он является частью более крупного кода, который также будет использовать Sympy для математического расчета кода для клиента. Вот почему этот код не использует Sympy, это только основы. Мне не нужны циклы в моем скалярном умножении, я хочу, чтобы оно было кусочной функцией.

Подробнее здесь: https://stackoverflow.com/questions/791 ... ation-in-a
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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