1
+ # !!! not built for production, only a pseudo random prime generator and low prime numbers
2
+ import sympy
3
+
4
+
5
+ A = 50
6
+
7
+ def generate_key_pair ():
8
+ p = sympy .randprime (A , 4 * A )
9
+ q = sympy .randprime (A , 4 * A )
10
+
11
+ n = p * q
12
+ phi = (p - 1 ) * (q - 1 )
13
+
14
+ e = 65537
15
+
16
+ d = pow (e , - 1 , phi )
17
+ # (e*d)%phi = 1
18
+
19
+ public_key = (n , e )
20
+ private_key = (p , q , d )
21
+
22
+ return public_key , private_key
23
+
24
+ def encrypt (key , raw_text ):
25
+ n = key [0 ]
26
+ e = key [1 ]
27
+ encrypted_text = ""
28
+
29
+ for char in raw_text :
30
+ intchar = ord (char )
31
+ encrypted_text += chr (intchar ** e % n )
32
+
33
+ return encrypted_text
34
+
35
+ def decrypt (key , enc_text ):
36
+ n = key [0 ]* key [1 ]
37
+ d = key [2 ]
38
+ decrypted_text = ""
39
+
40
+ for char in enc_text :
41
+ intchar = ord (char )
42
+ decrypted_text += chr (intchar ** d % n )
43
+
44
+ return decrypted_text
45
+
46
+
47
+
48
+ if __name__ == "__main__" :
49
+ # TEST CASES
50
+ ka_public , ka_private = generate_key_pair ()
51
+ kb_public , kb_private = generate_key_pair ()
52
+
53
+ raw_text = "Hello World!"
54
+ encrypt_msg = encrypt (ka_public , raw_text )
55
+ decrypt_msg = decrypt (ka_private , encrypt_msg )
56
+ assert raw_text == decrypt_msg
57
+ print (raw_text , encrypt_msg , decrypt_msg )
58
+
59
+ raw_text = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/*-+.^'"
60
+ encrypt_msg = encrypt (kb_public , raw_text )
61
+ decrypt_msg = decrypt (kb_private , encrypt_msg )
62
+ assert raw_text == decrypt_msg
63
+ print (raw_text , encrypt_msg , decrypt_msg )
0 commit comments