2016-04-27 133 views
1

我有一個帶時間戳的簽名。 我想解碼時間戳並解碼它的屬性。如何解碼來自數字PKCS7簽名的時間戳?

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; 
        } 


       } 
      } 

但我不明白我怎麼能解碼asnData.RawData

至少我需要的日期和驗證timstamp是正確的(它的簽名是有效的)

你有什麼想法或經驗? 謝謝

+0

'CheckSignature'方法不是你想要的嗎? –

+0

不,它沒有。 CheckSignature只檢查簽名。時間戳不參與此方法調用 – VoimiX

回答

2

時間戳只不過是一個反簽名(您的驗證屬性的簽名)。您可以查看SignerInfo結構中的計數器簽名。

signerInfo.CounterSignerInfos包含SignerInfo集合,將驗證碼簽名方案一起使用(可能是實現特定的)。如果您的時間戳基於RFC-3161,那麼它可能在其他地方。我曾與OID

發現它作爲一個未經認證的屬性下 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 
    } 
} 
+0

*時間戳只是一個反簽名(您的已驗證屬性的簽名)。* - 在RFC 3161時間戳的情況下,這幾乎爲真,但消息摘要簽名屬性不包含直接散列原始簽名,而代之以時間戳信息結構,該結構依次散列原始簽名幷包含附加時間戳相關數據。 – mkl

+0

OP使用的OID 1.2.840.113549.1.9.16.2.14用於標準時間戳,而1.3.6.1.4.1.311。*用於Microsoft專有內容。 – mkl