解密从电子邮件附加GPG文件(file.pgp)(Decrypt gpg file attached

2019-09-24 04:08发布

我使用email.Message类的GnuPG库:

1 - 解析电子邮件字符串从扭曲的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

然后将所有加密的东西。

反正......这真的很奇怪,有些事我不明白。 如果我下载从正常的邮件客户端软件(如雷鸟)附件我得到的似乎二进制(奇怪的字符,如果我用一个简单的文本编辑器编辑它出现),我可以使用bash命令解密它.pgp文件:

gpg --decrypt No_Norm_AMLT_908_1210201201.txt.pgp

我不知道如何得到相同的结果使用email.Message类的GnuPG(文件解密),我试图将附件保存到一个文件中的有效载荷,这是从一个雷鸟下载的,我可以在不同的“T解密,我也试图把它变成一个StringIO的,也与Base64编码它。

我从GPG得到的消息是:

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

谢谢!

Answer 1:

好解决了! 我不得不:

base64.decodestring(attachment.get_payload())

然后用GPG解密,并且工作。 这可以想通,因为头出来:

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)


文章来源: Decrypt gpg file attached from email (file.pgp)