Я обнаружил свой 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();
}
}
data
? Держу пари, что это неподходящий контент для этого. Разберите сообщение с помощьюMimeMessage.Load()
, а затем найдитеApplicationPkcs7Mime
BodyPart
для проверки. Проверьте модульные тесты в репозитории MimeKit на github, чтобы увидеть примеры. - person jstedfast   schedule 20.12.2017data
было вложением p7m, которое сначала считывалось как байт, а затем преобразовывалось вMemoryStream
для преобразования вApplicationPkcs7Mime
. - person codenamezero   schedule 20.12.2017