(说明:openssl技术网站上有不少evp系列,asn1系列等技术资料,没找到关于pkcs7开发的,故整理了一下自己的学习笔记。由于水平有限,肯定有不少错误,请网友不吝赐教,本人万分感谢。如需转载请保留出处.
作者 eboymcy
)
1. 概述
openssl之pkcs7介绍
openssl实现了pkcs7(加密消息语法标准)。在中。
p7包括6种数据内容:数据(data),签名数据(sign),数字信封数据(enveloped),签名数字信封数据(signed_and_enveloped),摘要数据(digest),加密数据(encrypted)。
后面将一一介绍如何对6种数据类型进行封装。
PKCS7结构体定义如下:
typedef struct pkcs7_st
{
/* The following is non NULL if it contains ASN1 encoding of
* this structure */
unsigned char *asn1;
long length;
#define PKCS7_S_HEADER 0
#define PKCS7_S_BODY 1
#define PKCS7_S_TAIL 2
int state; /* used during processing */
int detached;
ASN1_OBJECT *type;
/* content as defined by the type */
/* all encryption/message digests are applied to the 'contents',
* leaving out the 'type' field. */
union {
char *ptr;
/* NID_pkcs7_data */
ASN1_OCTET_STRING *data;
/* NID_pkcs7_signed */
PKCS7_SIGNED *sign;
/* NID_pkcs7_enveloped */
PKCS7_ENVELOPE *enveloped;
/* NID_pkcs7_signedAndEnveloped */
PKCS7_SIGN_ENVELOPE *signed_and_enveloped;
/* NID_pkcs7_digest */
PKCS7_DIGEST *digest;
/* NID_pkcs7_encrypted */
PKCS7_ENCRYPT *encrypted;
/* Anything else */
ASN1_TYPE *other;
} d;
} PKCS7;
数据(data):
明文打包
type为NID_pkcs7_data,ASN1_OCTET_STRING类型,即为简单的ASN1_STRING数据类型。
签名数据(sign):
把数据以及签名值打包,其中包括签名者的证书,CRL等,目的为确定发送者的身份。
type为NID_pkcs7_signed。PKCS7_SIGNED类型的数据,PKCS7_SIGNED定义如下:
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;
数字信封数据(enveloped):
使用接收者的公钥(从证书获取)加密数据。目的为保护数据,拥有私钥的接收者才能解开数据。
type为NID_pkcs7_enveloped。PKCS7_ENVELOPE类型的数据,PKCS7_ENVELOPE定义如下
typedef struct pkcs7_enveloped_st
{
ASN1_INTEGER *version; /* version 0 */
STACK_OF(PKCS7_RECIP_INFO) *recipientinfo;//接收者的证书
PKCS7_ENC_CONTENT *enc_data;//用接收者证书公钥加密的数据
} PKCS7_ENVELOPE;
签名数字信封数据(signed_and_enveloped)
数字信封加签名
type为NID_pkcs7_signedAndEnveloped。PKCS7_SIGN_ENVELOPE类型的数据,PKCS7_SIGN_ENVELOPE定义如下
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;
加密数据(encrypted)
使用对称算法加密数据。
type为NID_pkcs7_encrypted。PKCS7_ENCRYPT类型的数据,PKCS7_ENCRYPT定义如下
typedef struct pkcs7_encrypted_st
{
ASN1_INTEGER *version; /* version 0 */
PKCS7_ENC_CONTENT *enc_data;
} PKCS7_ENCRYPT;
摘要数据(digest):
对数据摘要后打包。openssl没有实现,后面将介绍如何修改openssl源码实现对NID_pkcs7_digest的支持。
type为NID_pkcs7_digest。PKCS7_DIGEST类型的数据,PKCS7_DIGEST定义如下
typedef struct pkcs7_digest_st
{
ASN1_INTEGER *version; /* version 0 */
X509_ALGOR *md; /* md used */
struct pkcs7_st *contents;
ASN1_OCTET_STRING *digest;
} PKCS7_DIGEST;
作者简介:
eboymcy,一直从事pki相关的研究和开发,中国信息安全组织PKI版版主。现为某CA中心高级软件工程师。
您可以通过以下方式联系他:
mail:eboymcy@163.com
blog:http://5233studio.blogchina.com