PKCS7

PKCS7规范

场景

不仅仅可作为数字签名的格式规范,也可以用于封装证书、数字信封等,规范里的填充方式也被广泛使用。

P7格式的数字签名又可以细分为以下两种:Attached和Detached签名。

【attached模式】又称P7A,即签名值中包含被签名的原文,但明文必须经过ASN.1编码。这样处理的话在通信过程中就无需重复传递原文,但会增加签名值的长度。
【detached模式】又称P7D,格式中不包含被签名原文信息。因此在对端进行验签操作的时候,还需要额外传递消息值才可进行验证。

值得一提的是不管是P7A还是P7D格式的签名,被签名的原文可能都经过预处理,当验签不通过,而签名值、公钥都没问题的话,就需要考虑签名原文的格式是否正确了,需要具体情况具体分析。

填充方式

OpenSSL 加密算法默认填充算法就是 PKCS7。
PKCS7Padding的填充方式为:
补位的个数: 不足16位字节的倍数,补足变成16位的倍数,如果刚好是16的倍数,补16个字节。
补位的值: 等于补位个数的十六进制值。

【示例】
对于AES128算法其数据块为16Byte(数据长度需要为16Byte的倍数):

原文: 00 11 22 33 44 55 66 77 88 99 AA,一共11个Byte,缺了5位,
填充: 00 11 22 33 44 55 66 77 88 99 AA 05 05 05 05 05。

特别注意的一点是如果是数据刚好满足数据块长度也要在元数据后在按PKCS7规则填充一个数据块数据,这样做的目的是为了区分有效数据和补齐数据。
16转成十六进制为0x10

原文: 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF,一共16个Byte,不缺,
填充: 00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10。

数字信封

enveloped-data内容类型由任意类型的加密内容和加密的一个/多个接收者的内容加密密钥组成。加了密的内容和加了密的内容加密密钥一起构成了接收者的“数字信封”。

Enveloped-data的组建过程分以下几步:

  1. 随机产生一个对应于特定加密算法的内容加密密钥。
  2. 内容加密密钥用每个接收者的公钥加密。
  3. 对于每一个接收者,把加了密的内容加密密钥和接收者的其他信息放入RecipientInfo值中。
  4. 用内容加密密钥加密内容。(内容加密可能会需要填充一些块;见Section 10.3 的讨论)。
  5. 将所有接收者的RecipientInfo值和加了密的内容放入EnvelopedData值中, Section 10.1中定义了。

在这里插入图片描述

1. enveloped-data内容类型的ASN.1格式:

最外层的OBJECT IDENTIFIER,数字信封为1.2.840.113549.1.7.3。

EnvelopedData ::= SEQUENCE {
  version Version, --语法的版本号,这一标准中版本应该为0
  recipientInfos RecipientInfos, --每个接收者信息的集合。这里至少有一个元素
  encryptedContentInfo EncryptedContentInfo --加了密的内容信息
}

在这里插入图片描述

在这里插入图片描述

1.1 Version

Version ::= Integer

1.1 RecipientInfos

RecipientInfos ::= SET OF RecipientInfo

RecipientInfo ::= SEQUENCE {
  version Version, --语法的版本号,这一标准中版本应该为0
  issuerAndSerialNumber IssuerAndSerialNumber, --指定由颁发者可辨别名和颁发序列号确定的接收者证书(和相应的接收者辨别名、公钥)
  keyEncryptionAlgorithm KeyEncryptionAlgorithmIdentifier, --指定用接收者公钥加密内容加密密钥的密钥加密算法(和相应的参数)。密钥加密过程在Section 10.4中定义。
  encryptedKey EncryptedKey --内容加密密钥被接收者公钥加密后的结果
}

Version ::= Integer
IssuerAndSerialNumber :: SEQUENCE {...}
KeyEncryptionAlgorithmIdentifier :: SEQUENCE {...}
EncryptedKey ::= OCTET STRING

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.2 EncryptedContentInfo

EncryptedContentInfo ::= SEQUENCE {
  contentType ContentType, --内容类型OID,
  contentEncryptionAlgorithm ContentEncryptionAlgorithmIdentifier, --内容加密算法
  encryptedContent[0] IMPLICIT EncryptedContent OPTIONAL --内容加密的结果,可选项
}

ContentType ::= Object Identifier
ContentEncryptionAlgorithmIdentifier :: SEQUENCE {...}
EncryptedContent ::= OCTET STRING

在这里插入图片描述

内容类型

在这里插入图片描述

在这里插入图片描述

OID标识符可参考:https://blog.csdn.net/A_Lonely_Smile/article/details/121273134

内容加密算法(对称算法)

此处是:AES128的CBC模式,OID为2.16.840.1.101.3.4.1.2

在这里插入图片描述

内容加密密钥加密的密文

签名数据

最外层的OBJECT IDENTIFIER,签名数据为1.2.840.113549.1.7.2。
在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值