首页 | 新闻资讯 | 培训认证 | 安全管理 | 病毒分析 | 安全协议 | 网络安全 | 防火墙 | 黑客技术
DB安全 | Web安全 | 入侵检测 | 安全审计 | 设备安全 | 备份恢复 | 安全标准 | 法律法规 | 无线安全
OS安全 | PKI与PMI | 病毒防治 | 隔离网闸 | XML安全 | 网管专区 | 经典案例 | 技术论坛 |  
+ 文章搜索 +
当前位置:首页>>原创作品>>PKI与PMI>>正文
关键字:
范 围:
※推荐文章※
·OpenSSL命令行常用功能(1)
·WEB安全模块源代码分析文档之十一
·WEB安全模块源代码分析文档之十-
·WEB安全模块源代码分析文档之九-
·WEB安全模块源代码分析文档之八-
·WEB安全模块源代码分析文档之七-
openssl之pkcs7之1
作者:eboymcy 文章出处:中国信息安全组织 发布时间:2006-05-23 点击: 字体: 【

(说明: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

返回顶部↑】 【推荐好友】 【查看评论
用户名: 新注册) 密码: 匿名评论 [查看评论] 发表评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  Copyright © 2004-2005 infosecurity.org.cn . All Rights Reserved
版权所有:中国信息安全组织 系统管理:webmaster@infosecurity.net.cn
本站部分资源来自互联网,如有侵犯您的版权或其他问题,请通知管理员,我们会尽快处理!