【问题标题】:M2Crypto: Trying to decrypt SMIME string. Getting no content type ErrorM2Crypto:试图解密 SMIME 字符串。没有内容类型错误
【发布时间】:2018-10-23 14:28:30
【问题描述】:

我正在尝试解密 SMIME 加密消息(使用 PKI.js 库在 JavaScript 中加密),如下所示:

Content-Type: application/pkcs7-mime; name=smime.p7m;
 smime-type=enveloped-data
Content-Description: Enveloped Data
Content-Disposition: attachment; filename=smime.p7m
Content-Transfer-Encoding: base64
From: sender@example.com
To: recipient@example.com
Subject: Example S/MIME encrypted message
Date: Sun, 13 May 2018 23:53:48 +0000
Message-Id: <1526255628125-055f663b-fd554ae9-1ed33cf1@example.com>
MIME-Version: 1.0

MIIBzAYJKoZIhvcNAQcDoIIBvTCCAbkCAQIxggFuMIIBagIBADAjMB4xHDAJBgNVBAYTAlJVMA8G
A1UEAx4IAFQAZQBzAHQCAQEwPAYJKoZIhvcNAQEHMC+gDzANBglghkgBZQMEAgMFAKEcMBoGCSqG
SIb3DQEBCDANBglghkgBZQMEAgMFAASCAQA6EIOlgaYQ1/wYJe4DfZ5EDMLvCFbkj1h3CPtCsw7A
dKDdQAO1Sn25T0yyAO5iaXkETUGX2DGEqzOFspROrXObiuk4vLu0/D78780FhU59ybLY41m4ydT3
Dxpz3+2e3aRgfP2qnwG0WepIe14OWQWTZwtvRRrsh3AhjE9NAQik1MicPA8mTlQYKge6FEFbRvzu
+PNXht9bn/a+asSrPJleesST+srGm6/lllmTMOtqcGp5aelkQwCQ/aHJJ9HTSYtg8TAb4N78o00C
YJrhMrsKygJSC65VGV2BDbsbyBIhuiIdrCWx3JNoaKd2N6uix8V0UCHZHkzXnEduL5RH9SWdMIAG
CSqGSIb3DQEHATAdBglghkgBZQMEAQIEEGtZdxyVU9+8aONDzGlUjFuggAQQECObjBYnr23zUJ+6
60kRvAAAAAA=

我这样做的方式如下:

from M2Crypto import BIO, SMIME, X509

def decrypt(s):
    mime = SMIME.SMIME()

    with open("tmp.p7", 'wb') as f:
        f.write(s.encode('utf-8'))
        p7, data = SMIME.smime_load_pkcs7("tmp.p7")
    return mime.decrypt(p7)

我得到的是以下消息:

File "/Users/Adam/Library/Python/3.5/lib/python/site-packages/M2Crypto/SMIME.py", line 113, in smime_load_pkcs7
    p7_ptr, bio_ptr = m2.smime_read_pkcs7(bio)
M2Crypto.SMIME.SMIME_Error: no content type

如果我这样做了

with open("tmp.p7", 'w') as f:
            f.write(s)

相反,结果是一样的......没有内容类型错误消息。

有人可以帮帮我吗?

【问题讨论】:

  • 您是否尝试过先关闭文件f.close()
  • 是的,然后是M2Crypto.SMIME.PKCS7_Error: bad decrypt
  • 这可能是由于使用了错误的密钥。
  • 所以你认为问题不在于代码?

标签: python encryption m2crypto smime


【解决方案1】:

您正在查看的是完整的邮件消息,而不仅仅是 CMS 或 PKCS#7 内容

去掉邮件标头,直到只剩下 base 64 编码(从换行符开始),然后重试。


你可以看到你的数据here (online JavaScript ASN.1 decoder)

这些是非常新的算法(带有 MGF1 / SHA-512 和 AES 的 RSA-OAEP),但最终它们只加密了一个 16 字节的密文,实际上并没有以任何方式识别。所以从这个意义上说,内容类型缺失的,也许你可以以某种方式将其作为参数给出。

不作为评论发布,因为它不适合,您的数据在 URL 中。

【讨论】:

  • 感谢您的回答。你是这个意思? MIME-Version: 1.0 Content-Disposition: attachment; filename="smime.p7m" Content-Type: application/x-pkcs7-mime; name="smime.p7m" Content-Transfer-Encoding: base64 &lt;encoded content&gt;
  • 是的,尝试不使用 all 标头,包括 To: / Subject: 等。该函数的 OpenSSL 版本似乎接受 base 64,所以...
  • 当我尝试不使用标题时,只有加密的内容,它说no content type
  • 您可以尝试使用 OpenSSL 命令行解码为二进制文件。之后,我们将不得不解析输入以查看是否有任何问题。我试图避免这种情况:)
  • 嗯...我该怎么做?
猜你喜欢
  • 1970-01-01
  • 2012-06-04
  • 2023-03-11
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 2017-09-24
相关资源
最近更新 更多