Advertisement
saleks28

bva5

Aug 23rd, 2020
333
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.39 KB | None | 0 0
  1. CONST_MENU = "Введите номер команды: \n" \
  2.     "1 - Решить выражения из варианта\n" \
  3.     "2 - Сложить 2 точки\n" \
  4.     "3 - Изменить параметры кривой\n" \
  5.     "4 - Выход\n"
  6.  
  7. def double_point(G, E, A, p):
  8.     x1, y1, z1 = lift(G[0]), lift(G[1]), lift(G[2])
  9.  
  10.     A1 = (3 * x1 ** 2 + A * z1 ** 2) % p
  11.     B1 = (2 * y1 * z1) % p
  12.  
  13.     x2 = (B1 * (A1 ** 2 - 4 * x1 * y1 * B1)) % p
  14.     y2 = (A1 * ((6 * x1 * y1 * B1) - A1 ** 2) - 2 * y1 ** 2 * B1 ** 2) % p
  15.     z2 = inverse_mod((B1 ** 3) % p, p)
  16.     return E((x2 * z2) % p, (y2 * z2) % p)
  17.  
  18. def sum_points(P, Q, E, p):
  19.     xP, yP, zP = lift(P[0]), lift(P[1]), lift(P[2])
  20.     xQ, yQ, zQ = lift(Q[0]), lift(Q[1]), lift(Q[2])
  21.  
  22.     U = yQ * zP - yP
  23.     UU = U * U
  24.     V = xQ * zP - xP
  25.     VV = V * V
  26.     VVV = V * VV
  27.     R = VV * xP
  28.     A1 = UU * zP - VVV - 2 * R
  29.  
  30.     xG = A1 * V
  31.     yG = U * (R - A1) - VVV * yP
  32.     zG = VVV * zP
  33.     zG_inv = inverse_mod(zG, p)
  34.     return E((xG* zG_inv) % p, (yG* zG_inv) % p, (zG * zG_inv) % p)
  35.  
  36. def mul_point(P, k, E, A, p):
  37.     G = double_point(P, E, A, p)
  38.     for i in range(2, k):
  39.         G = sum_points(G, P, E, p)
  40.     return G
  41.  
  42.  
  43. def variant(p, A, B, xg, yg):
  44.     E = EllipticCurve(GF(p), [A, B])
  45.     P = E.random_point()
  46.     if P not in E:
  47.         return
  48.     print(P)
  49.     print("================")
  50.     print("2P")
  51.     P2 = double_point(P, E, A, p)
  52.     print("Своя реализация: ")
  53.     print(P2)
  54.     print("Sage")
  55.     print(2 * P)
  56.     P3 = sum_points(P, P2, E, p)
  57.     print("3P")
  58.     print("Своя реализация: ")
  59.     print(P3)
  60.     print("Sage")
  61.     print(3 * P)
  62.     G = E(xg, yg)
  63.     G2 = double_point(G, E, A, p)
  64.     print("G point")
  65.     print(G)
  66.     print("2G")
  67.     print("Своя реализация: ")
  68.     print(G2)
  69.     print("Sage")
  70.     print(2 * G)
  71.     print("Выражение: ")
  72.     res = 2002 * G + 21212 * G
  73.     G_part1 = mul_point(G, 2002, E, A, p)
  74.     G_part2 = mul_point(G, 21212, E, A, p)
  75.     G_res = sum_points(G_part1, G_part2, E, p)
  76.     print(G_res)
  77.     print("Своя реализация: ")
  78.     print(G_res)
  79.     print("Sage")
  80.     print(res)
  81.  
  82.  
  83. def main():
  84.     p = 115792089237316193816632940749697632394964361042935191217416087735021737577431
  85.     A = 39911043712488959346023488649471543779004688285304668897256090422321915164205
  86.     B = 26607362474992639564015659099647695852669792190203112598170726948214610109470
  87.     xG = 1
  88.     yG = 11226734598496010064741041559038474696573800958032815190522914592034679115175
  89.     E = None
  90.     # Найти 2G, 2002G + 212121222121212G
  91.     # Вместо 212121222121212 возьмем 21212 * G, чтобы уменьшить продолжительность работы
  92.     while 1:
  93.         user_choice = input(CONST_MENU)
  94.         if not user_choice.isdigit():
  95.             continue
  96.         user_choice = int(user_choice)
  97.         if user_choice == 1:
  98.             variant(p, A, B, xG, yG)
  99.         elif user_choice == 2:
  100.             E = EllipticCurve(GF(p), [A, B])
  101.             print("Первая точка")
  102.             P1, P2 = None, None
  103.             n = int(input("1 - Сгенерировать произвольную\n2 - Ввести вручную координаты\n"))
  104.             if n == 1:
  105.                 P1 = E.random_point()
  106.             else:
  107.                 x1 = int(input("Введите x: "))
  108.                 y1 = int(input("Введите y: "))
  109.                 while y1 ** 2 % p != (x1 ** 3 + A * x1 + B) % p:
  110.                     print("Точка не принадлежит ЭК")
  111.                     x1 = int(input("Введите x: "))
  112.                     y1 = int(input("Введите y: "))
  113.                 P1 = E(x1, y1)
  114.  
  115.             print("Введите вторую точку")
  116.             n = int(input("1 - Сгенерировать произвольную\n2 - Ввести вручную координаты\n"))
  117.             if n == 1:
  118.                 P2 = E.random_point()
  119.             else:
  120.                 x2 = int(input("Введите x: "))
  121.                 y2 = int(input("Введите y: "))
  122.                 while y2 ** 2 % p != (x2 ** 3 + A * x2 + B) % p:
  123.                     print("Точка не принадлежит ЭК")
  124.                     x2 = int(input("Введите x: "))
  125.                     y2 = int(input("Введите y: "))
  126.                 P2 = E(x2, y2)
  127.             print(f"P1:\t{P1}")
  128.             print(f"P2:\t{P2}")
  129.             if P1 == P2:
  130.                 P_res = double_point(P1, E, A, p)
  131.             else:
  132.                 P_res = sum_points(P1, P2, E, p)
  133.             print("Своя реализация")
  134.             print(P_res)
  135.             print("Sage")
  136.             print(P1 + P2)
  137.         elif user_choice == 3:
  138.             p = int(input("Введите характеристику: "))
  139.             while p not in Primes():
  140.                 p = int(input("Введите простую характеристику: "))
  141.             A = int(input("Введите A: "))
  142.             B = int(input("Введите B: "))
  143.             E = EllipticCurve(GF(p), [A, B])
  144.             print("Elliptic curve: ", E)
  145.         elif user_choice == 4:
  146.             print("Завершение работы...")
  147.             break
  148.         else:
  149.             print("Неверный номер команды\n")
  150.             continue
  151.     pass
  152.  
  153. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement