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

article/2025/9/4 19:19:45

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_source=itdadao&utm_medium=referral
技术科普 | 国密算法在Ultrain区块链中的运用 https://blog.csdn.net/Tramp_1/article/details/111603396

1、sm2数字信封格式:

有效部分
公钥:04|X|Y,共65字节
私钥:整数,共32字节
SM2EnvelopedKey ::= SEQUENCE {symalgid        AlgorithmIdentifier,        -- 对称算法IDsymalgkey       SM2Cipher,                  -- 对称算法密钥(被签名证书公钥加密)asympubkey      BIT STRING,                 -- 加密证书公钥asymprvkey      BIT STRING                  -- 加密证书私钥(被对称算法加密)
}
typedef struct SM2Cipher_st {ASN1_INTEGER *xCoordinate;                                // x分量(随机,非公钥)ASN1_INTEGER *yCoordinate;                                // y分量(随机,非公钥)ASN1_OCTET_STRING *hash;                                  // 杂凑值ASN1_OCTET_STRING *cipherText;                            // 密文
} SM2Cipher;
AlgorithmIdentifier ::= SEQUENCE {algorithm       OBJECT IDENTIFIER,parameters      ANY DEFINED BY algorithm OPTIONAL
}区分普通的数字信封格式,见下图(openssl暂不支持sm2算法的私钥p7信封格式生成,但是支持sm2算法私钥的p7解密,生成p7可以在外部使用gmssl命令行生成)
typedef struct pkcs7_enveloped_st {ASN1_INTEGER *version;      /* version 0 */STACK_OF(PKCS7_RECIP_INFO) *recipientinfo;PKCS7_ENC_CONTENT *enc_data;
} PKCS7_ENVELOPE;
typedef struct pkcs7_recip_info_st {ASN1_INTEGER *version;      /* version 0 */PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;X509_ALGOR *key_enc_algor;ASN1_OCTET_STRING *enc_key;X509 *cert;                 /* get the pub-key from this */const PKCS7_CTX *ctx;
} PKCS7_RECIP_INFO;
typedef struct pkcs7_enc_content_st {ASN1_OBJECT *content_type;X509_ALGOR *algorithm;ASN1_OCTET_STRING *enc_data; /* [ 0 ] */const EVP_CIPHER *cipher;const PKCS7_CTX *ctx;
} PKCS7_ENC_CONTENT;
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    2int 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_CTX ctx;
} PKCS7;

在这里插入图片描述

2、代码中sm2数字信封加密解密步骤

加密(将加密私钥明文转换为sm2信封格式密文)
1、将加密证书私钥转换为der格式(二进制)
2、设置对称算法ID,公钥有效数据部分,私钥有效数据部分对称算法ID默认为0x2a, 0x81, 0x1c, 0xcf, 0x55, 0x01, 0x68, 0x01(即sm4_ecb,1.2.156.10197.1.104.1)公钥数据前缀为0xa1, 0x44, 0x03, 0x42, 0x00,截取65字节明文私钥数据前缀为0x02, 0x01, 0x01, 0x04, 0x20,截取32字节明文
3、创建对称密钥,加密私钥有效数据部分使用sm4_ecb算法和创建的128位随机密钥,加密私钥32字节得到32字节密文
4、使用签名公钥加密对称密钥,密文转换为二进制使用sm2算法加密128位对称密钥,得到对称密钥密文(此处我使用了openssl已实现的sm2算法加密,因此不需要按照国标文档里深入底层计算预处理结果Za)
5、将对称算法ID,对称密钥密文,公钥,私钥密文转换为信封格式数据(此处可以参考openssl内部代码实现结构体和i2d格式转换)
6、将der二进制信封转换为pem格式(base64),输出
解密(将sm2数字信封格式转换为加密私钥)
1、p7(pem格式)转二进制
2、解析二进制,得到对称算法ID,对称算法密钥密文,加密证书公钥,加密证书私钥密文二进制
3、对称算法ID转具体算法名称二进制字符串ID转换为OID(1.2.156.10197.1.104.1)进行匹配
4、签名私钥解密,得到对称算法密钥使用sm2算法解密对称密钥密文,得到对称密钥明文
5、对称算法解密,得到加密私钥有效数据,32字节使用sm4_ecb算法和对称密钥明文,解密私钥32字节密文得到32字节明文
6、拼接公钥,私钥得到完整加密私钥der二进制格式,有两种方式(此处拼接方法是我自己创造的,有什么其他好方法欢迎共享)
(1)"30770201010420"+32字节私钥+"a00a06082a811ccf5501822da144034200"+65字节公钥	(2)"308187020100301306072A8648CE3D020106082A811CCF5501822D046D306B0201010420"+32字节私钥+"A144034200"+65字节公钥
7、转换der得到pem格式文件

3、sm2数字信封格式详解

p7pem格式(base64)
MIHtMAkGByqBHM9VAWgweQIgMtHF6qRZOKJxnT5MYSv4eK/LjJHmp7b/p7AaP6cqigkCIQCFpr2MmakaMxVH1u+Yzxf+oJSFETwiZacB4j3NohlbHwQgO50Hic8tDYBLedIbuqsS2lXvPDYtyuLUrQKyGRI1Y9gEEA5lnd3Yxujfedxk6Cam9ygDQgAEnrxloYKoCRYc3Lh96OYupmT7V7X/BBgdcfCMQnsB7nQhD6FVwgKoN0JMwMqHXGg6l891FCfuTh5N51YqOAqBwwMhAHiB9UgemN+Xz39qsdMeVl4SKdmHHkPkKmNOBJjoqHorp7二进制
3081ED300906072A811CCF5501683079022032D1C5EAA45938A2719D3E4C612BF878AFCB8C91E6A7B6FFA7B01A3FA72A8A0902210085A6BD8C99A91A331547D6EF98CF17FEA09485113C2265A701E23DCDA2195B1F04203B9D0789CF2D0D804B79D21BBAAB12DA55EF3C362DCAE2D4AD02B219123563D804100E659DDDD8C6E8DF79DC64E826A6F728034200049EBC65A182A809161CDCB87DE8E62EA664FB57B5FF04181D71F08C427B01EE74210FA155C202A837424CC0CA875C683A97CF751427EE4E1E4DE7562A380A81C30321007881F5481E98DF97CF7F6AB1D31E565E1229D9871E43E42A634E0498E8A87A2B主要包含(1)(2)(3)(4)3081ed30090607
(1)对称算法ID:sms4		    			  			2a811ccf550168
(2)对称算法密钥密文(sm2加密):								3079022032d1c5eaa45938a2719d3e4c612bf878afcb8c91e6a7b6ffa7b01a3fa72a8a0902210085a6bd8c99a91a331547d6ef98cf17fea09485113c2265a701e23dcda2195b1f04203b9d0789cf2d0d804b79d21bbaab12da55ef3c362dcae2d4ad02b219123563d804100e659dddd8c6e8df79dc64e826a6f728拆解后:
30790220
x:32d1c5eaa45938a2719d3e4c612bf878afcb8c91e6a7b6ffa7b01a3fa72a8a09
022100
y:85a6bd8c99a91a331547d6ef98cf17fea09485113c2265a701e23dcda2195b1f
0420
m:3b9d0789cf2d0d804b79d21bbaab12da55ef3c362dcae2d4ad02b219123563d8
0410
c:0e659dddd8c6e8df79dc64e826a6f728
(c结构密文)
04|x|y|m|c
0432D1C5EAA45938A2719D3E4C612BF878AFCB8C91E6A7B6FFA7B01A3FA72A8A0985A6BD8C99A91A331547D6EF98CF17FEA09485113C2265A701E23DCDA2195B1F3B9D0789CF2D0D804B79D21BBAAB12DA55EF3C362DCAE2D4AD02B219123563D80E659DDDD8C6E8DF79DC64E826A6F728使用sm2签名私钥解密(2)后得到
对称密钥明文:EP/+Xo55MBhI3e1GTyghhQ==:10FFFE5E8E79301848DDED464F282185
(3)加密证书公钥:									  
034200
有效数据明文(65B):049ebc65a182a809161cdcb87de8e62ea664fb57b5ff04181d71f08c427b01ee74210fa155c202a837424cc0ca875c683a97cf751427ee4e1e4de7562a380a81c3
(4)加密证书私钥(加密):
032100
有效数据密文(32B):7881f5481e98df97cf7f6ab1d31e565e1229d9871e43e42a634e0498e8a87a2b使用(2)中对称密钥解密得到sm2私钥有效数据明文
cipher.txt.bin:7881f5481e98df97cf7f6ab1d31e565e1229d9871e43e42a634e0498e8a87a2b #需要将十六进制转换为二进制文件
openssl enc -d -sm4-ecb -in cipher.txt.bin -K 10FFFE5E8E79301848DDED464F282185 -p -out plain.txt.bin #解密得到明文
加密验证
plain.txt.bin:71e49d78b44c6fd54331869f343c537c0a736954ae22cd50277ae587a7e6762e #需要将十六进制转换为二进制文件
openssl enc -e -sm4-ecb -nopad -in plain.txt.bin  -K 10FFFE5E8E79301848DDED464F282185 -p -out cipher.txt.bin #使用明文加密得到加密证书公钥der:
3059301306072a8648ce3d020106082a811ccf5501822d034200
049ebc65a182a809161cdcb87de8e62ea664fb57b5ff04181d71f08c427b01ee74210fa155c202a837424cc0ca875c683a97cf751427ee4e1e4de7562a380a81c3加密证书私钥der(格式1):
308187020100301306072A8648CE3D020106082A811CCF5501822D046D306B0201010420
私钥有效数据  						71E49D78B44C6FD54331869F343C537C0A736954AE22CD50277AE587A7E6762EA144034200
公钥有效数据049EBC65A182A809161CDCB87DE8E62EA664FB57B5FF04181D71F08C427B01EE74210FA155C202A837424CC0CA875C683A97CF751427EE4E1E4DE7562A380A81C3加密证书私钥der(格式2):
30770201010420
私钥有效数据							71e49d78b44c6fd54331869f343c537c0a736954ae22cd50277ae587a7e6762e
a00a06082a811ccf5501822da144034200													
公钥有效数据					049ebc65a182a809161cdcb87de8e62ea664fb57b5ff04181d71f08c427b01ee74210fa155c202a837424cc0ca875c683a97cf751427ee4e1e4de7562a380a81c3

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

相关文章

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

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

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

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

利用EXCEL进行数据爬虫

说到爬虫,相信大家出现在脑海中的一定是python。python在最近几年确实热火朝天,对于不会编程人员来说,利用好EXCEL一样也可以爬取一些简单的数据,并且方式非常简单。 1.爬取东方财富网上基金信息。网址为:基金收益排行…

利用Excel数据爬虫

1、在Excel里数据里打开自网站。 2、选择高级部分 URL部分和URL预览填写为目标(需要爬取数据的网址)的URL地址 命令超时选择1分钟即可。 HTTP请求标头参数 第一步点击网络 第二部点击消息头部 第三部找到User-Agent的value复制 3、最后点击加载 就…

爬虫抓取网络数据时经常遇到的六种问题

随着互联网时代的不断发展,爬虫采集已经成为了目前最为主流的数据获取方式。使用爬虫软件自动从网站中提取数据可以节省大量的时间和精力。接下来就一起来看看爬虫抓取网络数据时经常遇到的六种问题吧: 1.IP阻止 IP阻止是指网站所有者主动阻止用户的IP地…

Jsoup实现网络爬虫抓取数据

Jsoup实现网络爬虫抓取数据 在编写一个软件,例如关于教务软件的时候,需要获取学校官网的一些新闻信息来充实自己的软件,而又不会专门提供相关的api接口,此时就需要我们自己动手来抓取感兴趣的信息。有人会问抓取网站的信息是否会…