资讯详情

国密双证书签发及国密数据信封解析

签发国密双证书,分析国密数字信封

  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长度对应sm在加密结构中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长度对应sm在加密结构中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 sm在加密结构中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. 到此一个国密的数据信封私钥保护结构就解析出来了

标签: uhz液位变送器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

 锐单商城 - 一站式电子元器件采购平台  

 深圳锐单电子有限公司