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:
Chinmay Rane 2020-03-25 16:41:34 +05:30 committed by GitHub
parent 09b7c22c26
commit 87fa39dc4f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 211 additions and 0 deletions

View File

@ -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
View 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)

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

View 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