国密SM2公私钥格式转换与OpenSSL加解密互操作实践

admin 2025-12-22 04:08:20 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文解决了国密SM2算法中Hex格式密钥与OpenSSL所需的PEM格式之间的转换问题,通过编写C脚本成功将十六进制格式的SM2公私钥转换为标准PEM格式,并验证了OpenSSL对转换后密钥的加解密功能,解决了GmSSL与OpenSSL之间的互操作难题,为国密算法在实际项目中的应用提供了实用方案。 综合评分: 85 文章分类: 代码审计,安全工具,应用安全,数据安全,WEB安全


cover_image

国密SM2公私钥格式转换与OpenSSL加解密互操作实践

原创

核点点

核点点

2025年12月16日 21:50 浙江

这是在工作中遇到一个问题,使用国密SM2算法开发,可以选择GMSSL和OpenSSL, 都是支持SM2的。为了验证使用GmSSL生成打公钥和私钥能不能在OpenSSL中对文件加密和解密。

经过下班后的这4个小时摸索,发现将hex格式打公钥和私钥转换为pem格式公钥和私钥,这还是一个难点。

项目使用十六进制字符串(Hex)存储 SM2 密钥,但 OpenSSL 只认 PEM 或 DER 格式。如何将 Hex 密钥转为标准 PEM?又如何用 OpenSSL 验证其加解密功能?

SM2是基于椭圆曲线的公钥密码算法,其密钥有固定格式,私钥本质上是一个256位的大整数,而公钥本质上是椭圆曲线上的点。

└─$ openssl version                            OpenSSL 3.0.18 30 Sep 2025 (Library: OpenSSL 3.0.18 30 Sep 2025)

OpenSSL3.0以上版本支持SM2,但它要求密钥是标准编码格式。

私钥:PKCS#8 格式的 PEM(或 SEC1 DER)

公钥:X.509 SubjectPublicKeyInfo 格式的 PEM

因此,必须将 Hex 转换为 PEM 才能被 OpenSSL 识别。

编写号c脚本,再编译成可执行文件。

└─$ gcc -o import_sm2_openssl import_sm2_openssl_Version2.c -lcrypto

运行import_sm2_openssl

└─$ ./import_sm2_openssl 使用内置示例 hex(可传入 priv_x_y): priv: 26eb76869411a2f70e5e44da0b34836a29f8d25e4902d459c0c44305f975904b pub_x: e6d79458c351870b9e7603af5a56423f36d078d04dcadf773209fd175e00267d pub_y: 18fb36145bcbfa802c393615a4f053f66af9de3e6965e1a5a09433d5ad68e883已写出 sm2_priv_from_hex.pem已写出 sm2_pub_from_hex.pem

使用openssl验证pem文件

└─$ openssl ec -in sm2_priv_from_hex.pem -text -noout read EC keyPrivate-Key: (256 bit)priv:    4b:90:75:f9:05:43:c4:c0:59:d4:02:49:5e:d2:f8:    29:6a:83:34:0b:da:44:5e:0e:f7:a2:11:94:86:76:    eb:26pub:    04:e6:d7:94:58:c3:51:87:0b:9e:76:03:af:5a:56:    42:3f:36:d0:78:d0:4d:ca:df:77:32:09:fd:17:5e:    00:26:7d:18:fb:36:14:5b:cb:fa:80:2c:39:36:15:    a4:f0:53:f6:6a:f9:de:3e:69:65:e1:a5:a0:94:33:    d5:ad:68:e8:83ASN1 OID: SM2

后面是对文件加密和解密验证的过程。整个验证过程成功,说明已经将 Hex 密钥正确转换并可用于标准工具链。


查看原文:《国密SM2公私钥格式转换与OpenSSL加解密互操作实践》

评论:0   参与:  2