p7结构的数字信封

article/2025/9/4 19:16:34

PKCS7的数字信封格式分为两种:带签名的数字信封和不带签名的数字信封。由于这个数字信封的生成过程比较复杂,所以这两种格式比较容易记混,导致都搞不清楚一个数字信封里面到底是存储的什么内容了。下面我就详细的解释一下,这两种数字信封的生成过程和其详细的数据结构。

首先是不带签名的数字信封。

 

不带签名的数字信封内容类型由任意类型的加密内容和加密的一个/多个接收者的内容加密密钥组成,其生成过程如下:

 

1. 发送方随机产生一个对应于特定加密算法的内容加密密钥。

2. 发送方将内容加密密钥用每个接收者的公钥加密。

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

4. 用内容加密密钥加密内容。

5. 将所有接收者的RecipientInfo值和加了密的内容放入EnvelopedData值中。

用ASN.1来描述一下它的结构:

 

EnvelopedData ::= SEQUENCE {
  version Version,
  recipientInfos RecipientInfos,
  encryptedContentInfo EncryptedContentInfo }

数据结构1

其中RecipientInfos 是一个集合的形式,包含一个或多个,即:

RecipientInfos ::= SET OF RecipientInfo

对于RecipientInfos  它的格式如下(我直接把注释贴的它的后面):

 

RecipientInfos ::= SEQUENCE {
  version Version,语法的版本号
  issuerAndSerialNumber IssuerAndSerialNumber, 接收者证书证书序列号
  keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier,接收者公钥加密加密密钥所用参数
  encryptedKey EncryptedKey 内容加密密钥被接收者公钥加密后的结果}

数据结构2

对于 EncryptedContentInfo 其格式如下:

 

EncryptedContentInfo ::= SEQUENCE {加密的数据
  contentType ContentType,指示内容的类型
  contentEncryptionAlgorithm 标识内容加密算法
    ContentEncryptionAlgorithmIdentifier,
  encryptedContent 内容加密的结果
    [0] IMPLICIT EncryptedContent OPTIONAL }

数据结构3

发送给接收方后,解包的过程很简单:接收者用自己的私钥解开加密的内容加密密钥,然后用该密钥解密密文内容。整个过程参与非对称运算的只有接收方的密钥对。

带签名的数字信封要比这要复杂的多。

带签名的数字信封由任意类型的加密内容、加了密的一个/多个接收者的内容加密密钥和双重加密的一个/多个签名者的消息摘要。“双重加密”由签名者私钥的加密和内容加密密钥的加密组成。其生成过程如下:

 

1.发送方随机产生一个对应于特定加密算法的内容加密密钥。

2. 发送方将内容加密密钥用每个接收者的公钥加密。

3. 对于每一个接收者,把加了密的内容加密密钥和接收者的其他信息放入RecipientInfo值中,参见数据结构2

4. 对于每一个签名者,他用自己的消息摘要算法计算出摘要值 (如果两个签名者使用同样的算法,那么摘要值只需计算一次) 。

5. 对于每一个签名者,消息摘要和相关的信息用自己的私钥加密,结果再用内容加密密钥加密。

6. 对于每一个签名者,把双重加密(即第5步中的先非对称加密,再对称加密的过程)的消息摘要和其他的签名者特定信息放入SignerInfo 值中。

7. 用内容加密密钥加密内容。

8. 把所有签名者的消息摘要算法、所有签名者的SignerInfo值、所有接收者的RecipientInfo值和加了密的内容一起放入SignedAndEnvelopedData 值中。

SignedAndEnvelopedData 的数据结构如下:

 

SignedAndEnvelopedData ::= SEQUENCE {
  version Version, 语法的版本号
  recipientInfos RecipientInfos, 接收者信息的集合
  digestAlgorithms DigestAlgorithmIdentifiers,消息摘要算法标识符的集合
  encryptedContentInfo EncryptedContentInfo, 加了密的内容
  certificates
     [0] IMPLICIT ExtendedCertificatesAndCertificates OPTIONAL,
  crls
    [1] IMPLICIT CertificateRevocationLists OPTIONAL,
  signerInfos SignerInfos }

数据结构4

其中, certificates是 PKCS # 6 扩展证书和 X.509 证书的集合。它表示集合足以包含从可识别的“根”或“顶级 CA ”到 signerInfo 域中所有签名者的证书链。可能有多于必要的证书,并且可能有足够的证书来包含链(从两个或多个独立的顶级 CA )。 也可能有少于必要的证书,比如验证签名有一个替换的方法来获得必要的证书 (e.g., 从一个先前证书集合中)。此属性最终来确定签名者身份。

 

crls是证书撤销列表的集合。它表示集合包含足够的信息来决定certificates域中的证书是否是“hot listed”的,但这不是必须的。 可能有多于必要的crl,也可能有少于必要的crl。

 

signerInfos是每个签名者信息集合。至少要有一个元素。其每个元素的结构如下:

 

SignerInfo ::= SEQUENCE {
  version Version,
  issuerAndSerialNumber IssuerAndSerialNumber,
  digestAlgorithm DigestAlgorithmIdentifier,
  authenticatedAttributes
    [0] IMPLICIT Attributes OPTIONAL,
  digestEncryptionAlgorithm
    DigestEncryptionAlgorithmIdentifier,
  encryptedDigest EncryptedDigest,
  unauthenticatedAttributes
    [1] IMPLICIT Attributes OPTIONAL }

数据结构5

 

类型SignerInfo的域有以下意义,基本上是一些配置属性:

· version是指语法的版本号,这一标准中版本应该为1 。

· issuerAndSerialNumber签名证书的证书序列号。

· digestAlgorithm指定对内容和待鉴别属性(若存在的话)进行摘要计算的信息摘要算法(及相应的参数)。

· authenticatedAttributes是经由签名者签名的属性的集合。 该域是可选的,但是当被签名的ContentInfo的content type不是data类型时该域必须存在。如果该域存在,它必须包含至少两个属性:

1. PKCS #9 content-type 属性,当ContentInfo的content type值被签名时。

2. PKCS #9 message-digest 属性,当值是内容的消息摘要时(见下面)。 

这里可能有用的其他属性类型如签名时间等也在PKCS#9中定义。

· digestEncryptionAlgorithm标识用签名者私钥加密消息摘要和相关信息的摘要加密算法(和相应的参数)。

· encryptedDigest是用签名者私钥加密消息摘要和相关信息后的结果。 

· unauthenticatedAttributes是不被签名者签名的属性的集合。该域是可选的。这里可能有用的属性类型如countersignatures(连署)等在PKCS#9中定义。

其中 EncryptedDigest是一个十六进制字符串,即

EncryptedDigest ::= OCTET STRING

接收方接到数字信封后,解封操作会复杂些:

1.收方B接受到数字信封DE后,首先用自己的私钥PVB解密数字信封,取出对称密钥SK; 
2.收方B用对称密钥SK通过DES算法解密加密信息E,还原出原文信息、数字签名SD及发方A证书的公钥PBA; 
3. 收方B验证数字签名,先用发方A的公钥解密数字签名得数字摘要MD; 
4.收方B同时将原文信息用同样的哈希运算,求得一个新的数字摘要MD’;
5.将两个数字摘要MD和MD’进行比较,验证原文是否被修改。如果二者相等,说明数据没有被篡改,是保密传输的,签名是真实的;否则拒绝该签名。 

以上就是两种数字信封格式的完全解释。

顺便说一下,假设你在程序里拿到了一段数据,无法判断数据格式,可以将这段数据保存为文件,然后用ViewBer(下载地址http://simpleauthority.com/viewber.html)这个工具打开,然后选择查看OBJECT INTEGER选项,会显示当前的数据的oid。

然后去这个地址http://www.alvestrand.no/objectid/top.html查看一下oid的具体相关信息。

具体生成p7文件的VC项目,请到http://download.csdn.net/detail/yunnysunny/4555287 下载。


http://chatgpt.dhexx.cn/article/VDwBLl23.shtml

相关文章

数字签名和数字信封

数字签名和数字信封 数字签名定义原理作用签名种类P7签名又分为两类:Attached签名Detached签名P1签名也称为裸签 验证签名验签的原理 数字信封定义原理作用 签名 、数字信封、证书的关系 数字签名 定义 用户用自己的【私钥】对原始数据的哈希摘要进行加密所得的数…

chewing的作业——数字信封实现文件传输

文件安全传输系统设计作业 通信模式:端到端通信 数字信封: 对称密码优点是加解密运算非常快,适合处理大批量数据,但其密码的分发与管理比较复杂。而非对称密码算法的特点是公钥和私钥分离,非常适合密钥的分发和管理。…

什么又是数字证书?(数字证书与数字签名什么关系?)数字信封、PGP又是啥?

什么是非对称加密? 什么是信息摘要? 什么是数字签名? 本节我们接着上面的内容继续,话说有了非对称加密技术、有了信息摘要技术、也有了数字签名技术,信息的安全传输是不是就万无一失了呢? 其实并不完全&a…

sm2格式数字信封加解密详解

sm2格式数字信封 0、参考链接 密码行业标准化技术委员会http://www.gmbz.org.cn/main/bzlb.html SM2密码算法使用规范http://www.gmbz.org.cn/main/viewfile/2018011001400692565.html SM2密码算法应用分析https://blog.csdn.net/arlaichin/article/details/23708155?utm_so…

数字签名和数字信封的比较

参考博客:数字签名与数字信封流程 相同点 都使用了非对称算法对密钥进行了加密 数字签名 重点:防止文本被篡改,防止抵赖 发送方将文本取摘要,再生成一个密钥对摘要加密,同时该密钥使用自己的私钥进行非对称加密&am…

密码学~~~数字信封

#本文仅供参考有不足之处请指出 一、概括 数字信封是公钥密码体制在实际中的一个应用,是用加密技术来保证只有规定的特定收信人才能阅读通信的内容。数字信封的功能类似于普通信封,普通信封在法律的约束下保证只有收信人才能阅读信的内容;数…

数字信封工作原理

数字信封是指发送方使用接收方的公钥来加密对称密钥后所得的数据,其目的是用来确保对称密钥传输的安全性。采用数字信封时,接收方需要使用自己的私钥才能打开数字信封得到对称密钥。 数字信封的加/解密过程如图1-19所示。甲也要事先获得乙的公钥&#xf…

RSA+AES数字信封加解密设计

登录认证、鉴权这些都做好了过后。就开始我们的加密设计了、这里采用了简化数字信封进行加密。首先客户端(浏览器)先请求一份RSA非对称密钥、如果我们采用了openresty或者有能力在nginx开发C模块的插件,就可以在这里保留一份用户的私钥&#…

数字信封加密

OpenSSL 是目前 PHP 甚至是整个开发圈中的数据加密事实标准,包括 HTTPS/SSL 在内的加密都是它的实际应用, OpenSSL 提供了对称和非对称加密的形式,也就是我们日常中最普遍的两种加密方式。 那么,它和 Hash 类的加密有什么不同吗&…

p7数字信封

PKCS7的数字信封格式分为两种:带签名的数字信封和不带签名的数字信封。由于这个数字信封的生成过程比较复杂,所以这两种格式比较容易记混,导致都搞不清楚一个数字信封里面到底是存储的什么内容了。下面我就详细的解释一下,这两种数…

数字信封原理

数字信封是指发送方使用接收方的公钥来加密对称密钥后所得的数据,其目的是用来确保对称密钥传输的安全性。采用数字信封时,接收方需要使用自己的私钥才能打开数字信封得到对称密钥。 数字信封的加/解密过程如图所示。甲也要事先获得乙的公钥,…

PKCS7数字信封简述

1、数字信封的概念 数字信封,英文是Digital Envelope,望文生义,就可以知道将需要传递的数据,通过加密的方式包裹起来。 数字信封的准确定义,在《PKCS #7: Cryptographic Message Syntax Standard》标准的第10章中给出,原话是:“加密的内容,以及对内容解密的密钥被加密…

什么是数字信封?

一、什么是数字信封 数字信封是公钥密码体制在实际中的一个应用,是用加密技术来保证只有规定的特定收信人才能阅读通信的内容。 在数字信封中,信息发送方采用对称密钥来加密信息内容,然后将此对称密钥用接收方的公开密钥来加密(这…

数据来源渠道及采集工具_几款简单好用的爬虫抓取数据采集工具

新朋友点上方蓝字“Office交流网”快速关注 1. 火车头采集器 火车采集器我们也一直在用,是老牌的采集工具了。它不仅可做抓取工具,也可以做数据清洗、分析、挖掘已经可视化等工作。数据源可来源于网页,网页中能看到的内容和不可看到都可以通过…

爬虫抓取新浪微博数据

工具:云采爬虫 目标:抓取某个博主的全部微博 分析网页结构: 我们抓取的思路是模拟浏览器自动访问页面抓取。 我们来看一下页面结构,首先每个微博列表,必须进行三四次的下拉加载,如果底部有个翻页的按钮…

python3 爬虫抓取股市数据

python3 爬虫抓取股市数据 爬虫抓取数据的一般步骤代码运行结果小结注意事项 爬虫抓取数据的一般步骤 1、确定需要抓取的网站2、分析url,找到url的的变化规律3、分析页面的数据4、获取页面数据5、提取需要爬取的数据6、写入数据库或写入文件代码 import requests i…

Python_爬虫数据存入数据库(超详细过程

目录 一、新建项目 二、程序的编写 三、数据的爬取 一、新建项目 1.在cmd窗口输入scrapy startproject [项目名称] 创建爬虫项目 接着创建爬虫文件,scrapy genspider [爬虫名字] [爬虫域名] 打开pycharm项目,就可以看到生成的cblog.py文件 二、程序的…

爬虫抓取分页数据的简单实现

爬虫抓取分页数据的简单实现 昨天,我们已经利用Jsoup技术实现了一个简单的爬虫,原理很简单,主要是要先分析页面,拿到条件,然后就去匹配url,采用dome解析的方式循环抓取我们需要的数据,从而即可轻…

PHP爬虫抓取网页数据

2019年我接触到PHP爬虫的时候,我最开始是懵的。还有人用php来写爬虫? 一个月之后,嗯~全世界最好的语言写全世界最好的爬虫,真香!而在7月15这一个日常加班的晚上,做完手头的活,我寻思着写会儿php…

网络爬虫的基本结构是什么?如何建立网络爬虫抓取数据?

摘要:互联网上有很多丰富的信息可以被抓取并转换成有价值的数据集,然后用于不同的行业。比如企业用户利用电商平台数据进行商业分析,学校的师生利用网络数据进行科研分析等等。那么,除了一些公司提供的一些官方公开数据集之外&…