国密双证书的签发,及国密数字信封解析

  1. 产生签名密钥对
    gmssl ecparam -genkey -name sm2p256v1 -text -out server_sign.key

  2. 产生p10签名请求
    gmssl req -new -key server_sign.key -out sign_pub_key_csr.req

3.得到第三方国密ca签发的双证书和国密p7数据信封
sign.p7b、encrypt.p7b、private.data
这里面最关键是提取private.data中的加密私钥

4.查看private.data内容
其中base64的内容如下:
MIIBDjALBgcqgRzPVQFmBQAweAIgWotEEMOAFqPuYl9bJV11+HH9LhikOshrCLh6FN4sYKACIM1nQysp/z/v9KPf+NBX02ttWgaPQ62mvLKTg4IEKFPJBCBccsfEeteWvg4phF6wogbEEfoQ7hkbK21Wz4AnmoIaRAQQCYPqSzlEQnE9ne5uhZ2dhgNCAASI77e3SIfpZh8ENRLk1ygap0rg8HiJ3qrc5TC7rrFZpnGjvaVmNvlPASfSeeuZY8wFEXVffX4HjlNTk/wlAffEA0EAwg3YBPAF7RJIaHDNlQLf6sIN2ATwBe0SSGhwzZUC3+rOBB8abOM7IraacLGrs17dl+NLXVcyxMQLOQqxQke7vA==

可以将其转换成16进制
30 82 01 0E 30 0B 06 07 2A 81 1C CF 55 01 66 05
00

30 78
02 20 (下面的x020长度对应sm2加密结构中的x)
5A 8B 44 10 C3 80 16 A3 EE 62 5F 5B 25 5D 75 F8
71 FD 2E 18 A4 3A C8 6B 08 B8 7A 14 DE 2C 60 A0
02 20 (下面的x020长度对应sm2加密结构中的y)
CD 67 43 2B 29 FF 3F EF F4 A3 DF F8 D0 57 D3 6B
6D 5A 06 8F 43 AD A6 BC B2 93 83 82 04 28 53 C9
04 20 (下面对应sm2加密结构中的hash)
5C 72 C7 C4 7A D7 96 BE 0E 29 84 5E B0 A2 06 C4
11 FA 10 EE 19 1B 2B 6D 56 CF 80 27 9A 82 1A 44
04 10 (下面对应sm2加密结构中的c)
09 83 EA 4B 39 44 42 71 3D 9D EE 6E 85 9D 9D 86

03 42 00 (加密公钥信息)
04 88 EF B7 B7 48 87 E9 66 1F 04 35 12 E4 D7 28
1A A7 4A E0 F0 78 89 DE AA DC E5 30 BB AE B1 59
A6 71 A3 BD A5 66 36 F9 4F 01 27 D2 79 EB 99 63
CC 05 11 75 5F 7D 7E 07 8E 53 53 93 FC 25 01 F7
C4

03 41 00 (对称加密后的加密私钥密文)
C2 0D D8 04 F0 05 ED 12 48 68 70 CD 95 02 DF EA
C2 0D D8 04 F0 05 ED 12 48 68 70 CD 95 02 DF EA
CE 04 1F 1A 6C E3 3B 22 B6 9A 70 B1 AB B3 5E DD
97 E3 4B 5D 57 32 C4 C4 0B 39 0A B1 42 47 BB BC

  1. 解析对称算法ID
    SM2EnvelopedKey ::= SEQUENCE {
    symalgid AlgorithmIdentifier, – 对称算法ID
    symalgkey SM2Cipher, – 对称算法密钥(被签名证书公钥加密)
    asympubkey BIT STRING, – 加密证书公钥
    asymprvkey BIT STRING – 加密证书私钥(被对称算法加密)
    }

30 82
01 0E
30 0B
06 07
2A 81 1C CF 55 01 66 (对称算法ID)
05 00
其中 2A811CCF550166代表SM1-ECB,如果遇到2A811CCF550168代表SM4-ECB。

  1. 解析sm2的公钥加密的对称密钥
    struct SM2CiphertextVaule_st {
    BIGNUM *xCoordinate;
    BIGNUM *yCoordinate;
    ASN1_OCTET_STRING *hash;
    ASN1_OCTET_STRING *ciphertext;
    };
    这就是gmssl中的sm2加密结构体
    SM2CiphertextValue *cval = SM2CiphertextValue_new();unsigned char x[32] = {0x5a,0x8b,0x44,0x10,0xc3,0x80,0x16,0xa3,0xee,0x62,0x5f,0x5b,0x25,0x5d,0x75,0xf8,0x71,0xfd,0x2e,0x18,0xa4,0x3a,0xc8,0x6b,0x08,0xb8,0x7a,0x14,0xde,0x2c,0x60,0xa0};unsigned char y[32] = {0xcd,0x67,0x43,0x2b,0x29,0xff,0x3f,0xef,0xf4,0xa3,0xdf,0xf8,0xd0,0x57,0xd3,0x6b,0x6d,0x5a,0x06,0x8f,0x43,0xad,0xa6,0xbc,0xb2,0x93,0x83,0x82,0x04,0x28,0x53,0xc9};unsigned char hash[32] = {0x5c, 0x72, 0xc7, 0xc4, 0x7a, 0xd7, 0x96,0xbe, 0x0e, 0x29, 0x84, 0x5e, 0xb0, 0xa2, 0x06, 0xc4, 0x11, 0xfa, 0x10, 0xee,0x19, 0x1b, 0x2b, 0x6d, 0x56, 0xcf, 0x80, 0x27, 0x9a, 0x82, 0x1a, 0x44};unsigned char cipher[16] = {0x09, 0x83, 0xea, 0x4b, 0x39, 0x44,0x42, 0x71, 0x3d, 0x9d, 0xee, 0x6e, 0x85, 0x9d, 0x9d, 0x86};if (!BN_bin2bn(x, 32, cval->xCoordinate)) {goto end;}if (!BN_bin2bn(y, 32, cval->yCoordinate)) {goto end;}if (!ASN1_OCTET_STRING_set(cval->hash, hash, 32)) {goto end;}if (!ASN1_OCTET_STRING_set(cval->ciphertext, cipher, 16)) {goto end;}

然后就可以调用SM2_do_decrypt进行解密了。如果不知道怎么写代码的,可以参与gmssl sm2utl 命令是如何解密的。
解密后的对称密钥:
4e e1 71 bf a0 3b 6f 80 ae b2 1c a9 48 a5 62 36

  1. 用对称密钥进行解密
    因为从算法id那里得到我们是SM1-ECB,所以进行采用sm1进行解密,因为sm1必须要用硬件解密,所以需要使用硬件进行解密。
    03 41 00 (对称加密后的加密私钥密文)
    C2 0D D8 04 F0 05 ED 12 48 68 70 CD 95 02 DF EA
    C2 0D D8 04 F0 05 ED 12 48 68 70 CD 95 02 DF EA
    CE 04 1F 1A 6C E3 3B 22 B6 9A 70 B1 AB B3 5E DD
    97 E3 4B 5D 57 32 C4 C4 0B 39 0A B1 42 47 BB BC
    对称加密后的加密内容是后32位:
    CE 04 1F 1A 6C E3 3B 22 B6 9A 70 B1 AB B3 5E DD
    97 E3 4B 5D 57 32 C4 C4 0B 39 0A B1 42 47 BB BC
    对称密钥:
    4e e1 71 bf a0 3b 6f 80 ae b2 1c a9 48 a5 62 36

然后用硬件解密后得到加密证书私钥:
ac 99 dd 84 3e 73 d4 8e 68 97 ea b8 20 01 69 c9
47 5b 99 71 6a e3 f3 10 4d db 39 3f a6 8c ae da

  1. 用32位加密私钥和65位公钥数据组装加密私钥pem文件
EC_KEY *eckey = EC_KEY_new();
EC_KEY_set_group(eckey, group); // 这里的group是sm2的group//设置32位私钥
BIGNUM *priv_key = BN_new();
unsigned char pri_hex[32] = {0xac, 0x99, ....}; //这里32位私钥的hex数据
priv_key = BN_bin2bn(pri_hex, 32, priv_key);
EC_KEY_set_private_key(eckey, priv_key);//设置65位公钥
BIGNUM *pub_key = BN_new();
unsigned char pub_hex[65] = {0x04, 0x88, ....}; //这里65位公钥的hex数据
pub_key = BN_bin2bn(pub_hex, 65, pub_key);
EC_POINT *pubkey = EC_POINT_bn2point(group, pub_key, NULL, NULL);
EC_KEY_set_public_key(eckey, pubkey);// 最后写成pem文件
PEM_write_bio_ECPrivateKey(out, eckey, NULL, NULL, 0, NULL, NULL);
  1. 到此一个国密的数据信封私钥保护结构就解析出来了

国密双证书签发及国密数据信封解析相关推荐

  1. gmssl国密双证书制作

    gmssl国密双证书制作 前言 gmssl制作国密双证书 1 配置前提环境: 2 生成根密钥和证书 3 生成用户密钥,并使用根证密钥签发用户证书 4 签名证书和加密证书 5 生成pfx格式证书 6 查 ...

  2. 新手入坑GMSSL(三)GMSSL双证书与360国密浏览器通讯

    首先申明,我不是密码学的专业人员,没有这方面知识基础,这个以及接下来的博客都是我根据网上能找到的资料.博客,一点点摸索总结出来的.但项目必须得做身不由己,无奈只能自己试一试了. 如果有哪里不对的地方, ...

  3. 国密SSL协议之双证书体系

    1 背景 国密SSL协议使用双证书体系.本文描述了国密双证书体系的组成和差别,并描述了在U盾里面的使用情况. 2 国密SSL双证书 国密SSL协议使用双证书体系,分别称为签名证书和加密证书,服务器和用 ...

  4. sm2证书生成(双证书)

    国密双证书 双证书:包括签名证书和加密证书 双证书需要用硬件加密机生成,用gmssl命令无法生成 cfca下载双证书 1.访问https://cstest.cfca.com.cn/ 2.选:Web服务 ...

  5. 国家为什么要使用双证书体系?

    单证书 用户使用唯一的证书及对应的私钥进行签名和加密操作.通常国际上使用一张证书实现加 密和签名. 签名时:用户A(简称A)使用自己的私钥加密信息的摘要,即签名操作:用户B(简称 B)使用A的公钥进行 ...

  6. 国密SSL证书申请免费试用

    沃通提供国密SSL证书免费申请试用服务,一次申请可同时签发SM2/RSA双算法证书,试用周期1个月,用于测试国密SM2 SSL证书的运行效果和SM2/RSA双证书部署效果. 试用产品:SM2/RSA双 ...

  7. 国密SSL证书正式上线,知道创宇云防御助力金融和重要领域完成国密升级改造...

    ★ 在网络社会化.社会网络化的今天,网络空间正在加速演变为各国国家安全的新战场,密码作为网络空间安全保障和信任机制构建的核心技术与基础支撑,直接关系国家政治安全.经济安全.国防安全和信息安全,也是国家 ...

  8. 国密SSL证书保障网站安全

    国内很多网站为了网站安全都会部署SSL证书,目前市面上申请到的SSL服务器证书基本都是采用RSA国际算法,市场上80%的SSL服务器证书都是由国外CA尤其是美国为主的CA签发的证书. 网络安全就是国家 ...

  9. linux如何配浏览器证书,部署国密SSL证书,如何兼容国际主流浏览器?

    转自: 国密算法在主流操作系统.浏览器等客户端中,还没有实现广泛兼容.因此,在面向开放互联网的产品应用中,国密算法无法得到广泛应用.比如,在SSL证书应用领域,由于国际主流浏览器不信任国密算法,如果服 ...

最新文章

  1. Heartrate:一个牛逼的工具,Python执行实时可视化
  2. Vue多个单文件组件使用
  3. 深层神经网络与优化算法
  4. 小型企业Exchange server 2010高可用性方案要注意咯!
  5. 谷歌用量子计算机造出「时间晶体」,挑战热力学第二定律
  6. Silverlight视频教程、资源下载。如果你觉得看图文不够形象,不够生动,那就看看视频吧。...
  7. PyQt5 技术篇-设置窗口启用默认桌面位置,按屏幕比例
  8. delphi面向对象(1)
  9. Hbase(2)——基础语句(2)
  10. 数据库-数据存储引擎
  11. 手把手教你python实现量价形态选股知乎_【手把手教你】Python实现基于事件驱动的量化回测...
  12. 实体验证---测试代码
  13. TP框架中ajax post请求时提示404
  14. u大师u盘装系统win7_怎么用u盘装win7系统
  15. Kmeans算法解析(非常详细)
  16. TensorFlow/Python的一个范例代码及阅读说明
  17. firewalls 查看防火墙状态_5条命令玩转Linux系统防火墙
  18. 刘意-java基础视频(API-网络编程)笔记
  19. Java爬取酷狗音乐歌单
  20. Nginx下载及安装详细步骤

热门文章

  1. Maxima解方程的一点收获
  2. 数据获取与处理(以CV任务为主)
  3. 【未】Dynamic incentive schemes for managing dockless bike-sharing systems
  4. mysql导入数据报错_MySQL导入数据库时报错,MySQL server has go away
  5. 迪士尼机器人芭蕾舞_两个自由度实现惊艳后空翻 迪士尼杂技机器人献拿手好戏...
  6. HTML5期末大作业:基于HTML+CSS+JavaScript校园文化企业网站模板【学生网页设计作业源码】
  7. 中国移动物联网开放平台OneNET学习笔记(1)——设备接入(MQTT协议)OneNET Studio篇
  8. pythonl练习1
  9. 开发者百度地图的使用,做一个小demo,ak秘钥,
  10. C语言趣味一百道 第25题 2017_12_24