我正在接收来自第三方的签名和加密内容。我告知消息结构是PKCS7(1.2.840.113549.1.7.4 - SignedAndEnvelopedData)。
我已使用以下代码成功解密了邮件内容:
var message = File.ReadAllBytes(@"C:\PKI\receivedMessage");
var cmsEnvelopedData = new CmsEnvelopedData(message);
var recipients = cmsEnvelopedData.GetRecipientInfos();
var cert = GetPfxFileCertFromDisk();
var privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(TransformRSAPrivateKey(cert.PrivateKey));
var privateKey = privateKeyInfo.ToAsn1Object().GetDerEncoded();
var myPrivateKey = PrivateKeyFactory.CreateKey(privateKey);
var decryptedMessage = string.Empty;
foreach (RecipientInformation recipientInfo in recipients.GetRecipients())
{
byte[] data = recipientInfo.GetContent(myPrivateKey);
decryptedMessage = Encoding.ASCII.GetString(data);
}
但是我确实要对Bouncy Castle EnvelopedData类进行修改......
public EnvelopedData(
Asn1Sequence seq)
{
int index = 0;
version = (DerInteger) seq[index++];
object tmp = seq[index++];
if (tmp is Asn1TaggedObject)
{
originatorInfo = OriginatorInfo.GetInstance((Asn1TaggedObject) tmp, false);
tmp = seq[index++];
}
recipientInfos = Asn1Set.GetInstance(tmp);
index++; // ADDED THIS LINE to Bouncy Castle implementation
encryptedContentInfo = EncryptedContentInfo.GetInstance(seq[index++]);
if (seq.Count > index)
{
unprotectedAttrs = Asn1Set.GetInstance((Asn1TaggedObject) seq[index], false);
}
}
根据RFC 5652,我们收到的消息结构似乎不是CMSEvelopedData,因此添加了额外的索引++以便成功解析。
我添加了额外的索引++来跳过包含标记为ASN.1 1.3.14.3.2.26(SHA-1)的内容的ASNSequence中的项目,但是没有实际的哈希内容。
值得注意的是,ASN1Sequence还包含一个包含签名者信息的项目。我可以将它解析为SignerInformationStore类的一个实例。
从这里开始,我不确定如何验证邮件签名?我已经研究了使用CmsSignedData类的示例,但是我仍然对如何创建CmsSignedData实例并验证消息感到困惑。