Я поигрался с библиотекой PyCrypto с целью создать систему, которая будет работать следующим образом:
- Создать набор ключей RSA для отправителя и получателя, а также отдельный ключ AES
- Отправитель:
- Шифрует сообщение с помощью ключа AES с использованием режима шифрования ECB. ECB
- Шифрует ключ AES с помощью закрытого ключа отправителя
- Concatsих собственное имя к результату последнего шага
- Шифрует результат последнего шага с открытым ключом получателя
- Объединяет результаты шагов 1 и 4 в 1 сообщение и отправляет егоПолучатель
- И получатель
- Разбивает сообщение на фактическое сообщение и двойной зашифрованный ключ (который также содержит имя отправителя)
- Расшифровываетдвойной зашифрованный ключ с использованием собственного закрытого ключа
- Использует имя отправителя для получения открытого ключа отправителя
- Расшифровывает ключ AES с открытым отправителем kэй
- Расшифровывает сообщение с помощью ключа AES
Но у меня проблемы с двойным шифрованием.Проблема в том, что я не могу расшифровать что-то с открытым ключом, когда он зашифрован с помощью закрытого ключа.Я понимаю, что это потому, что ARS не должен работать в обратном направлении, но я хочу сделать это, чтобы проверить личность отправителя для получателя.Я не знаю, как еще это сделать.
Это текущий код (я знаю, что он грязный, я новичок в Python и совершенно новый для шифрования):
from Crypto import Random
from Crypto.PublicKey import RSA
from Crypto.Cipher import AES, PKCS1_OAEP
from termcolor import colored
import base64, os
def generate_keys_rsa():
modulus_length = 256*4
privatekey = RSA.generate(modulus_length, Random.new().read)
publickey = privatekey.publickey()
return privatekey, publickey
def encrypt_message_rsa(a_message, publickey):
encryptor = PKCS1_OAEP.new(publickey)
encrypted_msg = encryptor.encrypt(a_message)
encoded_encrypted_msg = base64.b64encode(encrypted_msg)
return encoded_encrypted_msg
def decrypt_message_rsa(encoded_encrypted_msg, privatekey):
decoded_msg = base64.b64decode(encoded_encrypted_msg)
decryptor = PKCS1_OAEP.new(privatekey)
decoded_decrypted_msg = decryptor.decrypt(decoded_msg)
return decoded_decrypted_msg
def generate_key_aes():
aes_key_length = 32
secret_key = os.urandom(aes_key_length)
encoded_secret_key = base64.b64encode(secret_key)
return encoded_secret_key
def encrypt_message_aes(private_msg, encoded_secret_key, padding_character):
secret_key = base64.b64decode(encoded_secret_key)
cipher = AES.new(secret_key, AES.MODE_ECB)
padded_private_msg = private_msg + (padding_character * ((16 - len(private_msg)) % 16))
encrypted_msg = cipher.encrypt(padded_private_msg.encode("utf-8"))
encoded_encrypted_msg = base64.b64encode(encrypted_msg)
return encoded_encrypted_msg
def decrypt_message_aes(encoded_encrypted_msg, encoded_secret_key, padding_character):
secret_key = base64.b64decode(encoded_secret_key)
cipher = AES.new(secret_key, AES.MODE_ECB)
encrypted_msg = base64.b64decode(encoded_encrypted_msg)
decrypted_msg = cipher.decrypt(encrypted_msg)
unpadded_private_msg = decrypted_msg.rstrip(padding_character)
return unpadded_private_msg.decode("ascii")
# PROCESS #
# 'rec' means 'received' #
# 'enc' means 'encrypted' #
# 'dec' means 'decrypted' #
# 'pad' means 'padding' #
# 'div' means 'division' #
# PROCESS #
raw_txt = input("Message to send: ")
txt = str(raw_txt)
pad_char = "{"
div_char = "|"
# ASSEMBLY #
privatekey0_RSA , publickey0_RSA = generate_keys_rsa()
privatekey1_RSA , publickey1_RSA = generate_keys_rsa()
key_AES = generate_key_aes()
enc_txt = encrypt_message_aes(txt, key_AES, pad_char)
enc_key = encrypt_message_rsa(key_AES, privatekey0_RSA)
msg = (
pad_char.encode("utf-8") +
div_char.encode("utf-8") +
enc_txt +
div_char.encode("utf-8") +
enc_key
)
# DISASSEMBLY #
rec_pad = msg[: 1]
rec_div = chr(msg[1])
rec_enc_txt = msg[2: (msg[2:].find(rec_div.encode("utf-8")) + 2)]
rec_enc_key = msg[(msg[2:].find(rec_div.encode("utf-8")) + 3):]
rec_dec_key = decrypt_message_rsa(rec_enc_key, publickey0_RSA)
rec_dec_txt = decrypt_message_aes(rec_enc_txt, rec_dec_key, rec_pad)
# RESULT LOG #
print()
print(colored("Total message: ", "blue", None, ["bold"]), "%s" % msg)
print()
print(colored(" Original key_AES: ", "blue", None, ["bold"]), "%s - (%d)" % (key_AES, len(key_AES)))
print(colored("Encrypted key_AES: ", "blue", None, ["bold"]), "%s - (%d)" % (enc_key, len(enc_key)))
print(colored("Decrypted key_AES: ", "blue", None, ["bold"]), "%s - (%d)" % (rec_dec_key, len(rec_dec_key)))
print(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"]))
print()
print(colored(" Original text: ", "blue", None, ["bold"]), "%s - (%d)" % (txt, len(txt)))
print(colored("Encrypted text: ", "blue", None, ["bold"]), "%s - (%d)" % (enc_txt, len(enc_txt)))
print(colored("Decrypted text: ", "blue", None, ["bold"]), "%s - (%d)" % (rec_dec_txt, len(rec_dec_txt)))
print(colored("Decrypted text == Original text: ", "blue", None, ["bold"]), colored("%s" % (rec_dec_txt == txt), "green" if (rec_dec_txt == txt) else "red", None, ["bold"]))
Итак, знаете ли вы решение использовать ARS в обратном направлении или альтернативный способ проверки личности отправителя?