openssl之pkcs7之3 signed-data内容类型的编码解码

作者在 2006-11-30 00:34:00 发布以下内容

PKCS7_SIGNED.signopenssl中的定义如下:

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;

 

signed内容类型由任意类型的内容和数字签名组成。任何类型的内容能够同时被任意数量的签名者签名。

签名数据的产生过程有如下几步

1. 对于每一个签名者,他用消息摘要算法计算出摘要值

2. 对于每一个签名者,消息摘要和相关的信息用自己的私钥加密。

3. 对于每一个签名者,把加密的消息摘要和其他的签名者特定信息放入signer_info值中。每个 签名者的证书、crl等也在这一步被收集进来。

4. 把所有签名者的信息摘要算法、他们的signer_info值和内容一起放进sign值中。

调用openssl的代码如下:

PKCS7* p7 = PKCS7_new();

PKCS7_set_type(p7, NID_pkcs7_signed);//设置类型为NID_pkcs7_signed

PKCS7_content_new(p7, NID_pkcs7_data);

PKCS7_set_detached(p7, 0);

//添加签名者信息,

//x509:签名证书,pkey:签名者私钥。EVP_sha1()签名者摘要算法。

PKCS7_SIGNER_INFO* info = PKCS7_add_signature(p7, x509, pkey, EVP_sha1());

//添加签名者证书

PKCS7_add_certificate(p7, x509);

//

(编程)Work | 阅读 2653 次
文章评论,共0条
游客请输入验证码