无法使用MimeKit解密p7m

时间:2017-12-19 20:39:54

标签: c# cryptography smime mimekit

我已经从我的电子邮件中找到了我的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来提取原始数据......这有点误导,我想{{1只会验证它...这就是为什么我没有打扰它,因为我真的不需要验证它......也许应该调用Verify而不是?这就是我原本想要做的事情,Decode

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

((MimePart) signedData).Content.DecodeTo(...)

1 个答案:

答案 0 :(得分:3)

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

你需要调用Decrypt()。

Verify()适用于SignedData。