-
Notifications
You must be signed in to change notification settings - Fork 0
/
tempCodeRunnerFile.python
115 lines (92 loc) · 2.45 KB
/
tempCodeRunnerFile.python
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import random
# function to generate keys
def generate_keypair(p, q, f, n):
# choose an integer e such that e and f(n) are coprime
e = random.randrange(2, f)
# verify that e and f(n) are comprime
g = gcd(e, f)
while g != 1:
e = random.randrange(2, f)
g = gcd(e, f)
# use Extended Euclid's Algorithm to generate the private key
d = modular_inverse(e, f)
# return public and private keypair
return ((e, n), (d, n))
# function to check prime
def isPrime(i):
for j in range(2, i):
if(i % j == 0):
return False
return True
# function to calcuate gcd
def gcd(a, b):
if b == 0:
return a
else:
return gcd(b, a % b)
# function to calculate inverse of e using Extended Eculidean Method
def modular_inverse(a, m):
m0 = m
y = 0
x = 1
if m == 1:
return 0
while a > 1:
q = a // m
t = m
m = a % m
a = t
t = y
y = x - q * y
x = t
if x < 0:
x = x + m0
return x
# encryption & decryption : cipher text c = m^e mod n ; plain text d= c^d mod n
def encrypt(publicKey, message):
e, n = publicKey
# converts each letter in the plaintext to numbers based on the character using a^b mod m
c = [(ord(char) ** e) % n for char in message]
return c
def decrypt(privateKey, message):
d, n = privateKey
# generates the plaintext based on the ciphertext and key using a^b mod m
p = [chr((char ** d) % n) for char in message]
# Return the array
return ''.join(p)
# validates if entered p,q are prime
while True:
try:
p = int(input('Enter the value of prime number p = '))
except ValueError:
print("InValid Input")
continue
if not isPrime(p):
print("Enter a prime number")
continue
else:
break
while True:
try:
q = int(input('Enter the value of prime number q = '))
except ValueError:
print("InValid Input")
continue
if not isPrime(q):
print("Enter a prime number")
continue
else:
break
n = p * q
# calculates f(n)
f = (p - 1) * (q - 1)
publicKey, privateKey = generate_keypair(p, q, f, n)
m = input('Enter the message m = ')
print('Public Key [e,n] = ', publicKey)
# Encrypt
c = encrypt(publicKey, m)
# Decrypt
m = decrypt(privateKey, c)
print('Cipher text = ', c)
print('Private Key [d,n] = ', privateKey)
print('Plain text after decryption = ', m)