OpenSSL之pkcs7系列(2)

2019-03-28 12:44

收者的“数字信封”。任意类型的内容能够同时为任意数量的接收者进行封装。 Enveloped-data的组建过程分以下几步: 1. 随机产生一个对称密钥用于加密内容。 2. 内容加密密钥用每个接收者的公钥加密。

3. 对于每一个接收者,把内容加密密钥的密文和接收者的其他信息放入recipientinfo值中。 4. 用加密密钥加密内容。

5. 将所有接收者的recipientinfo值和加了密的内容放入EnvelopedData值中 接收者用自己的私钥解开内容加密密钥,然后用该密钥解密密文内容。 调用openssl的代码如下: PKCS7* p7 = PKCS7_new(); //设置类型为NID_pkcs7_enveloped

PKCS7_set_type(p7, NID_pkcs7_enveloped); //DES算法,用于加密内容“How are you!” EVP_CIPHER *evp_cipher = EVP_des_cbc(); PKCS7_set_cipher(p7,cipher);

//设置接收者证书,获取公钥用于加密对称密钥

PKCS7_RECIP_INFO *p7recipinfo = PKCS7_add_recipient(p7,x509_Cert); BIO *p7bio = PKCS7_dataInit(p7, NULL);

BIO_write(p7bio,”How Are You!”,strlen(“How Are You!”)); //完成数字信封的运算

PKCS7_dataFinal(p7, p7bio); //转换PKCS7结构体为DER编码 derLen = i2d_PKCS7(p7,&derTmp); BIO_free(p7bio); PKCS7_free(p7);

解P7数字信封的代码: //der编码转换为PKCS7结构体

PKCS7* p7 = d2i_PKCS7(NULL,&derTmp,derP7EnvelopedDataLen); //解析出原始数据, evp_key:接收者私钥,x509_cert:接收者证书 BIO * p7bio = PKCS7_dataDecode(p7,evp_key,NULL,x509_cert); //从BIO中读取原始数据,将得到\srcLen = BIO_read(p7bio,src,4096); BIO_free(p7bio); PKCS7_free(p7);

OpenSSL之pkcs7 Signed-and-enveloped-data内容类型的编码解码

PKCS7_SIGN_ENVELOPE *signed_and_enveloped在openssl中的定义如下: typedef struct pkcs7_signedandenveloped_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; PKCS7_ENC_CONTENT *enc_data;

STACK_OF(PKCS7_RECIP_INFO) *recipientinfo; } PKCS7_SIGN_ENVELOPE;

signed-and-enveloped-data内容类型由任意类型的加密内容、加了密的一个/多个接收者的内容加密密钥和双重加密的一个/多个签名者的消息摘要。“双重加密”由签名者私钥的加密和内容加密密钥的加密组成。

加了密的内容和加了密的内容加密密钥一起构成了接收者的“数字信封”。恢复的签名者单个加密的消息摘要是恢复的签名者内容的“数字签名”。任意类型的内容能够同时为任意数量的接收者进行封装和被任意数量的签名者进行签名。 signed-and-enveloped data的组建过程包括以下几步:

1. 随机产生一个对应于特定加密算法的内容加密密钥,比如des算法的8字节密钥。 2. 内容加密密钥用每个接收者的公钥加密。

3. 对于每一个接收者,把加了密的内容加密密钥和接收者的其他信息放入recipientinfo值中。

4. 对于每一个签名者,他用自己的消息摘要算法计算出摘要值 (如果两个签名者使用同样的算法,那么摘要值只需计算一次)。 5. 对于每一个签名者,消息摘要和相关的信息用自己的私钥加密(即签名),结果再用内容加密密钥加密。 6. 对于每一个签名者,把双重加密的消息摘要和其他的签名者特定信息放入signer_info值中。 7. 用内容加密密钥加密内容。

8. 把所有签名者的消息摘要算法、所有签名者的signer_info值、所有接收者的recipientinfo值和加了密的内容一起放入PKCS7_SIGN_ENVELOPE值中 接收者打开信封并验证签名分两步:

1. 加了密的内容加密密钥用接收者的私钥解开,并用内容加密密钥解开加密的内容。

2. 每个签名者双重加密的消息摘要用恢复的内容加密密钥解开,结果再用签名者公钥解密,恢复的消息摘要再和独立计算的消息摘要进行比较。

调用openssl的代码如下: PKCS7* p7 = PKCS7_new();

//设置类型为NID_pkcs7_signedAndEnveloped

PKCS7_set_type(p7, NID_pkcs7_signedAndEnveloped); //DES算法,用于加密内容“How are you!” EVP_CIPHER *evp_cipher = EVP_des_cbc(); PKCS7_set_cipher(p7,cipher); //设置接收者证书,获取公钥用于加密对称密钥

PKCS7_RECIP_INFO *p7recipinfo = PKCS7_add_recipient(p7, x509_RecCert); //x509:签名证书,pkey:签名者私钥。EVP_sha1()签名者摘要算法。

PKCS7_SIGNER_INFO* info = PKCS7_add_signature(p7, x509, pkey, EVP_sha1()); //添加签名者证书

PKCS7_add_certificate(p7, x509t); //添加签名者的CA证书链

for (int i=0; i

PKCS7_add_certificate(p7, sk_X509_value(ca, i)); }

BIO *p7bio = PKCS7_dataInit(p7, NULL);

BIO_write(p7bio,”How Are You!”,strlen(“How Are You!”)); //完成签名&数字信封的运算

PKCS7_dataFinal(p7, p7bio); //转换PKCS7结构体为DER编码 derLen = i2d_PKCS7(p7,&derTmp); BIO_free(p7bio); PKCS7_free(p7);


OpenSSL之pkcs7系列(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:食品安全地方标准青团(征求意见稿)doc

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: