mirror of
https://github.com/hastagAB/Awesome-Python-Scripts.git
synced 2024-11-30 15:31:07 +00:00
87fa39dc4f
* Added RSA Algorithm * Update README.md * Create README.md * Update README.md * Add files via upload * Update README.md * Added RSA Algorithm Co-authored-by: Ayush Bhardwaj <classicayush@gmail.com>
186 lines
5.1 KiB
Python
186 lines
5.1 KiB
Python
"""
|
|
For more information on the algorithm, refer the following links:
|
|
|
|
https://www.di-mgt.com.au/rsa_alg.html
|
|
https://people.csail.mit.edu/rivest/Rsapaper.pdf
|
|
https://www.youtube.com/watch?v=wXB-V_Keiu8
|
|
|
|
"""
|
|
|
|
|
|
def isPrime(n):
|
|
prime = [True for i in range(n+1)]
|
|
p = 2
|
|
while p*p<=n:
|
|
if prime[p]==True:
|
|
for i in range(p*p,n+1,p):
|
|
prime[i]=False
|
|
p+=1
|
|
|
|
return prime[n]
|
|
|
|
|
|
def gcd(a,b):
|
|
while b!=0:
|
|
r = a%b
|
|
a=b
|
|
b=r
|
|
return a
|
|
|
|
def Multiplicative_inverse(a,b):
|
|
s1 = 1
|
|
s2 = 0
|
|
m = b
|
|
while b!=0:
|
|
q=a//b
|
|
r=a%b
|
|
a=b
|
|
b=r
|
|
s=s1-q*s2
|
|
s1=s2
|
|
s2=s
|
|
|
|
if s1<0:
|
|
s1+=m
|
|
|
|
return s1
|
|
|
|
def powermod(x,y,p):
|
|
res = 1
|
|
|
|
x = x%p
|
|
while (y>0):
|
|
|
|
if (y%2) == 1:
|
|
res = (res*x)%p
|
|
|
|
y = y//2
|
|
x = (x*x)%p
|
|
|
|
return res
|
|
|
|
if __name__ == '__main__':
|
|
while (True):
|
|
res = input('Do you want to enter prime numbers (y) or let the algorithm do it for you (n) or exit (e)? (y/n/e): ')
|
|
if res == 'y':
|
|
while True:
|
|
p = 13
|
|
p = int(input('Enter a prime number: '))
|
|
if isPrime(p):
|
|
break
|
|
else:
|
|
print(p,'is not a prime number')
|
|
continue
|
|
|
|
while True:
|
|
q = 17
|
|
q = int(input('Enter a different prime number: '))
|
|
if isPrime(q) and (p*q>26):
|
|
break
|
|
else:
|
|
print('Both the prime numbers are same!! or product of both the prime numbers is less than 26!!')
|
|
continue
|
|
|
|
n = p*q
|
|
phi_n = (p-1)*(q-1)
|
|
a = 19
|
|
while True:
|
|
a = int(input('Enter a number such that Greatest Common Divisor of that number with '+ str(phi_n) + ' is 1: '))
|
|
if gcd(a,phi_n)!=1:
|
|
continue
|
|
else:
|
|
break
|
|
|
|
b = Multiplicative_inverse(a,phi_n)
|
|
message = input('Enter the message to be encrypted (lower case): ')
|
|
message = message.lower()
|
|
|
|
encrypted_string = ""
|
|
encrypted_num = []
|
|
|
|
for i in range(len(message)):
|
|
ch = message[i]
|
|
if ch!=' ':
|
|
m = ord(ch) - 97
|
|
e = powermod(m,a,n)
|
|
encrypted_num.append(e)
|
|
encrypted_string += chr(e%26 + 97)
|
|
else:
|
|
encrypted_string +=' '
|
|
|
|
print('Encrypted message is:', encrypted_string)
|
|
print(encrypted_num)
|
|
res = input("Do you want to decrypt it too? (y/n): ")
|
|
if res == 'y':
|
|
decrypted = ''
|
|
j=0
|
|
for i in range(len(encrypted_string)):
|
|
ch = message[i]
|
|
if ch != ' ':
|
|
e = encrypted_num[j]
|
|
m = powermod(e,b,n)
|
|
ch = chr(m+97)
|
|
decrypted+=ch
|
|
j+=1
|
|
else:
|
|
decrypted+=' '
|
|
|
|
print("Decrypted message is:",decrypted)
|
|
else:
|
|
ans = input("Do you want to continue? (y/n): ")
|
|
if ans == 'y':
|
|
continue
|
|
else:
|
|
break
|
|
|
|
elif res == 'n':
|
|
p = 13
|
|
q = 17
|
|
n = p*q
|
|
a = 5
|
|
b = 77
|
|
message = input('Enter the message to be encrypted (lower case): ')
|
|
message = message.lower()
|
|
|
|
encrypted_string = ""
|
|
encrypted_num = []
|
|
|
|
for i in range(len(message)):
|
|
ch = message[i]
|
|
if ch!=' ':
|
|
m = ord(ch) - 97
|
|
e = powermod(m,a,n)
|
|
encrypted_num.append(e)
|
|
encrypted_string += chr(e%26 + 97)
|
|
else:
|
|
encrypted_string +=' '
|
|
|
|
print('Encrypted message is:', encrypted_string)
|
|
res = input("Do you want to decrypt it too? (y/n): ")
|
|
if res == 'y':
|
|
decrypted = ''
|
|
j=0
|
|
for i in range(len(encrypted_string)):
|
|
ch = encrypted_string[i]
|
|
if ch != ' ':
|
|
e = encrypted_num[j]
|
|
m = powermod(e,b,n)
|
|
ch = chr(m+97)
|
|
decrypted+=ch
|
|
j+=1
|
|
else:
|
|
decrypted+=' '
|
|
|
|
print("Decrypted message is:",decrypted)
|
|
else:
|
|
ans = input("Do you want to continue? (y/n): ")
|
|
if ans == 'y':
|
|
continue
|
|
else:
|
|
break
|
|
elif res == 'e':
|
|
break
|
|
else:
|
|
print('Invalid command!')
|
|
continue
|