· 9 years ago · Oct 14, 2016, 02:54 AM
1from random import randint as rand
2
3Alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ\
4ÐБВГДЕЖЗИЙКЛМÐОПРСТУФХЦЧШЩЪЫЬÐЮЯ '
5
6def dexToBin(n, l):
7 res = bin(n)[2:]
8 return '0' * (l - len(res)) + res
9
10def binToDex(b):
11 return int(b, 2)
12
13def dataProc(data, mode, l):
14 """ Конвертируем текÑÑ‚ data в чиÑла длинной l
15 и обратно в завиÑимоÑти от режима mode.
16 mode = {0,1}
17 0 - текÑÑ‚ в чиÑла
18 1 - чиÑла в текÑÑ‚
19 """
20 if mode == 0:
21 intlst = [Alpha.find(x) for x in data]
22 bitseq = ''.join([dexToBin(x, l) for x in intlst])
23 blocks = [bitseq[i:i+l] for i in range(0, len(bitseq), l)]
24 blocks = [binToDex(s) for s in blocks]
25 return blocks
26 else:
27 bitseq = ''.join([dexToBin(x, l) for x in data])
28 intlst = [binToDex(bitseq[i:i+l]) for i in range(0, len(bitseq), l)]
29 return intlst
30
31def gcdex(a, b):
32 if b == 0:
33 return a, 1, 0
34 else:
35 d, x, y = gcdex(b, a % b)
36 return d, y, x - y * (a // b)
37
38def getPrime(n):
39 """n - ребуемое кол-во бит
40 в двоичной запиÑи проÑтого чиÑла
41 """
42 lst = []
43 ind = 1
44 for i in range(2**(n-1), 2**n): # генерируем ÑпиÑок проÑтых чиÑел,
45 for j in range(2, int(i**(0.5))): # ÑоÑтоÑщие из n бит
46 if i % j == 0:
47 ind = 0
48 break
49 if ind:
50 lst.append(i)
51 ind = 1
52 return lst[rand(0, len(lst))] # выбираем из ÑпиÑка Ñлучайным образом
53
54def RSA():
55 ############################################################
56 # МÐТЕМÐТИКР#
57 ############################################################
58
59 p = getPrime(8) # генерим первое проÑтое чиÑло
60 q = getPrime(8) # генерим второе
61 while q == p:
62 q = getPrime(8)
63 print(p, q)
64 n = p*q # получаем модуль
65 Fn = (p-1)*(q-1) # Ñчитаем Ñ„-ÑŽ Ðйлера
66 e = 257 # выбираем открытую ÑкÑпоненту e
67 d = gcdex(e, Fn)[1] % Fn # выбираем Ñекретную ÑкÑпоненту d
68 public_Key = [e, n] # ÑохранÑем открытый ключ
69 secret_Key = [d, n] # ÑохранÑем Ñекретный ключ
70
71 ############################################################
72 # ШИФРОВÐÐИЕ #
73 ############################################################
74
75 mass = input('Enter massage : ')
76 mass = dataProc(mass, 0, len(bin(n)[2:]))
77
78 ch_text = []
79 for b in mass:
80 ch_text.append((b**e) % n)
81
82
83if __name__ == '__main__':
84 RSA()
85
86 res = dataProc(input(), 0, 7)
87 print(res)
88
89 text = dataProc(res, 1, 7)
90 print(text)