Skip to content

Commit 66c1b0e

Browse files
committed
Added new algo for RSA
* Used in cryptography, the RSA algorithm is known for its complexity in terms of factoring large prime numbers
1 parent dba8eec commit 66c1b0e

File tree

1 file changed

+120
-0
lines changed

1 file changed

+120
-0
lines changed

other/RSA_Algo/rsa_algo.py

+120
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
import random
2+
from sympy import isprime, mod_inverse
3+
import sys
4+
5+
def generate_prime_candidate(length):
6+
"""
7+
Generate a large prime number candidate.
8+
9+
>>> p = generate_prime_candidate(16)
10+
>>> isprime(p)
11+
True
12+
"""
13+
p = random.getrandbits(length)
14+
while not isprime(p):
15+
p = random.getrandbits(length)
16+
return p
17+
18+
def generate_keys(keysize):
19+
"""
20+
Generate RSA keys.
21+
22+
>>> public, private = generate_keys(16)
23+
>>> len(bin(public)) - 2 # Check bit length of n
24+
32
25+
>>> len(bin(private)) - 2 # Check bit length of n
26+
32
27+
"""
28+
try:
29+
e = d = n = 0
30+
31+
p = generate_prime_candidate(keysize)
32+
q = generate_prime_candidate(keysize)
33+
34+
n = p * q
35+
phi = (p - 1) * (q - 1)
36+
37+
e = random.randrange(1, phi)
38+
g = gcd(e, phi)
39+
while g != 1:
40+
e = random.randrange(1, phi)
41+
g = gcd(e, phi)
42+
43+
d = mod_inverse(e, phi)
44+
45+
return ((e, n), (d, n))
46+
except Exception as ex:
47+
print(f"Error generating keys: {ex}", file=sys.stderr)
48+
sys.exit(1)
49+
50+
def gcd(a, b):
51+
"""
52+
Compute the greatest common divisor of a and b.
53+
54+
>>> gcd(48, 18)
55+
6
56+
"""
57+
while b != 0:
58+
a, b = b, a % b
59+
return a
60+
61+
def encrypt(pk, plaintext):
62+
"""
63+
Encrypt a message with a public key.
64+
65+
>>> public, private = generate_keys(16)
66+
>>> encrypted = encrypt(public, "test")
67+
>>> isinstance(encrypted, list)
68+
True
69+
"""
70+
try:
71+
key, n = pk
72+
cipher = [(ord(char) ** key) % n for char in plaintext]
73+
return cipher
74+
except Exception as ex:
75+
print(f"Error during encryption: {ex}", file=sys.stderr)
76+
return None
77+
78+
def decrypt(pk, ciphertext):
79+
"""
80+
Decrypt a message with a private key.
81+
82+
>>> public, private = generate_keys(16)
83+
>>> encrypted = encrypt(public, "test")
84+
>>> decrypted = decrypt(private, encrypted)
85+
>>> decrypted == "test"
86+
True
87+
"""
88+
try:
89+
key, n = pk
90+
plain = [chr((char ** key) % n) for char in ciphertext]
91+
return ''.join(plain)
92+
except Exception as ex:
93+
print(f"Error during decryption: {ex}", file=sys.stderr)
94+
return None
95+
96+
if __name__ == '__main__':
97+
import doctest
98+
doctest.testmod()
99+
100+
try:
101+
keysize = 1024
102+
public, private = generate_keys(keysize)
103+
104+
message = "Hello, RSA!"
105+
print("Original message:", message)
106+
107+
encrypted_msg = encrypt(public, message)
108+
if encrypted_msg:
109+
print("Encrypted message:", encrypted_msg)
110+
111+
decrypted_msg = decrypt(private, encrypted_msg)
112+
if decrypted_msg:
113+
print("Decrypted message:", decrypted_msg)
114+
else:
115+
print("Decryption failed.", file=sys.stderr)
116+
else:
117+
print("Encryption failed.", file=sys.stderr)
118+
except Exception as ex:
119+
print(f"An error occurred: {ex}", file=sys.stderr)
120+
sys.exit(1)

0 commit comments

Comments
 (0)