【问题标题】:Decrypt gpg file attached from email (file.pgp)解密从电子邮件附加的 gpg 文件 (file.pgp)
【发布时间】:2012-10-05 17:12:52
【问题描述】:

我正在使用 email.Message 类和 gnupg 库来:

1 - 解析从 Twisted imap4 客户端获取的电子邮件字符串。

2 - 获取附件,一个 .pgp

3 - 解密它。

我可以解密典型的邮件内容,如:

-----BEGIN PGP MESSAGE-----
Version: PGP 9
(...)
-----END PGP MESSAGE-----

但依恋的事情真的让我的生活变得地狱。

嗯,我尝试了很多不同的方法,但最合乎逻辑的应该是这样的:

message = email.message_from_string(content)
if message.is_multipart():
    attachment = message.get_payload(1)
    gpg = gnupg.GPG(gnupghome=settings.PGP_PATH)
    return gpg.decrypt_file(attachment.get_payload(), passphrase=settings.PGP_PASSPH)

附件 var 第一行是:

From nobody Mon Oct 15 18:54:12 2012
Content-type: application/octet-stream; 
 name="No_Norm_AMLT_908_1210201201.txt.pgp"
Content-Disposition: attachment; filename="No_Norm_AMLT_908_1210201201.txt.pgp"
Content-Transfer-Encoding: base64

然后是所有加密的东西。

无论如何...这真的很奇怪,有些东西我不明白。如果我从普通邮件客户端软件(即 Thunderbird)下载附件,我会得到一个看起来像二进制的 .pgp 文件(如果我用纯文本编辑器编辑它会出现奇怪的字符),我可以使用 bash 命令对其进行解密:

gpg --decrypt No_Norm_AMLT_908_1210201201.txt.pgp

我不知道如何使用 email.Message 类和 gnupg 获得相同的结果(文件解密),我尝试将附件的有效负载保存到文件中,这与从 Thunderbird 下载的不同,我不能解密,我也试过把它放到StringIO中,也用base64编码。

我从 gpg 得到的信息是:

[GNUPG:] NODATA 1
[GNUPG:] NODATA 2
gpg: decrypt_message failed: eof

谢谢!

【问题讨论】:

    标签: python email-attachments gnupg


    【解决方案1】:

    好的解决了!我不得不:

    base64.decodestring(attachment.get_payload())
    

    然后使用 gpg 解密它,然后工作。这个可以看出来是因为header:

    Content-Transfer-Encoding: base64
    

    最终代码为:

    message = email.message_from_string(content)
    if message.is_multipart():
        attachment = message.get_payload(1)
        gpg = gnupg.GPG(gnupghome=settings.PGP_PATH)
        return gpg.decrypt_file(base64.decodestring(attachment.get_payload()),
                                passphrase=settings.PGP_PASSPH)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 2020-06-04
      • 1970-01-01
      相关资源
      最近更新 更多