C# 如何从数字PKCS7签名中解码时间戳?

C# 如何从数字PKCS7签名中解码时间戳?,c#,cryptography,timestamp,digital-signature,C#,Cryptography,Timestamp,Digital Signature,我有一个带时间戳的签名。 我试图解码时间戳并解码其属性 var contentInfo = new ContentInfo(Convert.FromBase64String(data)); var signedCms = new SignedCms(contentInfo, true); signedCms.Decode(Convert.FromBase64String(signature)); signedCms.Ch

我有一个带时间戳的签名。 我试图解码时间戳并解码其属性

 var contentInfo = new ContentInfo(Convert.FromBase64String(data));
            var signedCms = new SignedCms(contentInfo, true);

            signedCms.Decode(Convert.FromBase64String(signature));
            signedCms.CheckSignature(true);


            foreach (var signerInfo in signedCms.SignerInfos)
            {
                foreach (var unsignedAttribute in signerInfo.UnsignedAttributes)
                {

                    if (unsignedAttribute.Oid.Value == "1.2.840.113549.1.9.16.2.14")
                    {
                        AsnEncodedData asnData = unsignedAttribute.Values[0];

                        byte[] asnBinary = asnData.RawData;
                    }


                }
            }
但是我不明白我如何解码asnda.RawData

至少我需要获取日期并验证timstamp是否正确(其签名是否有效)

你有什么想法或想法吗?
谢谢

时间戳只不过是一个反签名(已验证属性的签名)。您需要查看
SignerInfo
结构中的计数器签名

signerinfos.CounterSignerInfos
包含
signerInfo
的集合,将由大多数验证码签名方案使用(可能是特定于实现的)。如果您的时间戳基于RFC-3161,那么它可能在其他地方。我在ID为的
SignerInfo.UnsignedAttributes
属性下发现它是未经身份验证的属性

1.3.6.1.4.1.311.3.3.1

使用此OID,您可以轻松地找到时间戳

foreach (CryptographicAttributeObject cryptoAttribute in primarySigner.UnsignedAttributes)
{
    if (cryptoAttribute.Oid.Value == szOID_RFC3161_TIMESTAMP.Value)
    {
        Pkcs9AttributeObject rfcTimestampObj = new Pkcs9AttributeObject(cryptoAttribute.Values[0]);
        //Decode the attribute
        SignedCms rfcTimestampMessage = new SignedCms();
        rfcTimestampMessage.Decode(rfcTimestampObj.RawData);
        //At this point you are obtained the timestamp message as a SignedCMS object - rfcTimestampMessage.SignerInfos.Count > 1
    }
}

CheckSignature
方法是否已经满足了您的要求?不,它没有。CheckSignature只检查签名。此方法不涉及Timestap调用时间戳,它只是一个计数器签名(已验证属性的签名)。-对于RFC 3161时间戳,这几乎是正确的,但消息摘要签名属性不会直接散列原始签名,而是一个时间戳信息结构,该结构反过来散列原始签名并包含额外的时间戳相关数据。OP使用的OID 1.2.840.113549.1.9.16.2.14用于标准时间戳而1.3.6.1.4.1.311.*是针对Microsoft专有内容的。