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专有内容的。