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)|
|
|[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)|
|
|[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)|
|
|[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) |
|
|[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)|
|
|[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) |
|
|[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