SM2的P7结构体简单分析

2024-03-21 03:40
文章标签 分析 简单 结构 p7 sm2

本文主要是介绍SM2的P7结构体简单分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SM2签署的P7结构体简单分析

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

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

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

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

翻译:《PKCS#7 - SignedData》

CSR Decoder And Certificate Decoder

解析过程

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

使用到的解析值:

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]]]]

使用网站的解析效果:
SM2的P7结构体

解析结果说明

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

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. 签名者证书序列号,用于和上面的签名公钥证书的序列号相对应,来确定是用哪个证书解密
  3. 接着是摘要算法 1.2.156.10197.1.401对应SM3 Hash Algorithm
  4. 签署算法 1.2.156.10197.1.301.1对应SM2-1 Digital Siganture Algorithm
    2.156.10197.1.301.1对应SM2-1 Digital Siganture Algorithm```
  5. 最后是用签署算法签出来的结果

这篇关于SM2的P7结构体简单分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/831649

相关文章

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程