|
@@ -0,0 +1,50 @@
|
|
|
|
+import random
|
|
|
|
+
|
|
|
|
+def gcd(a, b):
|
|
|
|
+ while b != 0:
|
|
|
|
+ a, b = b, a % b
|
|
|
|
+ return a
|
|
|
|
+
|
|
|
|
+def coprime(a, b):
|
|
|
|
+ return gcd(a, b) == 1
|
|
|
|
+
|
|
|
|
+def primes(N):
|
|
|
|
+ primes = []
|
|
|
|
+ for target_num in range(2, N):
|
|
|
|
+ is_prime = True
|
|
|
|
+ for i in range(2, target_num):
|
|
|
|
+ if target_num % i == 0:
|
|
|
|
+ is_prime = False
|
|
|
|
+ if is_prime:
|
|
|
|
+ primes.append(target_num)
|
|
|
|
+ return primes
|
|
|
|
+
|
|
|
|
+list_of_primes = primes(100)
|
|
|
|
+p, q = 0, 0
|
|
|
|
+while p == q:
|
|
|
|
+ p = random.choice(list_of_primes)
|
|
|
|
+ q = random.choice(list_of_primes)
|
|
|
|
+N = p * q
|
|
|
|
+F = (p - 1) * (q - 1)
|
|
|
|
+while True:
|
|
|
|
+ e = random.randint(2, F - 1)
|
|
|
|
+ if coprime(e, F):
|
|
|
|
+ break
|
|
|
|
+d = 0
|
|
|
|
+while True:
|
|
|
|
+ d += 1
|
|
|
|
+ if (d * e) % F == 1 and d != e:
|
|
|
|
+ break
|
|
|
|
+message = input('Введите сообщение: ')
|
|
|
|
+
|
|
|
|
+enc_set = [ord(char) for char in message]
|
|
|
|
+
|
|
|
|
+# Шифрование
|
|
|
|
+rsa_enc = [pow(char, e, N) for char in enc_set]
|
|
|
|
+rsa_enc_text = ''.join(chr(char) for char in rsa_enc)
|
|
|
|
+print('Зашифрованное сообщение: ', rsa_enc_text)
|
|
|
|
+
|
|
|
|
+# Дешифрование
|
|
|
|
+decryption = [pow(char, d, N) for char in rsa_enc]
|
|
|
|
+decryption_set = ''.join(chr(char) for char in decryption)
|
|
|
|
+print('Расшифрованное сообщение: ', decryption_set)
|