Понимание того, как отправить зашифрованный ключ AES вместе с зашифрованным сообщением электронной почты для S/MIME

Привет, мне нужно создать систему рассылки, в которой мне нужно сделать следующее:

  • Генерация ключа AES 256
  • Зашифровать электронную почту с помощью этого ключа aes-256
  • Зашифруйте ключ aes-256, используя открытый ключ получателя.
  • Подпишите письмо, используя мой закрытый ключ
  • Отправьте все это получателю

Я следил за этим, чтобы выполнить шифрование с помощью aes- 256 и подписать с помощью моего закрытого ключа. Однако я не знаю, как я могу зашифровать ключ aes-256 с помощью открытого ключа RSA и отправить его в том же электронном письме. Я смотрю на подход python, но если кто-то может указать мне даже на версию командной строки openssl, я могу написать оболочку python, чтобы добиться того же.

РЕДАКТИРОВАТЬ:

В настоящее время я использую этот метод для шифрования через S/MIME с использованием AES 256:

def sendsmime(from_addr, to_addrs, subject, msg, from_key, from_cert=None, to_certs=None):
msg_bio = BIO.MemoryBuffer(msg)
sign = from_key
encrypt = to_certs

s = SMIME.SMIME()
if sign:
    s.load_key(from_key, from_cert)
    p7 = s.sign(msg_bio, flags=SMIME.PKCS7_TEXT)
    msg_bio = BIO.MemoryBuffer(msg) # Recreate coz sign() has consumed it.

if encrypt:
    sk = X509.X509_Stack()
    for x in to_certs:
        sk.push(X509.load_cert(x))
    s.set_x509_stack(sk)
    s.set_cipher(SMIME.Cipher('aes_256_cbc'))
    tmp_bio = BIO.MemoryBuffer()
    if sign:
        s.write(tmp_bio, p7)
    else:
        tmp_bio.write(msg)
    p7 = s.encrypt(tmp_bio)

out = BIO.MemoryBuffer()
out.write('From: %s\r\n' % from_addr)
out.write('To: %s\r\n' % to_addrs)
out.write('Subject: %s\r\n' % subject) 
if encrypt:
    s.write(out, p7)
else:
    if sign:
        s.write(out, p7, msg_bio, SMIME.PKCS7_TEXT)
    else:
        out.write('\r\n')
        out.write(msg)
out.close()

smtp = smtplib.SMTP()
smtp.connect('smtp.provider.net', 587)
smtp.login('username', 'password')
smtp.sendmail(from_addr, to_addrs, out.read())
smtp.quit()

person Projjol    schedule 30.03.2018    source источник
comment
Покажите, что вы пробовали. Ваш вопрос слишком широк в настоящее время.   -  person Luke Joshua Park    schedule 30.03.2018
comment
@LukeJoshuaPark обновлен методом, который я использую, могу ли я добавить что-то еще?   -  person Projjol    schedule 30.03.2018


Ответы (1)


Похоже, вы используете M2Crypto, который уже включает поддержку S/MIME. Он позаботится обо всех деталях за вас! Он будет выполнять шифрование и подпись. Вам не нужно явно шифровать секрет и прикреплять его к сообщению. M2Crypto сделает это за вас.

person Erwan Legrand    schedule 30.03.2018