了解如何为S / MIME发送加密的AES密钥以及加密的电子邮件消息

时间:2018-03-30 11:10:33

标签: python-3.x encryption aes rsa smime

您好我需要建立一个邮件系统,我需要执行以下操作:

  • 生成AES 256密钥
  • 使用此aes-256密钥加密电子邮件
  • 使用收件人公钥加密aes-256密钥
  • 使用我的私钥签名电子邮件
  • 将所有这些发送给收件人

我一直关注this使用aes-256进行加密并使用我的私钥进行签名。但是我不知道如何使用RSA公钥加密aes-256密钥并将其发送到同一封电子邮件中。我正在看一个python方法,但是如果有人能指出我甚至是openssl命令行版本,我可以编写一个python包装器来实现同样的目的。

编辑:

我目前使用此方法使用AES 256通过S / MIME进行加密:

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()

1 个答案:

答案 0 :(得分:1)

您似乎正在使用已包含对S / MIME支持的M2Crypto。它会为您处理所有细节!它将执行加密和签名。您不必明确加密秘密并将其附加到邮件中。 M2Crypto为您做到这一点。