如何从使用ASN1编码的数字签名PE文件的Authenticode中提取签名者信息?

时间:2012-07-10 07:06:57

标签: c x509certificate x509 asn.1 authenticode

我需要从ASN1结构中经过数字签名的PE文件的SignerInfo中提取Authenticode

INFO:PE文件包含Security Directory RVAOptional Header Data Directories指定的偏移量的authenticode。 我试着在阅读Microsoft Authenticode PE Signature Format处提供的文件后开始尝试,但没有运气,因为我对SSL / TSL很新。

我的问题:

  1. 有没有办法解析二进制文件并以C字符串格式打印数据结构?

  2. 有什么方法可以解析给定的二进制文件并指向SignerInfoSignerName

  3. NOTE:我不想使用任何平台相关的API,因为我希望代码与平台无关。

    先谢谢所有大师: - )

    UPDATE:我在C#中找到了一个代码。有人会帮我找到相同的C等价物。

    using System;
    using System.IO;
    using System.Text;
    using System.Security.Cryptography.X509Certificates;
    
    public class CertInfo
    {
     public static void Main(String[] args)
     {
        byte[] certBytes;
        X509Certificate x509cert;
    
        while (true)
        {
            Console.WriteLine("\nEnter File Name: ");
            String filename = Console.ReadLine();
            if (filename == "")  //exit while(true) loop
                break;
            if (!File.Exists(filename))
            {
                Console.WriteLine("File \"{0}\" does not exist!\n", filename);
                continue;
            }
    
            try
            {             //try binary DER format first
                x509cert = X509Certificate.CreateFromCertFile(filename);
                showCertInfo(x509cert);
            }
    
            catch (System.Security.Cryptography.CryptographicException cryptder)
            { //not binary DER
                StreamReader sr = File.OpenText(filename);
                String filestr = sr.ReadToEnd();
                sr.Close();
                StringBuilder sb = new StringBuilder(filestr);
                sb.Replace("-----BEGIN CERTIFICATE-----", "");
                sb.Replace("-----END CERTIFICATE-----", "");
                //Decode 
                try
                {        //see if the file is a valid Base64 encoded cert
                    certBytes = Convert.FromBase64String(sb.ToString());
                    x509cert = new X509Certificate(certBytes);
                    showCertInfo(x509cert);
                }
                catch (System.FormatException formexc)
                {
                    Console.WriteLine("Not valid binary DER or Base64 X509 certificate format");
                }
                catch (System.Security.Cryptography.CryptographicException cryptb64)
                {
                    Console.WriteLine("Not valid binary DER or Base64 X509 certificate format");
                }
            }
    
    
        } // end while true
    }
    
    private static void showCertInfo(X509Certificate x509cert)
    {
        Console.WriteLine("Name: " + x509cert.GetName());
        Console.WriteLine("Issuer: " + x509cert.GetIssuerName());
        Console.WriteLine("Serial Number: " + x509cert.GetSerialNumberString());
        Console.WriteLine("Expiration Date: " + x509cert.GetExpirationDateString());
        Console.WriteLine("PublicKey: " + x509cert.GetPublicKeyString());
    }
    }
    

0 个答案:

没有答案