无法使用MimeKit解密p7m

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法使用MimeKit解密p7m相关的知识,希望对你有一定的参考价值。

我从我的电子邮件中找到了我的smime.p7m,我将其作为流读取并尝试使用MimeKit解密它,但它失败了Operation is not valid due to the current state of the object.

using (MemoryStream ms = new MemoryStream(data)) {
    CryptographyContext.Register(typeof(WindowsSecureMimeContext));
    ApplicationPkcs7Mime p7m = new ApplicationPkcs7Mime(SecureMimeType.EnvelopedData, ms);
    var ctx = new WindowsSecureMimeContext(StoreLocation.CurrentUser);
    p7m.Verify(ctx, out MimeEntity output);
}

https://github.com/jstedfast/MimeKit上的示例之后也无济于事。任何熟悉MimeKit的人都可以加入?

编辑:

在解密p7m之后,我是否应该使用MimeParser来解析内容?我从解密中得到以下内容:

Content-Type: application/x-pkcs7-mime; name=smime.p7m; smime-type=signed-data
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=smime.p7m

MIAGCSqGSIb3DQEHAqCAMIACAQExCzAJBgUrDgMCGgUAMIAGCSqGSIb3DQEHAaCAJIAEWUNvbnRl
bnQtVHlwZTogdGV4dC9wbGFpbjsNCgljaGFyc2V0PSJ1cy1hc2NpaSINCkNvbnRlbnQtVHJhbnNm
ZXItRW5jb2Rpbmc6IDdiaXQNCg0KdGVzdA0KAAAAAAAAoIImTTCCBaIwggOKoAMCAQICBguC3JQz
...more...

但在用MimeParser解析时,

System.FormatException: Failed to parse message headers.
   at MimeKit.MimeParser.ParseMessage(Byte* inbuf, CancellationToken cancellationToken)
   at MimeKit.MimeParser.ParseMessage(CancellationToken cancellationToken)

更新:

啊,所以它转过来,调用Decrypt只给我SignedData,然后我需要调用Verify来拉取原始数据......这有点误导,我认为Verify只会验证它...这就是为什么我没有'打扰它,因为我真的不需要验证它...也许它应该调用Decode而不是?这就是我原本想做的事情,((MimePart) signedData).Content.DecodeTo(...)

所以最后,我必须做这样的事情来提取数据。

CryptographyContext.Register(typeof(WindowsSecureMimeContext));
ApplicationPkcs7Mime p7m = new ApplicationPkcs7Mime(SecureMimeType.EnvelopedData, ms);
var ctx = new WindowsSecureMimeContext(StoreLocation.CurrentUser);

if (p7m != null && p7m.SecureMimeType == SecureMimeType.EnvelopedData)
{
    // the top-level MIME part of the message is encrypted using S/MIME
    p7m = p7m.Decrypt() as ApplicationPkcs7Mime;
}


if (p7m != null && p7m.SecureMimeType == SecureMimeType.SignedData)
{
    p7m.Verify(out MimeEntity original);    // THE REAL DECRYPTED DATA
    using (MemoryStream dump = new MemoryStream())
    {
        original.WriteTo(dump);
        decrypted = dump.GetBuffer();
    }
}
答案

您收到InvalidOperationException,因为您在EncryptedData上调用Verify()。

你需要调用Decrypt()。

Verify()适用于SignedData。

以上是关于无法使用MimeKit解密p7m的主要内容,如果未能解决你的问题,请参考以下文章

如何使用公钥加密字符串并使用 MimeKit 使用私钥解密?

用于解密 SMIME.p7m 文件的 Javascript 库

MimeKit 附件正文编码问题

MimeKit:如何嵌入图像?

使用 Mailkit 和 Mimekit 收集 SMTP 服务器

MIMEKIT Multipart Signed.Verify 如何禁用证书吊销列表检查?