(说明:openssl技术网站上有不少evp系列,asn1系列等技术资料,没找到关于pkcs7开发的,故整理了一下自己的学习笔记。由于水平有限,肯定有不少错误,请网友不吝赐教,本人万分感谢。如需转载请保留出处.
作者 eboymcy
)
关键字:openssl pkcs7 Enveloped
正文:
PKCS7_ENVELOPE. enveloped在openssl中的定义如下:
typedef struct pkcs7_enveloped_st
{
ASN1_INTEGER *version; /* version 0 */
STACK_OF(PKCS7_RECIP_INFO) *recipientinfo;
PKCS7_ENC_CONTENT *enc_data;
} PKCS7_ENVELOPE;
enveloped-data内容类型由任意类型的加密内容和加密的一个/多个接收者的内容加密密钥组成。内容的密文和加密密钥一起构成了接收者的“数字信封”。任意类型的内容能够同时为任意数量的接收者进行封装。
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中读取原始数据,将得到"How are you!"
srcLen = BIO_read(p7bio,src,4096);
BIO_free(p7bio);
PKCS7_free(p7);
作者简介:
eboymcy,一直从事pki相关的研究和开发,中国信息安全组织PKI版版主。现为某CA中心高级软件工程师。
您可以通过以下方式联系他:
mail:eboymcy@163.com