· 7 years ago · Dec 29, 2018, 06:52 PM
1from Crypto import Random
2from Crypto.PublicKey import RSA
3from Crypto.Cipher import AES, PKCS1_OAEP
4from termcolor import colored
5import base64, os
6
7
8def generate_keys_rsa():
9 modulus_length = 256*4
10 privatekey = RSA.generate(modulus_length, Random.new().read)
11 publickey = privatekey.publickey()
12 return privatekey, publickey
13
14
15def encrypt_message_rsa(a_message, publickey):
16 encryptor = PKCS1_OAEP.new(publickey)
17 encrypted_msg = encryptor.encrypt(a_message)
18 encoded_encrypted_msg = base64.b64encode(encrypted_msg)
19 return encoded_encrypted_msg
20
21
22def decrypt_message_rsa(encoded_encrypted_msg, privatekey):
23 decoded_msg = base64.b64decode(encoded_encrypted_msg)
24 decryptor = PKCS1_OAEP.new(privatekey)
25 decoded_decrypted_msg = decryptor.decrypt(decoded_msg)
26 return decoded_decrypted_msg
27
28
29def generate_key_aes():
30 aes_key_length = 32
31 secret_key = os.urandom(aes_key_length)
32 encoded_secret_key = base64.b64encode(secret_key)
33 return encoded_secret_key
34
35
36def encrypt_message_aes(private_msg, encoded_secret_key, padding_character):
37 secret_key = base64.b64decode(encoded_secret_key)
38 cipher = AES.new(secret_key, AES.MODE_ECB)
39 padded_private_msg = private_msg + (padding_character * ((16 - len(private_msg)) % 16))
40 encrypted_msg = cipher.encrypt(padded_private_msg.encode("utf-8"))
41 encoded_encrypted_msg = base64.b64encode(encrypted_msg)
42 return encoded_encrypted_msg
43
44
45def decrypt_message_aes(encoded_encrypted_msg, encoded_secret_key, padding_character):
46 secret_key = base64.b64decode(encoded_secret_key)
47 cipher = AES.new(secret_key, AES.MODE_ECB)
48 encrypted_msg = base64.b64decode(encoded_encrypted_msg)
49 decrypted_msg = cipher.decrypt(encrypted_msg)
50 unpadded_private_msg = decrypted_msg.rstrip(padding_character)
51 return unpadded_private_msg.decode("ascii")
52
53
54# PROCESS #
55# 'rec' means 'received' #
56# 'enc' means 'encrypted' #
57# 'dec' means 'decrypted' #
58# 'pad' means 'padding' #
59# 'div' means 'division' #
60# PROCESS #
61
62raw_txt = input("Message to send: ")
63txt = str(raw_txt)
64
65pad_char = "{"
66div_char = "|"
67
68# ASSEMBLY #
69privatekey0_RSA , publickey0_RSA = generate_keys_rsa()
70privatekey1_RSA , publickey1_RSA = generate_keys_rsa()
71key_AES = generate_key_aes()
72
73enc_txt = encrypt_message_aes(txt, key_AES, pad_char)
74enc_key = encrypt_message_rsa(key_AES, privatekey0_RSA)
75
76msg = (
77 pad_char.encode("utf-8") +
78 div_char.encode("utf-8") +
79 enc_txt +
80 div_char.encode("utf-8") +
81 enc_key
82)
83
84# DISASSEMBLY #
85rec_pad = msg[: 1]
86rec_div = chr(msg[1])
87rec_enc_txt = msg[2: (msg[2:].find(rec_div.encode("utf-8")) + 2)]
88rec_enc_key = msg[(msg[2:].find(rec_div.encode("utf-8")) + 3):]
89rec_dec_key = decrypt_message_rsa(rec_enc_key, publickey0_RSA)
90rec_dec_txt = decrypt_message_aes(rec_enc_txt, rec_dec_key, rec_pad)
91
92# RESULT LOG #
93print()
94print(colored("Total message: ", "blue", None, ["bold"]), "%s" % msg)
95print()
96print(colored(" Original key_AES: ", "blue", None, ["bold"]), "%s - (%d)" % (key_AES, len(key_AES)))
97print(colored("Encrypted key_AES: ", "blue", None, ["bold"]), "%s - (%d)" % (enc_key, len(enc_key)))
98print(colored("Decrypted key_AES: ", "blue", None, ["bold"]), "%s - (%d)" % (rec_dec_key, len(rec_dec_key)))
99print(colored("Decrypted key_AES == Original key_AES: ", "blue", None, ["bold"]), colored("%s" % (rec_dec_key == key_AES), "green" if (rec_dec_key == key_AES) else "red", None, ["bold"]))
100print()
101print(colored(" Original text: ", "blue", None, ["bold"]), "%s - (%d)" % (txt, len(txt)))
102print(colored("Encrypted text: ", "blue", None, ["bold"]), "%s - (%d)" % (enc_txt, len(enc_txt)))
103print(colored("Decrypted text: ", "blue", None, ["bold"]), "%s - (%d)" % (rec_dec_txt, len(rec_dec_txt)))
104print(colored("Decrypted text == Original text: ", "blue", None, ["bold"]), colored("%s" % (rec_dec_txt == txt), "green" if (rec_dec_txt == txt) else "red", None, ["bold"]))