· 9 years ago · Oct 14, 2016, 05:38 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 text = ''.join([Alpha[x] for x in intlst])
30 return text
31
32def gcdex(a, b):
33 if b == 0:
34 return a, 1, 0
35 else:
36 d, x, y = gcdex(b, a % b)
37 return d, y, x - y * (a // b)
38
39def getPrime(n):
40 """n - ребуемое кол-во бит
41 в двоичной запиÑи проÑтого чиÑла
42 """
43 lst = []
44 ind = 1
45 for i in range(2**(n-1), 2**n): # генерируем ÑпиÑок проÑтых чиÑел,
46 for j in range(2, int(i**(0.5))): # ÑоÑтоÑщие из n бит
47 if i % j == 0:
48 ind = 0
49 break
50 if ind:
51 lst.append(i)
52 ind = 1
53 return lst[rand(0, len(lst)-1)] # выбираем из ÑпиÑка Ñлучайным образом
54
55def RSA():
56 ############################################################
57 # МÐТЕМÐТИКР#
58 ############################################################
59
60 p = getPrime(8) # генерим первое проÑтое чиÑло
61 q = getPrime(8) # генерим второе
62 while q == p:
63 q = getPrime(8)
64 print('p : %s; q : %s' % (p, q))
65 n = p*q # получаем модуль
66 Fn = (p-1)*(q-1) # Ñчитаем Ñ„-ÑŽ Ðйлера
67 e = 257 # выбираем открытую ÑкÑпоненту e
68 d = gcdex(e, Fn)[1] % Fn # выбираем Ñекретную ÑкÑпоненту d
69 public_Key = [e, n] # ÑохранÑем открытый ключ
70 secret_Key = [d, n] # ÑохранÑем Ñекретный ключ
71 mod_len = len(bin(n)[2:])
72
73 print('Public Key : {%s, %s}' % (e, n))
74 print('Secret Key : {%s, %s}' % (d, n))
75
76 ############################################################
77 # ШИФРОВÐÐИЕ #
78 ############################################################
79 while 1:
80 choose = input('Choose mode (0 - ZASHIFROVANIE, 1 - RASSHIFROVANIE) : ')
81 if choose == '0':
82 mass = input('Enter massage : ')
83 publickey = input('Key ? : ')
84 mass = dataProc(mass, 0, mod_len)
85
86 # ЗÐШИФРОВКÐ
87 ch_text = []
88 for b in mass:
89 ch_text.append(((b**e) % n))
90
91 print(ch_text)
92 elif choose == '1':
93 # Ð ÐСШИФРОВКÐ
94 c = input('Enter ciphertext : ')
95 secretkey = input('Key ? : ')
96 plain_text = []
97 for b in ch_text:
98 plain_text.append(((b**d) % n))
99
100 plain_text = dataProc(plain_text, 1, mod_len)
101
102 print(plain_text)
103
104
105if __name__ == '__main__':
106 RSA()