rsa

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
from decimal import Decimal
def egcd(a, b):
if a == 0:
return (b, 0, 1)
else:
g, y, x = egcd(b % a, a)
return (g, x - (b // a) * y, y)
def modinv(a, m):
gcd, x, y = egcd(a, m)
if gcd != 1:
return None # modular inverse does not exist
else:
return x % m
def secret_exp(e, qn): # qn - результат функции Ейлера
'''Вычисляет секретную экспоненту'''
return Decimal(pow(e,-1)) % Decimal(qn)
def enc(p, q, e, text):
'''Шифррует строку переданную в праметре text'''
n = p * q
eiler_func_res = (p-1)*(q-1) #q(n)
print('q(n) = {0}, n = {1}'.format(eiler_func_res, n))
res = []
if text.isalpha():
for i in text:
if i.isalpha():
symb_to_enc = ord(i)
else:
symb_to_enc = i
print('{} ** {} % {}'.format(symb_to_enc, e, n))
c = (int(symb_to_enc) ** e) % n
res.append(c)
elif text.isdigit():
res = (pow(int(text), e)) % n
return res
def descr(p, q, e, text):
'''Расшифровывает строку переданную в праметре text'''
n = p * q
sec_exp = modinv(e, ((p-1)*(q-1))) # d
d = "d = " + str(sec_exp)
print(d)
res = []
if type(text) == type([]):
for i in text:
symb_to_desc = (int(i) ** int(sec_exp)) % n
res.append(chr(symb_to_desc))
else:
res = (pow(int(text), sec_exp)) % n
return res
def main():
p = input('Первый открытый ключ >>> ')
q = input('Второй открытый ключ >>> ')
e = input('Экспонента >>> ')
text_to_enc = input('Текст для шифрования >>> ') # m
try:
p, q, e = int(p), int(q), int(e)
except ValueError:
pass
encrypted_text = enc(p, q, e, text_to_enc)
desctypted_text = descr(p , q, e, encrypted_text)
return(encrypted_text, ''.join(desctypted_text))
encoded_str, decoded_str = main()
print("Зашифрованный текст:", end=" ")
print(encoded_str)
print("Расшифрованный текст:", [decoded_str])
input()