C#PKCS签名

时间:2010-08-26 14:23:38

标签: c# digital-signature pkcs#7

我开发了一个需要签名文件的系统。我已经有一个函数接收要签名的数据的byte []和X509证书,并使用System.Security.Cryptography.Pkcs命名空间计算签名。重要的是要注意我们需要签名,所以为了验证我们使用文件,附加签名和证书。

问题是这个函数返回一个byte []作为签名。现在为了序列化它我使用Base64编码,但我看到标准是使用.p7s文件。

那么,如何从dettached签名的byte []生成.p7s文件?

另一个问题是,有没有办法在签名上添加时间戳然后检索它?

谢谢! 涓

2 个答案:

答案 0 :(得分:0)

p7s是一个独立的PKCS#7签名本身。它可以(可选)base64编码,就是这样,没有其他格式需要应用。

是的,您可以为PKCS#7签名添加时间戳。您需要阅读RFC 3161并自行实现。您可以使用我们的SecureBlackbox产品的PKI components。我们的组件允许您使用PKCS#7和CMS(PKCS#7的扩展和后代)对数据进行签名和时间戳。我不知道PKCS#7的自由时间戳客户端,尽管有些可能存在。

答案 1 :(得分:0)

现在可以使用X509Certificate2类

public static byte[] Sign(byte[] data, X509Certificate2 certificate)
{
    if(data == null)
        throw new ArgumentNullException("data");
    if(certificate == null)
        throw new ArgumentNullException("certificate");

    // setup the data to sign
    ContentInfo content = new ContentInfo(data);
    SignedCms signedCms = new SignedCms(content, false);
    CmsSigner signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, certificate);

    // create the signature
    signedCms.ComputeSignature(signer);
    return signedCms.Encode();
}