如何清洁X509认证文件

时间:2016-07-04 01:24:05

标签: c# .net x509certificate pkcs#7

我做了一个例程,用PKCS#7 X509证书签署一些专有的二进制文件。这个例程就像一个魅力:

    public static byte[] SignFile(X509Certificate2Collection certs, byte[] data, bool Tipo_A3 = false)
    {
        try
        {
            ContentInfo content = new ContentInfo(data);
            SignedCms signedCms = new SignedCms(content, false);
            if (VerifySign(data))
            {
                signedCms.Decode(data);
            }
            foreach (X509Certificate2 cert in certs)
            {

                CmsSigner signer = new CmsSigner( cert);
                signer.IncludeOption = X509IncludeOption.WholeChain;
                signer.SignerIdentifierType = SubjectIdentifierType.IssuerAndSerialNumber;

                signer.SignedAttributes.Add(new Pkcs9SigningTime(System.DateTime.Now));

                if (Type_A3 == true)
                {
                    signedCms.ComputeSignature(signer, false);
                }
                else
                {
                    signedCms.ComputeSignature(signer);
                }

            }
            return signedCms.Encode();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error: " + ex.Message);
            return null;
        }

    }

我的问题与RECOVER原始信息有关。 1Kb文件将在~8Kb文件中转换,因为该文件中有签名。

我需要在文件中读取没有签名/证书的数据,我的意思是,我需要在签名之前恢复原始数据 - 而且我不知道该怎么做它

我看到签名文件在其原始内容之前和之后都有字节(我使用带有" abcd"的微小TXT文件进行了测试),但是我很害怕考虑相同的提取原始数据之前和之后的数据长度。

我知道我使用此函数获取原始内容,其中DATA是签名文件:

 using System;
 using System.Collections.Generic;
 using System.Security.Cryptography.X509Certificates;
 using System.Security.Cryptography.Pkcs;
 using System.IO;
 using System.Windows.Forms;

     public static Int VerifyContentInfo(byte[] data)
        {
           try
           {
            SignedCms signed = new SignedCms();
            signed.Decode(data);
            signed.CheckSignature(true);

            return signed.ContentInfo.Content.Length

           }
             catch
           {
             return null;
           }

        }

问题:即使知道签名文件中原始数据的长度,使用.NET函数如何安全地定位和提取它?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

signed.ContentInfo.Content(其长度为你的值)是原始内容。