Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- CONST_MENU = "Введите номер команды: \n" \
- "1 - Решить выражения из варианта\n" \
- "2 - Сложить 2 точки\n" \
- "3 - Изменить параметры кривой\n" \
- "4 - Выход\n"
- def double_point(G, E, A, p):
- x1, y1, z1 = lift(G[0]), lift(G[1]), lift(G[2])
- A1 = (3 * x1 ** 2 + A * z1 ** 2) % p
- B1 = (2 * y1 * z1) % p
- x2 = (B1 * (A1 ** 2 - 4 * x1 * y1 * B1)) % p
- y2 = (A1 * ((6 * x1 * y1 * B1) - A1 ** 2) - 2 * y1 ** 2 * B1 ** 2) % p
- z2 = inverse_mod((B1 ** 3) % p, p)
- return E((x2 * z2) % p, (y2 * z2) % p)
- def sum_points(P, Q, E, p):
- xP, yP, zP = lift(P[0]), lift(P[1]), lift(P[2])
- xQ, yQ, zQ = lift(Q[0]), lift(Q[1]), lift(Q[2])
- U = yQ * zP - yP
- UU = U * U
- V = xQ * zP - xP
- VV = V * V
- VVV = V * VV
- R = VV * xP
- A1 = UU * zP - VVV - 2 * R
- xG = A1 * V
- yG = U * (R - A1) - VVV * yP
- zG = VVV * zP
- zG_inv = inverse_mod(zG, p)
- return E((xG* zG_inv) % p, (yG* zG_inv) % p, (zG * zG_inv) % p)
- def mul_point(P, k, E, A, p):
- G = double_point(P, E, A, p)
- for i in range(2, k):
- G = sum_points(G, P, E, p)
- return G
- def variant(p, A, B, xg, yg):
- E = EllipticCurve(GF(p), [A, B])
- P = E.random_point()
- if P not in E:
- return
- print(P)
- print("================")
- print("2P")
- P2 = double_point(P, E, A, p)
- print("Своя реализация: ")
- print(P2)
- print("Sage")
- print(2 * P)
- P3 = sum_points(P, P2, E, p)
- print("3P")
- print("Своя реализация: ")
- print(P3)
- print("Sage")
- print(3 * P)
- G = E(xg, yg)
- G2 = double_point(G, E, A, p)
- print("G point")
- print(G)
- print("2G")
- print("Своя реализация: ")
- print(G2)
- print("Sage")
- print(2 * G)
- print("Выражение: ")
- res = 2002 * G + 21212 * G
- G_part1 = mul_point(G, 2002, E, A, p)
- G_part2 = mul_point(G, 21212, E, A, p)
- G_res = sum_points(G_part1, G_part2, E, p)
- print(G_res)
- print("Своя реализация: ")
- print(G_res)
- print("Sage")
- print(res)
- def main():
- p = 115792089237316193816632940749697632394964361042935191217416087735021737577431
- A = 39911043712488959346023488649471543779004688285304668897256090422321915164205
- B = 26607362474992639564015659099647695852669792190203112598170726948214610109470
- xG = 1
- yG = 11226734598496010064741041559038474696573800958032815190522914592034679115175
- E = None
- # Найти 2G, 2002G + 212121222121212G
- # Вместо 212121222121212 возьмем 21212 * G, чтобы уменьшить продолжительность работы
- while 1:
- user_choice = input(CONST_MENU)
- if not user_choice.isdigit():
- continue
- user_choice = int(user_choice)
- if user_choice == 1:
- variant(p, A, B, xG, yG)
- elif user_choice == 2:
- E = EllipticCurve(GF(p), [A, B])
- print("Первая точка")
- P1, P2 = None, None
- n = int(input("1 - Сгенерировать произвольную\n2 - Ввести вручную координаты\n"))
- if n == 1:
- P1 = E.random_point()
- else:
- x1 = int(input("Введите x: "))
- y1 = int(input("Введите y: "))
- while y1 ** 2 % p != (x1 ** 3 + A * x1 + B) % p:
- print("Точка не принадлежит ЭК")
- x1 = int(input("Введите x: "))
- y1 = int(input("Введите y: "))
- P1 = E(x1, y1)
- print("Введите вторую точку")
- n = int(input("1 - Сгенерировать произвольную\n2 - Ввести вручную координаты\n"))
- if n == 1:
- P2 = E.random_point()
- else:
- x2 = int(input("Введите x: "))
- y2 = int(input("Введите y: "))
- while y2 ** 2 % p != (x2 ** 3 + A * x2 + B) % p:
- print("Точка не принадлежит ЭК")
- x2 = int(input("Введите x: "))
- y2 = int(input("Введите y: "))
- P2 = E(x2, y2)
- print(f"P1:\t{P1}")
- print(f"P2:\t{P2}")
- if P1 == P2:
- P_res = double_point(P1, E, A, p)
- else:
- P_res = sum_points(P1, P2, E, p)
- print("Своя реализация")
- print(P_res)
- print("Sage")
- print(P1 + P2)
- elif user_choice == 3:
- p = int(input("Введите характеристику: "))
- while p not in Primes():
- p = int(input("Введите простую характеристику: "))
- A = int(input("Введите A: "))
- B = int(input("Введите B: "))
- E = EllipticCurve(GF(p), [A, B])
- print("Elliptic curve: ", E)
- elif user_choice == 4:
- print("Завершение работы...")
- break
- else:
- print("Неверный номер команды\n")
- continue
- pass
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement