Advertisement
saleks28

BVA1

Aug 20th, 2020
371
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.03 KB | None | 0 0
  1. from copy import deepcopy
  2. from numpy import floor, ceil
  3. from random import randint, shuffle
  4. from math import gcd
  5.  
  6.  
  7. def find_full_index(mu, s, k):
  8.     for i in range(0, len(mu)):
  9.         if mu[i][0][0] == s and mu[i][0][1] == k:
  10.             return i
  11.  
  12.  
  13. def calc_r(mu_znach):
  14.     if mu_znach > 0:
  15.         r = floor(1 / 2 + mu_znach)
  16.     else:
  17.         r = -floor(1 / 2 - mu_znach)
  18.     return int(r)
  19.  
  20.  
  21. def print_matrix(M):
  22.     for i in M:
  23.         print(i)
  24.  
  25.  
  26. def gram_schmidt(a):
  27.     k = len(a[0])
  28.     N = len(a)
  29.     b = [[0] * k for i in range(N)]
  30.     b[0] = a[0]
  31.     mu = list()
  32.     B = list()
  33.     b_znam = 0
  34.     for n in range(k):
  35.         b_znam += b[0][n] * b[0][n]
  36.     B.append(b_znam)
  37.     for i in range(1, N):
  38.         sum = a[i]
  39.         for j in range(0, i):
  40.             scolar_ab = 0
  41.             scolar_bb = 0
  42.             proj = [0 for i in range(k)]
  43.             for n in range(k):
  44.                 scolar_ab += b[j][n] * a[i][n]
  45.                 scolar_bb += b[j][n] * b[j][n]
  46.             indexes = tuple([i + 1, j + 1])
  47.             m = list([indexes, scolar_ab / scolar_bb])
  48.             mu.append(m)
  49.             for n in range(k):
  50.                 proj[n] = (scolar_ab / scolar_bb) * b[j][n]
  51.             for n in range(k):
  52.                 sum[n] -= proj[n]
  53.         b[i] = sum
  54.         b_znam = 0
  55.         for n in range(k):
  56.             b_znam += b[i][n] * b[i][n]
  57.         B.append(b_znam)
  58.     return b, mu, B
  59.  
  60.  
  61. def LLL_algh(ai_basis):
  62.     bi_basis = deepcopy(ai_basis)  # Вместо ссылки создаем новую переменную, чтобы не затереть ai
  63.     orth_basis, mu, B = gram_schmidt(bi_basis)
  64.     n = len(orth_basis)
  65.     k = 2  # Положить k = 2
  66.     while 1:
  67.         number = find_full_index(mu, k, k - 1)
  68.         mu_num = mu[number][1]
  69.         if abs(mu_num) > 1 / 2:
  70.             r = calc_r(mu_num)
  71.             for i in range(0, len(ai_basis[k - 1])):
  72.                 ai_basis[k - 1][i] -= r * ai_basis[k - 2][i]
  73.             for j in range(1, k - 1):
  74.                 id_k = find_full_index(mu, k, j)
  75.                 id_k_1 = find_full_index(mu, k - 1, j)
  76.                 mu[id_k][1] -= r * mu[id_k_1][1]
  77.             mu[number][1] -= r
  78.             mu_num = mu[number][1]
  79.         if B[k - 1] < (3 / 4 - mu_num ** 2) * B[k - 2]:
  80.             B_t = B[k - 1] + mu_num ** 2 * B[k - 2]
  81.             mu[number][1] = mu_num * B[k - 2] / B_t
  82.             B[k - 1] *= B[k - 2] / B_t
  83.             B[k - 2] = B_t
  84.             ai_basis[k - 1], ai_basis[k - 2] = ai_basis[k - 2], ai_basis[k - 1]
  85.             if k > 2:
  86.                 for j in range(1, k - 1):
  87.                     id_k = find_full_index(mu, k, j)
  88.                     id_k_1 = find_full_index(mu, k - 1, j)
  89.                     mu[id_k][1], mu[id_k_1][1] = mu[id_k_1][1], mu[id_k][1]
  90.             for s in range(k + 1, n + 1):
  91.                 id_s = find_full_index(mu, s, k)
  92.                 t = mu[id_s][1]
  93.                 id_s_k_1 = find_full_index(mu, s, k - 1)
  94.                 mu[id_s][1] = mu[id_s_k_1][1] - mu_num * t
  95.                 mu[id_s_k_1][1] = t + mu[number][1] * mu[id_s][1]
  96.             k = max(2, k - 1)
  97.         else:
  98.             for l in range(1, k - 1)[::-1]:
  99.                 ind = find_full_index(mu, k, l)
  100.                 mu_zn = mu[ind][1]
  101.                 if abs(mu_zn) > 1 / 2:
  102.                     r = calc_r(mu_zn)
  103.                     for i in range(0, len(ai_basis[k - 1])):
  104.                         ai_basis[k - 1][i] -= r * ai_basis[l - 1][i]
  105.                     for j in range(1, l):
  106.                         ind_k = find_full_index(mu, k, j)
  107.                         ind_l = find_full_index(mu, l, j)
  108.                         mu[ind_k][1] -= r * mu[ind_l][1]
  109.                     ind = find_full_index(mu, k, l)
  110.                     mu[ind][1] -= r
  111.             k += 1
  112.         if k <= n:
  113.             continue
  114.         return ai_basis
  115.  
  116.  
  117. def test_LLL():
  118.     a1 = [1, 8, 12, 1, 4]
  119.     a2 = [6, -6, 1, 14, 2]
  120.     a3 = [5, 6, 7, 1, 2]
  121.     a4 = [12, -1, 5, 1, 9]
  122.     A = list()
  123.     A.append(a1)
  124.     A.append(a2)
  125.     A.append(a3)
  126.     A.append(a4)
  127.     print("Matrix")
  128.     print_matrix(A)
  129.     print("LLL")
  130.     A = LLL_algh(A)
  131.     print_matrix(A)
  132.  
  133.  
  134. def generate_key(n):
  135.     b = list()
  136.     b.append(randint(1, 2 ** 32))
  137.     for i in range(0, n - 1):
  138.         val = randint(1, 2 ** 32) + sum(b)
  139.         b.append(val)
  140.     u = randint(1, 2 ** 32) + sum(b)
  141.     v = randint(2, u)
  142.     while True:
  143.         if gcd(u, v) == 1:
  144.             break
  145.         v = randint(2, u)
  146.     sigma = list()
  147.     for i in range(0, n):
  148.         sigma.append(i)
  149.     shuffle(sigma)
  150.     a = list()
  151.     for i in range(0, n):
  152.         val = v * b[sigma.index(i)] % u
  153.         a.append(val)
  154.     open_key = a
  155.     close_key = tuple([sigma, v, u, b])
  156.     return open_key, close_key
  157.  
  158.  
  159. def cryptoanalize(a, S):
  160.     n = len(a)
  161.     m = int(ceil((1 / 2) * (n ** (1/2))))
  162.     c = list()
  163.     for i in range(0, n):
  164.         c_i = list()
  165.         for j in range(0, n):
  166.             if i == j:
  167.                 c_i.append(1)
  168.             else:
  169.                 c_i.append(0)
  170.         c_i.append(m * a[i])
  171.         c.append(c_i)
  172.     c_n = list()
  173.     for i in range(0, n):
  174.         c_n.append(1 / 2)
  175.     c_n.append(m * S)
  176.     c.append(c_n)
  177.     print("Matrix")
  178.     print_matrix(c)
  179.     B = LLL_algh(c)
  180.     print("-----------------")
  181.     print("LLL-matrix")
  182.     print_matrix(B)
  183.     i = 0
  184.     print("-----------------")
  185.     print("Result:")
  186.     for b in B:
  187.         if b[len(b) - 1] == 0 and abs(b[i]) == 1 / 2:
  188.             x_i_pl = list()
  189.             x_i_mn = list()
  190.             res_pl = list()
  191.             res_mn = list()
  192.             for j in range(0, n):
  193.                 x_i_mn.append(-b[j] + 1 / 2)
  194.                 x_i_pl.append(b[j] + 1 / 2)
  195.             for j in range(0, n):
  196.                 res_pl.append(x_i_pl[j] * a[j])
  197.                 res_mn.append(x_i_mn[j] * a[j])
  198.             if sum(res_pl) == S:
  199.                 return list(map(lambda x: int(x), x_i_pl))
  200.             elif sum(res_mn) == S:
  201.                 return list(map(lambda x: int(x), x_i_mn))
  202.         i += 1
  203.     return 0
  204.  
  205.  
  206. def encrypt(open_key, X):
  207.     Y = 0
  208.     for i in range(0, len(X)):
  209.         Y += open_key[i] * X[i]
  210.     print(Y)
  211.     return Y
  212.  
  213. def main():
  214.     # var2 constants
  215.     S = 5500
  216.     A = [2623, 395, 35, 205, 3265, 55, 815, 95, 1655, 1304]
  217.     ai_basis = [10, 15, 17]
  218.    # LLL_algh(ai_basis)
  219.     #print(ai_basis)
  220.     # open_key, close_key = generate_key(10)
  221.     open_key = [1148139072373, 1549926979992, 1332848016239, 131153880541, 321298864000, 2162694097211, 1737738292645, 1129160628101, 1634656014996, 1297638970676]
  222.     close_key = ([7, 8, 3, 1, 0, 9, 4, 6, 5, 2], 436434491491, 2282812819458, [2538819365, 3905006220, 10275505357, 16985762388, 35226172069, 72397612136, 141749483998, 286294868611, 570687832283, 1142691010787])
  223.     #X = [0, 1, 1, 1, 0, 1, 1, 1, 0, 1]
  224.     #encrypt(open_key, X)
  225.     print(cryptoanalize(A, S))
  226.     x = cryptoanalize(A, S)
  227.     y = 0
  228.     for i in range(len(A)):
  229.         y += A[i] * x[i]
  230.     print(y)
  231.  
  232.  
  233. #test_LLL()
  234. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement