Advertisement
saleks28

bva7

Sep 5th, 2020
374
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.59 KB | None | 0 0
  1. from datetime import datetime
  2.  
  3. CONST_MENU = "Введите номер команды\n" \
  4.     "1 - Трюк Шамира\n" \
  5.     "2 - Бинарный метод\n" \
  6.     "3 - Встроенные функции Sage\n" \
  7.     "4 - Выход\n"
  8.  
  9.  
  10. def sum_points(P, Q, E, p):
  11.     xP, yP, zP = lift(P[0]), lift(P[1]), lift(P[2])
  12.     xQ, yQ, zQ = lift(Q[0]), lift(Q[1]), lift(Q[2])
  13.  
  14.     U = yQ * zP - yP
  15.     UU = U * U
  16.     V = xQ * zP - xP
  17.     VV = V * V
  18.     VVV = V * VV
  19.     R = VV * xP
  20.     A1 = UU * zP - VVV - 2 * R
  21.  
  22.     xG = A1 * V
  23.     yG = U * (R - A1) - VVV * yP
  24.     zG = VVV * zP
  25.     zG_inv = inverse_mod(zG, p)
  26.     return E((xG* zG_inv) % p, (yG* zG_inv) % p, (zG * zG_inv) % p)
  27.  
  28. def bin_alg(P, k, E):
  29.     t = len(bin(k)) - 2
  30.     #t = int(ceil(log(k, 2)))
  31.     Q_inf = E(0, 1, 0)
  32.     binary_form_k = bin(k)[2::]
  33.     for i in range(0, t):
  34.         Q_inf = 2 * Q_inf
  35.         if binary_form_k[i] == '1':
  36.             Q_inf = Q_inf + P
  37.     return Q_inf
  38.  
  39. def NAF(k):
  40.     NAF_k = []
  41.     while k >= 1:
  42.         k_i = 0
  43.         if k & 1 == 1:
  44.             k_i = 2 - (k % 4)
  45.             k -= k_i
  46.         k >>= 1
  47.         NAF_k.append(k_i)
  48.     return NAF_k
  49.  
  50. def Shamir_NAF(k1, k2, G, Q, E):
  51.     k1_bin = NAF(k1)
  52.     k2_bin = NAF(k2)
  53.     print(k1_bin)
  54.     print(k2_bin)
  55.     i = max(len(k1_bin) - 1, len(k2_bin) - 1)
  56.     R = E(0, 1, 0)
  57.     while i >= 0:
  58.         R = 2 * R
  59.         if i < len(k1_bin):
  60.             if k1_bin[i] > 0:
  61.                 R += G
  62.             elif k1_bin[i] < 0:
  63.                 R -= G
  64.         if i < len(k2_bin):
  65.             if k2_bin[i] > 0:
  66.                 R += Q
  67.             elif k2_bin[i] < 0:
  68.                 R -= Q
  69.         i -= 1
  70.     return R
  71.    
  72.  
  73. def show_sage_results(G, Q, E, k1, k2):
  74.     start_time = datetime.now()
  75.     res = k1 * G + k2 * Q
  76.     print("Sage:\nСумма кратных точек равна {}, время выполнения - {}" .
  77.           format(res, datetime.now() - start_time))
  78.  
  79.  
  80. def main():
  81.     p = 115792089237316193816632940749697632394964361042935191217416087735021737577431
  82.     A = 39911043712488959346023488649471543779004688285304668897256090422321915164205
  83.     B = 26607362474992639564015659099647695852669792190203112598170726948214610109470
  84.     xG = 1
  85.     yG = 11226734598496010064741041559038474696573800958032815190522914592034679115175
  86.     E = EllipticCurve(GF(p), [A, B])
  87.     xQ = 38629820510180468045357408584494165586311762354959716428253674833800185794409
  88.     yQ = 47209116219363615180726774296092433536731216531642727785409102267320788176038
  89.     G = E(xG, yG)
  90.     Q = E(xQ, yQ)
  91.  
  92.     k1 = 2 ** 64
  93.     k2 = 222220000022222000002222200000
  94.     while 1:
  95.         user_choice = input(CONST_MENU)
  96.         if not user_choice.isdigit():
  97.             continue
  98.         user_choice = int(user_choice)
  99.         if user_choice == 1:
  100.             start_time = datetime.now()
  101.             res = Shamir_NAF(k1, k2, G, Q, E)
  102.             print("Трюк Шамира с NAF: {}, время выполнения - {}" .
  103.                   format(res, datetime.now() - start_time))
  104.         elif user_choice == 2:
  105.             start_time = datetime.now()
  106.             resG = bin_alg(G, k1, E)
  107.             resQ = bin_alg(Q, k2, E)
  108.            # print(resG)
  109.            # print(resQ)
  110.             sum = sum_points(resG, resQ, E, p)
  111.             print("Сумма кратных точек: {}, время выполнения - {}" .
  112.                   format(sum, datetime.now() - start_time))
  113.         elif user_choice == 3:
  114.             show_sage_results(G, Q, E, k1, k2)
  115.         elif user_choice == 4:
  116.             return
  117.  
  118. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement