mirror of
https://github.com/hastagAB/Awesome-Python-Scripts.git
synced 2024-11-23 20:11:07 +00:00
Added RSA Algorithm used in cryptography (#61)
* 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>
This commit is contained in:
parent
09b7c22c26
commit
87fa39dc4f
|
@ -67,6 +67,7 @@ So far, the following projects have been integrated to this repo:
|
|||
|[Youtube video downloader](https://github.com/hastagAB/Awesome-Python-Scripts/tree/master/Youtube_Video_Downloader)|[Christopher He](https://github.com/hecris)|
|
||||
|[Zabbix API](https://github.com/hastagAB/Awesome-Python-Scripts/tree/master/zabbix_api)|[msg4sunny](https://github.com/msg4sunny)|
|
||||
|[Zip password cracker](https://github.com/hastagAB/Awesome-Python-Scripts/tree/master/zip_password_cracker)|[umar abdullahi](https://github.com/umarbrowser)|
|
||||
|[RSA Algorithm](https://github.com/hastagAB/Awesome-Python-Scripts/tree/master/RSA_Algorithm)|[Chinmay Rane](https://github.com/Chinmayrane16)
|
||||
|[CLI Calculator](https://github.com/hastagAB/Awesome-Python-Scripts/tree/master/cli_calculator)|[Willian GL](https://github.com/williangl) |
|
||||
|[Find PhoneNumber in String](https://github.com/hastagAB/Awesome-Python-Scripts/tree/master/Find-PhoneNumber-in-String)|[Austin Zuniga](https://github.com/AustinZuniga)|
|
||||
|[IMDB TV Series Info Extractor](https://github.com/hastagAB/Awesome-Python-Scripts/tree/master/imdb_episode_ratings)|[Yash Raj Sarrof](https://github.com/yashYRS) |
|
||||
|
|
25
RSA_Algorithm/README.md
Normal file
25
RSA_Algorithm/README.md
Normal file
|
@ -0,0 +1,25 @@
|
|||
# RSA Algorithm
|
||||
* Python script that encrypts and decrypts a text based on [RSA algorithm](https://people.csail.mit.edu/rivest/Rsapaper.pdf)
|
||||
* It involves the concept of modular arithmatic and euler's theorem.
|
||||
* It is also based on the idea that factorizing large numbers requires years.
|
||||
* Here, the (a,n) are kept public and (p,q,b) are kept private.
|
||||
|
||||
![](https://github.com/Chinmayrane16/Awesome-Python-Scripts/blob/master/RSA_Algorithm/RSA_Algorithm.png)
|
||||
|
||||
## Usage
|
||||
For Windows users:
|
||||
|
||||
```bash
|
||||
$ python RSA_Algorithm.py
|
||||
```
|
||||
|
||||
For Mac/Linux/Unix users:
|
||||
|
||||
```bash
|
||||
$ ./RSA_Algorithm.py
|
||||
```
|
||||
|
||||
## References
|
||||
[Blog](https://www.di-mgt.com.au/rsa_alg.html) <br>
|
||||
[Paper](https://people.csail.mit.edu/rivest/Rsapaper.pdf) <br>
|
||||
[Video](https://www.youtube.com/watch?v=wXB-V_Keiu8)
|
BIN
RSA_Algorithm/RSA_Algorithm.png
Normal file
BIN
RSA_Algorithm/RSA_Algorithm.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 82 KiB |
185
RSA_Algorithm/RSA_algorithm.py
Normal file
185
RSA_Algorithm/RSA_algorithm.py
Normal file
|
@ -0,0 +1,185 @@
|
|||
"""
|
||||
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
|
Loading…
Reference in New Issue
Block a user