Encryption 如何从签名PE PKCS#7块中获取算法字段

Encryption 如何从签名PE PKCS#7块中获取算法字段,encryption,openssl,sha,pkcs#7,asn1,Encryption,Openssl,Sha,Pkcs#7,Asn1,我从PE文件中提取了PKCS#7内容 证书链之前的第一部分(从开始到证书:标签)包含有关文件完整性的信息 特别是,与文件哈希匹配的哈希和用于生成此哈希的算法(在下面列出的示例中,相应地,worthfa0fe65f973a5709dc04ee18abef353ebea669和sha1) 我使用的是openssl,我想从X509格式中提取哈希算法类型。我试着从调试器中打印md_algs struct之类的东西,希望找到算法字段值1.3.14.3.2.26,但这就是我看到的 p *(Pkcs7->

我从PE文件中提取了
PKCS#7
内容

证书链之前的第一部分(从开始到
证书:
标签)包含有关文件完整性的信息

特别是,与文件哈希匹配的哈希和用于生成此哈希的算法(在下面列出的示例中,相应地,worth
fa0fe65f973a5709dc04ee18abef353ebea669
sha1

我使用的是
openssl
,我想从
X509
格式中提取哈希算法类型。我试着从调试器中打印md_algs struct之类的东西,希望找到
算法
字段值
1.3.14.3.2.26
,但这就是我看到的

p *(Pkcs7->d.sign->md_algs)
(stack_st_X509_ALGOR) $6 = {
  stack = {
     num = 1
     data = 0x00000001024457f0
     sorted = 0
     num_alloc = 4
     comp = 0x0000000000000000
  }
}
在哪里可以看到算法字段

注意:以下是pkcs7结构的相关部分:

PKCS7: 
   type: pkcs7-signedData (1.2.840.113549.1.7.2)
   d.sign: 
     version: 1
     md_algs:
       algorithm: sha1 (1.3.14.3.2.26)
       parameter: NULL
     contents: 
       type: undefined (1.3.6.1.4.1.311.2.1.4)
     d.other: SEQUENCE:
        0:d=0  hl=2 l=  60 cons: SEQUENCE          
        2:d=1  hl=2 l=  23 cons:  SEQUENCE          
        4:d=2  hl=2 l=  10 prim:   OBJECT            :1.3.6.1.4.1.311.2.1.15
       16:d=2  hl=2 l=   9 cons:   SEQUENCE          
       18:d=3  hl=2 l=   1 prim:    BIT STRING        
       21:d=3  hl=2 l=   4 cons:    cont [ 0 ]        
       23:d=4  hl=2 l=   2 cons:     cont [ 2 ]        
       25:d=5  hl=2 l=   0 prim:      cont [ 0 ]        
       27:d=1  hl=2 l=  33 cons:  SEQUENCE          
       29:d=2  hl=2 l=   9 cons:   SEQUENCE          
       31:d=3  hl=2 l=   5 prim:    OBJECT            :sha1
       38:d=3  hl=2 l=   0 prim:    NULL              
       40:d=2  hl=2 l=  20 prim:   OCTET STRING      [HEX DUMP]:FA0FE65F973A5709DC04EE18ABEF353EBEFEA669
     cert:
      cert_info: 
      ...
感谢中定义的
md\u algs
属性,您正在检查的属性是一堆
X509\u ALGOR
实例:

typedef struct pkcs7_signed_st {
    ASN1_INTEGER *version;      /* version 1 */
    STACK_OF(X509_ALGOR) *md_algs; /* md used */
    STACK_OF(X509) *cert;       /* [ 0 ] */
    STACK_OF(X509_CRL) *crl;    /* [ 1 ] */
    STACK_OF(PKCS7_SIGNER_INFO) *signer_info;
    struct pkcs7_st *contents;
} PKCS7_SIGNED;
可通过安全访问,例如使用函数
sk_X509_ALGOR_value()
检查其元件

X509\u ALGOR
本身定义如下:

您要查找的信息存储在属性
算法中,您可以使用该属性进行检查,例如

将其结合在一起,以获得堆栈中第一个算法的文本表示,您可以执行以下操作:

char tbuf[20];
X509_ALGOR *algor = sk_X509_ALGOR_value(Pkcs7->d.sign->md_algs, 0);
int res = OBJ_obj2txt(tbuf, sizeof tbuf, algor->algorithm, 0);
在此之后,
tbuf
应该包含一个类似于
的值“sha1”
res
包含该字符串的长度。出于编程目的,像
OBJ_obj2nid()
这样的函数可能更有用


调试器没有提供此信息,因为
堆栈
元素中的
数据
字段不是强类型的。您必须自己强制转换它,以指示它是指向
X509\u ALGOR
structs的指针数组。OpenSSL堆栈API为您提供了一组宏,这些宏可以为您执行强制转换并以这种方式访问阵列。然后,您最终得到的
ASN1_对象
很难在调试器中检查或解释,因为它只是一堆字节,以
ASN.1
格式表示对象id

char tbuf[20];
X509_ALGOR *algor = sk_X509_ALGOR_value(Pkcs7->d.sign->md_algs, 0);
int res = OBJ_obj2txt(tbuf, sizeof tbuf, algor->algorithm, 0);