文章总结: 本文解决了国密SM2算法中Hex格式密钥与OpenSSL所需的PEM格式之间的转换问题,通过编写C脚本成功将十六进制格式的SM2公私钥转换为标准PEM格式,并验证了OpenSSL对转换后密钥的加解密功能,解决了GmSSL与OpenSSL之间的互操作难题,为国密算法在实际项目中的应用提供了实用方案。 综合评分: 85 文章分类: 代码审计,安全工具,应用安全,数据安全,WEB安全
国密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加解密互操作实践》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论