Advertisement
Guest User

Untitled

a guest
Dec 10th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.62 KB | None | 0 0
  1. from random import randrange, getrandbits, random
  2. def is_prime(n, k=128):
  3.     """ Test if a number is prime
  4.        Args:
  5.            n -- int -- the number to test
  6.            k -- int -- the number of tests to do
  7.        return True if n is prime
  8.    """
  9.     # Test if n is not even.
  10.     # But care, 2 is prime !
  11.     if n == 2 or n == 3:
  12.         return True
  13.     if n <= 1 or n % 2 == 0:
  14.         return False
  15.     # find r and s
  16.     s = 0
  17.     r = n - 1
  18.     while r & 1 == 0:
  19.         s += 1
  20.         r //= 2
  21.     # do k tests
  22.     for _ in range(k):
  23.         a = randrange(2, n - 1)
  24.         x = pow(a, r, n)
  25.         if x != 1 and x != n - 1:
  26.             j = 1
  27.             while j < s and x != n - 1:
  28.                 x = pow(x, 2, n)
  29.                 if x == 1:
  30.                     return False
  31.                 j += 1
  32.             if x != n - 1:
  33.                 return False
  34.     return True
  35.  
  36.  
  37. def generate_prime_candidate(length):
  38.     """ Generate an odd integer randomly
  39.        Args:
  40.            length -- int -- the length of the number to generate, in bits
  41.        return a integer
  42.    """
  43.     # generate random bits
  44.     p = getrandbits(length)
  45.     # apply a mask to set MSB and LSB to 1
  46.     p |= (1 << length - 1) | 1
  47.     return p
  48. def generate_prime_number(length=1024):
  49.     """ Generate a prime
  50.        Args:
  51.            length -- int -- length of the prime to generate, in          bits
  52.        return a prime
  53.    """
  54.     p = 4
  55.     # keep generating while the primality test fail
  56.     while not is_prime(p, 128):
  57.         p = generate_prime_candidate(length)
  58.     return p
  59.  
  60. '''
  61. for i in range(10000):
  62.     if len(str(generate_prime_candidate(i+1))) >= 50:
  63.         print()
  64.         break
  65. '''
  66.  
  67.  
  68. def AE(A, B):
  69.     r1 = B
  70.     r2 = A
  71.  
  72.     rs = [B, A]
  73.     qs = []
  74.  
  75.  
  76.     while rs[-1] != 0:
  77.         qs.append(rs[-2] // rs[-1])
  78.         rs.append(rs[-2] % rs[-1])
  79.  
  80.     return rs[-2]
  81.  
  82. def find_D(fi):
  83.  
  84.     out = 1 * fi // 5
  85.  
  86.     for i in range(fi-out):
  87.         if AE(fi-i-out, fi) == 1:
  88.             return fi-i-out
  89.  
  90.  
  91.  
  92. def find_E(A, B):
  93.     r1 = B
  94.     r2 = A
  95.  
  96.     rs = [B, A]
  97.     qs = []
  98.  
  99.     Kj = [0, 1]
  100.  
  101.     while rs[-1] != 0:
  102.         qs.append(rs[-2] // rs[-1])
  103.         rs.append(rs[-2] % rs[-1])
  104.  
  105.         Kj.append(qs[-1] * Kj[-1] + Kj[-2])
  106.  
  107.     idx = len(Kj -4)
  108.  
  109.     # print(rs, qs)
  110.     return Kj[-2]
  111.  
  112. l = [' ', 'а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я']
  113. def get_code(c):
  114.     ret = l.index(c)
  115.     if ret < 10:
  116.         return '0' + str(ret)
  117.     else:
  118.         return str(ret)
  119.  
  120.  
  121. def encode(s):
  122.  
  123.     return int(''.join([get_code(c) for c in s]))
  124.  
  125. def gen_keys(byte_len):
  126.     p1 = generate_prime_number(byte_len)
  127.     p2 = generate_prime_number(byte_len)
  128.     M = p1 * p2
  129.  
  130.     print('p1:', p1)
  131.     print('p2:', p2)
  132.     print('M', M)
  133.     print('M len:', len(str(p1*p2)))
  134.  
  135.     fi = (p1 - 1) * (p2 - 1)
  136.     print('fi: ', fi)
  137.  
  138.     D = find_D(fi)
  139.     E = find_E(D, fi)
  140.  
  141.    
  142.     print('D: ', D)
  143.     print('E: ', E)
  144.  
  145.     return M, D, E
  146.  
  147.  
  148. # Mm = 4077599079861103062161070927516158477409733157845537591441632356483314364489065340039377643553910891
  149. # Em = 25092117
  150. # Dm = 255371695852971190389720158260140526611529770329545078278739763160868458300098713710098088454270781
  151.  
  152. M, D, E = gen_keys(5)
  153. Mm, Dm, Em = gen_keys(5)
  154.  
  155.  
  156. msg = encode('тест тест тест тест тест')
  157. msg = 17
  158. print('msg: ', msg)
  159.  
  160.  
  161. s = pow(msg, D, M)
  162. c = pow(s, Em, Mm)
  163. a= pow(c,Dm ,Mm)
  164. x = pow(a, E, M)
  165.  
  166. alt_c = pow(msg, Em, Mm)
  167. alt_s = pow(alt_c, D, M)
  168. alt_a= pow(alt_s,E,M)
  169. alt_x = pow(alt_a, Dm, Mm)
  170.  
  171.  
  172. # print(c)
  173. # print(s)
  174. # print(a)
  175. print('encoded msg: ', x)
  176. print('alt encoded msg: ', alt_x)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement