Почему PyCrypto не позволяет кодировать с закрытым и декодировать с открытым ключом для проверки личности отправителя - PullRequest
0 голосов
/ 29 декабря 2018

Я поигрался с библиотекой PyCrypto с целью создать систему, которая будет работать следующим образом:

  1. Создать набор ключей RSA для отправителя и получателя, а также отдельный ключ AES
  2. Отправитель:
    1. Шифрует сообщение с помощью ключа AES с использованием режима шифрования ECB. ECB
    2. Шифрует ключ AES с помощью закрытого ключа отправителя
    3. Concatsих собственное имя к результату последнего шага
    4. Шифрует результат последнего шага с открытым ключом получателя
    5. Объединяет результаты шагов 1 и 4 в 1 сообщение и отправляет егоПолучатель
  3. И получатель
    1. Разбивает сообщение на фактическое сообщение и двойной зашифрованный ключ (который также содержит имя отправителя)
    2. Расшифровываетдвойной зашифрованный ключ с использованием собственного закрытого ключа
    3. Использует имя отправителя для получения открытого ключа отправителя
    4. Расшифровывает ключ AES с открытым отправителем kэй
    5. Расшифровывает сообщение с помощью ключа 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 в обратном направлении или альтернативный способ проверки личности отправителя?

1 Ответ

0 голосов
/ 30 декабря 2018

альтернативный способ проверки личности отправителя

Может ли это быть цифровая подпись ?Он поддерживается PyCryptodome и использует RSA .

...