将CmsEnvelopedData与CmsSignedData一起使用以验证签名数据

时间:2015-06-09 21:26:48

标签: c# cryptography bouncycastle

我正在接收来自第三方的签名和加密内容。我告知消息结构是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实例并验证消息感到困惑。

0 个答案:

没有答案