国密SM2算法的加密签名消息语法封装解析p7格式signedData

这篇具有很好参考价值的文章主要介绍了国密SM2算法的加密签名消息语法封装解析p7格式signedData。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前文可参考:SM2算法的加密签名消息语法规范(三)如何构造signedData_天对地,雨对风的博客-CSDN博客系列。

这里直接讲openssl asn1解析和封装的部分代码。

国密 p7格式标准,参考:GMT0010-2012

1、p7 签名结构:

p7签名数据结构,国密SM2,安全,c++,ssl,网络安全

 编写结构体GMTSignedData.h

#ifndef _GMTSignedData_H
#define _GMTSignedData_H

#include <openssl\asn1.h>
#include <openssl\asn1t.h>
#include <openssl\safestack.h>
#include <openssl\evp.h>
#include <openssl\pkcs7.h>
#include <openssl\x509.h>

# ifdef __cplusplus
extern "C" {
# endif

/*oid refer to GM/T 0006*/
#define OID_SM2_1 "1.2.156.10197.1.301.1"           /*sm2-1 数字签名算法 */
#define OID_SM2_3 "1.2.156.10197.1.301.3"           /*sm2-3 公钥加密算法*/
#define OID_SM3 "1.2.156.10197.1.401"               /*SM3密码杂凑算法*/
#define OID_SM4 "1.2.156.10197.1.104"               /*SM4分组密码算法*/

/*oid refer to GM/T 0010*/
#define OID_SM2_Data               "1.2.156.10197.6.1.4.2.1"    //SM2算法消息语法规范- 数据类型
#define OID_SM2_Signed             "1.2.156.10197.6.1.4.2.2"    //SM2算法消息语法规范- 签名数据类型
#define OID_SM2_Enveloped          "1.2.156.10197.6.1.4.2.3"    //SM2算法消息语法规范- 数字信封数据类型  
#define OID_SM2_SignedAndEnveloped "1.2.156.10197.6.1.4.2.4"    //SM2算法消息语法规范- 签名及数字信封数据类型
#define OID_SM2_Encrypted          "1.2.156.10197.6.1.4.2.5"    //SM2算法消息语法规范- 加密数据类型
#define OID_SM2_KeyAgreementInfo   "1.2.156.10197.6.1.4.2.6"    //SM2算法消息语法规范- 密钥协商数据类型

typedef struct sm2_signed_st {
	ASN1_INTEGER *version;      /* version 1 */
	STACK_OF(X509_ALGOR) *md_algs; /* md used */
	struct SM2ContentInfo_st *contents;
	STACK_OF(X509) *cert;       /* [ 0 ] */
	STACK_OF(X509_CRL) *crl;    /* [ 1 ] */
	STACK_OF(PKCS7_SIGNER_INFO) *signer_info;
} SM2_SIGNED;

typedef struct SM2_SignedData_st {
	int type;
	union {
		/* NID_pkcs7_data */
		ASN1_OCTET_STRING *data;
		/* sm2_signed */
		SM2_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;
} SM2_SignedData;

DECLARE_ASN1_FUNCTIONS(SM2_SignedData)

typedef	struct SM2ContentInfo_st
{
	ASN1_OBJECT *type;
	SM2_SignedData* sd;
} SM2ContentInfo;

DECLARE_ASN1_FUNCTIONS(SM2ContentInfo)


#  ifdef  __cplusplus
}
#  endif

#endif	//_GMTSignedData_H

注意:SM2_SignedData_st结构中的sign类型修改为SM2_SIGNED,sm2_signed_st结构中的contents 类型修改为SM2_ContentInfo_st。

GMTSignedData.cpp

#pragma once

#include "stdafx.h"	
#include "GMTSignedData.h"

ASN1_NDEF_SEQUENCE(SM2_SIGNED) = {
		ASN1_SIMPLE(SM2_SIGNED, version, ASN1_INTEGER),
		ASN1_SET_OF(SM2_SIGNED, md_algs, X509_ALGOR),
		ASN1_SIMPLE(SM2_SIGNED, contents, SM2ContentInfo),
		ASN1_IMP_SEQUENCE_OF_OPT(SM2_SIGNED, cert, X509, 0),
		ASN1_IMP_SET_OF_OPT(SM2_SIGNED, crl, X509_CRL, 1),
		ASN1_SET_OF(SM2_SIGNED, signer_info, PKCS7_SIGNER_INFO)
} ASN1_NDEF_SEQUENCE_END(SM2_SIGNED)

IMPLEMENT_ASN1_FUNCTIONS(SM2_SIGNED)

ASN1_CHOICE(SM2_SignedData) =
{
	ASN1_SIMPLE(SM2_SignedData, d.data, ASN1_OCTET_STRING),
	ASN1_OPT(SM2_SignedData, d.sign, SM2_SIGNED),
	ASN1_OPT(SM2_SignedData, d.enveloped, PKCS7_ENVELOPE),
	ASN1_OPT(SM2_SignedData, d.signed_and_enveloped, PKCS7_SIGN_ENVELOPE),
	ASN1_OPT(SM2_SignedData, d.digest, PKCS7_DIGEST),
	ASN1_OPT(SM2_SignedData, d.encrypted, PKCS7_ENCRYPT),
	ASN1_OPT(SM2_SignedData, d.other, ASN1_ANY)
}ASN1_CHOICE_END(SM2_SignedData)
IMPLEMENT_ASN1_FUNCTIONS(SM2_SignedData)

ASN1_SEQUENCE(SM2ContentInfo) =
{
	ASN1_SIMPLE(SM2ContentInfo, type, ASN1_OBJECT),
	ASN1_EXP(SM2ContentInfo, sd, SM2_SignedData, 0)
}ASN1_SEQUENCE_END(SM2ContentInfo)
IMPLEMENT_ASN1_FUNCTIONS(SM2ContentInfo)

解码测试:

void test()
{
    //puchData为数据内容,nDataLen为数据长度。自行定义。
    SM2ContentInfo* p7 = NULL;

	p7 = d2i_SM2ContentInfo(&p7, &puchData, nDataLen);

	char oid1[255] = { 0 };
	OBJ_obj2txt(oid1, 255, p7->type, 0);
}

至此可以解码成功,编码参考其他文章。文章来源地址https://www.toymoban.com/news/detail-515776.html

到了这里,关于国密SM2算法的加密签名消息语法封装解析p7格式signedData的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于hutool 封装国密sm2,sm4 加解密算法

    基于hutool 封装国密sm2,sm4 加解密算法 1. 加入依赖包 2. 编码

    2024年02月13日
    浏览(50)
  • 国密SM2算法(JS加密,C#、Java解密)

    常见的渗透测试会将网站登录时密码使用明文传输视为风险。推荐使用国密算法或者RSA算法对密码进行加密传输。 RSA加密(JS加密,C#、Java解密)请参考《RSA对称加密(JS加密,C#、Java解密)》​​​​​​ 本文描述国密SM2算法的实现。 一、工作原理 前端js使用公钥进行加密

    2024年02月02日
    浏览(55)
  • 使用 Java Bouncy Castle实现国密算法SM4、SM3以及SM2的加密

    国密算法的实现借助了Java库函数 Bouncy Castle,加密库安装使用教程请参考链接 SM4,又称为商密算法,是一种分组密码算法,于2012年由中国密码技术研究中心(中国密码学会成员)发布,目前已成为我国国家密码算法,并在多个领域得到了广泛的应用。SM4算法采用了32轮迭代结

    2024年02月16日
    浏览(68)
  • 国密GmSSL v2版本命令行方式生成国密sm2私钥、公钥、签名和验证签名

    GmSSL是国密算法的工具库(主要包含SM2、SM3、SM4和国密SSL证书生成等功能),项目本身是OpenSSL的分支,但是截至文章发布为止,OpenSSL主分支的国密算法并不完善,目前并不支持签名和解签,所以国密算法这块还是需要使用GmSSL工具库。 网上现在并没有v2版本的GmSSL可用的命令

    2024年02月09日
    浏览(49)
  • 小程序 实现 国密 sm2 加密

    第一步:进入微信小程序项目目录下,输入cmd    第二步:加载插件包 第三步:加载成功之后,会参生这个文件夹     第四步:然后在对应的js文件中引入miniprogram-sm-crypto/index.js   第五步: 加密方式,加密方法  

    2024年02月16日
    浏览(37)
  • 前端sm2国密加密解密

    1.下载国密包 2.获取后端的公钥 注sm-crypto使用BC库加解密前端密钥与后端密钥是两队,非常规的base64密钥 前端公钥需要在前面加04占位否则无法解密 3.前端使用公钥进行加密 生成的加密串加04方便后端解密 4.前端使用私钥解密

    2024年02月11日
    浏览(66)
  • 国密SM2前端加密解密示例

    目录 一、 安装sm2依赖 二、编写代码 1、data中绑定数据 2、公钥加密 3、私钥解密 4、按钮绑定一下,数据可见一下 三、完整代码 要改变的数据phone和过程数据copyphone,公钥publicKey和私钥privateKey 具体生成测试公钥私钥可参照SM2加解密 C1为65字节第1字节为压缩标识,这里固定为

    2024年02月03日
    浏览(70)
  • Vue+Springboot前后端完整使用国密算法SM2双公私钥对数据加密传输交互完整解决方案

    Vue+Springboot 前后端完整使⽤国密算法SM2双公私钥对数据加密传输交互完整解决⽅案项⽬,特别是企事业单位的项⽬,第三方测试公司做安全测试时,常常要求使用国密算法,因涉及服务端和客户端的交互,传递关键数据时要求使用SM2非对称加密。 引入相关依赖 这里我使用的

    2024年01月23日
    浏览(49)
  • 国密sm2公钥加密 私钥解密java代码实现

    目录 一、引入jar包 二、生成秘钥对,加解密工具类

    2024年02月11日
    浏览(72)
  • vue普通加密以及国密SM2、SM3、sm4的使用

    sm-crypto:https://www.npmjs.com/package/sm-crypto 1. SM2是非对称加密算法 它是基于椭圆曲线密码的公钥密码算法标准,其秘钥长度256bit,包含数字签名、密钥交换和公钥加密,用于替换RSA/DH/ECDSA/ECDH等国际算法。可以满足电子认证服务系统等应用需求,由国家密码管理局于2010年12月17号

    2023年04月09日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包