news 2026/6/23 17:58:09

SM2算法的PKCS#7签名结构体“SignData“分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SM2算法的PKCS#7签名结构体“SignData“分析

前言

本文转载自《SM2的P7签名结构体简单分析》,该文章详细的解读了国密SM2算法的P7签名结构,非常感谢原文博主大佬的详述,受益匪浅。


SM2的P7结构体简单分析

本文用于记录我一次为了验签SM2国密不得不把整个P7结构体理解一遍后,得出来的一些结论,可能以后很难再用到,故记录下来以减少以后用到时的再学习成本

借鉴和提供了帮助的文章及网站

支持国密SM2/SM3/SM4/SM9/ZUC/SSL的密码工具箱

X.509数字证书的结构与解析

翻译:《PKCS#7 - SignedData》

CSR Decoder And Certificate Decoder


解析过程

本文用到了一个解析P7签名值的网站

使用到的国密算法SM2做的PKCS#7签名值demo:

MIIDagYKKoEcz1UGAQQCAqCCA1owggNWAgEDMQ4wDAYIKoEcz1UBgxEFADBQBgoqgRzPVQYBBAIBoEIEQGRlYzllODgwYmQ4YmQ3NjE3NjczYjI5ZTY0OTM5YWVhNjhkYmNjYWQyNTJiYTdhOWI4NTgwMTM5NjRmMGI1ZGKgggJFMIICQTCCAeWgAwIBAgIINYArYH+E530wDAYIKoEcz1UBg3UFADArMQswCQYDVQQGEwJDTjENMAsGA1UECgwEWkhDQTENMAsGA1UEAwwEWkhDQTAeFw0yMTAyMjQwODAyNTRaFw0yMjAyMjQwODAyNTRaMF8xCzAJBgNVBAYTAkNOMS0wKwYDVQQKDCTkuK3njq9DQeeUteWtkOetvue6puW5s+WPsC3lpZHnuqbplIExITAfBgNVBAMMGOe7tOajrumbhuWbouaciemZkOWFrOWPuDBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABCud4IDiuW/2D/DjPTWE1ic4VXmruShbrUF8VZ9XYfKT5N+hZ+Wj31O/XctY221i3XWXSe5wzRTcp4hVeAUcamWjgbwwgbkwDgYDVR0PAQH/BAQDAgbAMB8GA1UdIwQYMBaAFLQvQoI7jjkMzTbzWLavdHXRdscXMDEGA1UdHwQqMCgwJqAkoCKGIGh0dHA6Ly93d3cudGp6aGNhLmNvbS9jcmw0MDMuY3JsMB0GA1UdDgQWBBSXV9IeudED3RQi3UEQ8npWVCYPNDAPBgNVHRMBAf8EBTADAQEAMCMGCCqBHNAUBAEEAQH/BBQTEjEyNkdGS1g1MUNNUFRUSERGQjAMBggqgRzPVQGDdQUAA0gAMEUCIQCfrGEgtGcJli3gAmMkTvU+77U2RLSg58cgyHqSY61TDAIgR7mtH/BOODFgmnqp8GajXNmy1+oFvP8TwHR8RWa83fAxgaUwgaICAQEwNzArMQswCQYDVQQGEwJDTjENMAsGA1UECgwEWkhDQTENMAsGA1UEAwwEWkhDQQIINYArYH+E530wDAYIKoEcz1UBgxEFADANBgkqgRzPVQGCLQEFAARHMEUCICRK70zLyX+ZFkinxeStdo3eywZvl/hHt24xM2s3HEkcAiEAsLMe/LQwIQhCWXWCpsIw8kpduTkDQoB0cwY1RumGlYI=

这里的解析值是用base64加密的,解析后的结果:

[1.2.156.10197.6.1.4.2.2, [0][3, [[1.2.156.10197.1.401, NULL]], [1.2.156.10197.6.1.4.2.1, [0]#64656339653838306264386264373631373637336232396536343933396165613638646263636164323532626137613962383538303133393634663062356462], [0][[[0]2, 3855128974485415805, [1.2.156.10197.1.501, NULL], [[[2.5.4.6, CN]], [[2.5.4.10, ZHCA]], [[2.5.4.3, ZHCA]]], [210224080254Z, 220224080254Z], [[[2.5.4.6, CN]], [[2.5.4.10, 中环CA电子签约平台-契约锁]], [[2.5.4.3, 维森集团有限公司]]], [[1.2.840.10045.2.1, 1.2.156.10197.1.301], #034200042B9DE080E2B96FF60FF0E33D3584D627385579ABB9285BAD417C559F5761F293E4DFA167E5A3DF53BF5DCB58DB6D62DD759749EE70CD14DCA7885578051C6A65], [3][[2.5.29.15, TRUE, #030206c0], [2.5.29.35, #30168014b42f42823b8e390ccd36f358b6af7475d176c717], [2.5.29.31, #30283026a024a0228620687474703a2f2f7777772e746a7a6863612e636f6d2f63726c3430332e63726c], [2.5.29.14, #04149757d21eb9d103dd1422dd4110f27a5654260f34], [2.5.29.19, TRUE, #3003010100], [1.2.156.10260.4.1.4, TRUE, #131231323647464b583531434d50545448444642]]], [1.2.156.10197.1.501, NULL], #03480030450221009FAC6120B46709962DE00263244EF53EEFB53644B4A0E7C720C87A9263AD530C022047B9AD1FF04E3831609A7AA9F066A35CD9B2D7EA05BCFF13C0747C4566BCDDF0], [[1, [[[[2.5.4.6, CN]], [[2.5.4.10, ZHCA]], [[2.5.4.3, ZHCA]]], 3855128974485415805], [1.2.156.10197.1.401, NULL], [1.2.156.10197.1.301.1, NULL], #30450220244aef4ccbc97f991648a7c5e4ad768ddecb066f97f847b76e31336b371c491c022100b0b31efcb430210842597582a6c230f24a5db9390342807473063546e9869582]]]]

使用网站的解析效果:


解析结果说明

我们按上面的红框数字说明

1 版本

这里是指签名值版本,意义不明

2 摘要加密算法

这里的OID 1.2.156.10197.1.401是指SM3摘要算法

3 签名原文

由于我是看Itext源码来理解这里的P7结构体含义的,而Itext对这部分的注释是 possible ID_PKCS7_DATA反正我对这里的理解就是签名原文

Itext中在签署时,先把用SHA256加密后的摘要进行了一层封装,这里的secondDigest就是我放进去的签名原文,实际签署的时候是拿这里后造出来的attribute的字节码值去进行RSA加密的,而这个attribute的字节码值就存放在了P7结构体的这里。

ASN1EncodableVector attribute = new ASN1EncodableVector(); ASN1EncodableVector v = new ASN1EncodableVector(); v.add(new ASN1ObjectIdentifier(SecurityIDs.ID_CONTENT_TYPE)); v.add(new DERSet(new ASN1ObjectIdentifier(SecurityIDs.ID_PKCS7_DATA))); attribute.add(new DERSequence(v)); v = new ASN1EncodableVector(); v.add(new ASN1ObjectIdentifier(SecurityIDs.ID_MESSAGE_DIGEST)); v.add(new DERSet(new DEROctetString(secondDigest))); attribute.add(new DERSequence(v));

要提醒的是P7由attach模式和detach模式,前者有签名原文,后者没有签名原文,表现到页面上就是不会有3号红框中的字节码的那一部分

4 签名公钥证书

这一部分建议看X.509数字证书的结构与解析,写的很详细

5 签名信息

这一部分包含了比较重要的几个信息

  • 签名者的信息,包含了由国家组织姓名等别名组成的签名者唯一标识
  • 签名者证书序列号,用于和上面的签名公钥证书的序列号相对应,来确定是用哪个证书解密
  • 接着是摘要算法 1.2.156.10197.1.401对应SM3 Hash Algorithm
  • 签署算法 1.2.156.10197.1.301.1对应SM2-1 Digital Siganture Algorithm 2.156.10197.1.301.1对应SM2-1 Digital Siganture Algorithm
  • 最后是用签署算法签出来的结果
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 14:42:55

从Java到Vue:一名全栈开发者的实战面试记录

从Java到Vue:一名全栈开发者的实战面试记录 面试背景 今天,我作为一位有5年经验的Java全栈开发者,参加了一家互联网大厂的技术面试。整个过程非常专业,面试官对技术细节有着深入的理解,而我也尽力展现了自己的能力。以…

作者头像 李华
网站建设 2026/6/23 17:53:03

教育网站使用CKEditor导入PPT时如何保持动画效果?

山东某国企项目需求实现记录:基于CKEditor4的信创兼容文档处理方案 一、需求分析与技术选型(PHP技术栈适配) 核心需求复核: 编辑器功能: Word粘贴(保留格式图片二进制上传)多格式导入&#xff…

作者头像 李华
网站建设 2026/6/9 21:17:01

互联网CMS系统怎样通过CKEditor实现图文混排导入?

企业网站后台管理系统富文本编辑功能扩展开发记录 一、需求确认与目标拆解 作为江苏某网络公司前端开发工程师,近期接到客户在企业网站后台管理系统文章发布模块的功能扩展需求: 核心功能: Word粘贴:支持从Word复制内容&#x…

作者头像 李华
网站建设 2026/6/21 14:02:33

包装生产线PLC控制系统设计资料(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

包装生产线PLC控制系统设计资料(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码包含完整程序、CAD图pdf版、课程设计指导书和课设报告。 内容包括: -包装生产线控制系统示意图 -包装生产线控制系统控制电路图-包装生产线控制系…

作者头像 李华
网站建设 2026/6/19 5:04:24

治理内耗:团队死气沉沉,不是钱没给够,是“熵”增了

《ToB深水区的生存法则》 第二模块:加固船体——关于“系统”的内功心法(5/12) 朋友,又见面了。 老张约我喝茶,这次不是深夜的大排档,而是工作日的下午。他看起来……怎么说呢,有种奇怪的平静。不是那种问题解决后的轻松,而是像刚刚跑完一场精疲力竭的马拉松,连抱怨的…

作者头像 李华