Golang Go语言中关于国密私钥问题求助

发布于 1周前 作者 htzhanglong 来自 Go语言

测试.sm2 密码: 123456

MIIDSQIBATBHBgoqgRzPVQYBBAIBBgcqgRzPVQFoBDDkLvKllj9ZWhaKU6MSnxBBV5yaF3tEcOk1
vQniWyVzyaQA4F3j/YvDJwEoE8gOF/swggL5BgoqgRzPVQYBBAIBBIIC6TCCAuUwggKJoAMCAQIC
BRBAmQgJMAwGCCqBHM9VAYN1BQAwXDELMAkGA1UEBhMCQ04xMDAuBgNVBAoMJ0NoaW5hIEZpbmFu
Y2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEbMBkGA1UEAwwSQ0ZDQSBURVNUIFNNMiBPQ0Ex
MB4XDTIwMTExOTA4MzExOFoXDTI1MTExOTA4MzExOFowgYkxCzAJBgNVBAYTAkNOMRcwFQYDVQQK
DA5DRkNBIFRFU1QgT0NBMTENMAsGA1UECwwEUFNCQzEZMBcGA1UECwwQT3JnYW5pemF0aW9uYWwt
MjE3MDUGA1UEAwwuMDUxQOmCruWCqOe6v+S4iuaUtuWNleWVhuaIt0BONTEwMTEzMDAwMTg4NzhA
MTBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABJVRC63OKfcL4H324rDOdb4SSlbAjoJDXnK0qmwX
Z59FWmiSqt3ipreljKew4QynjTgR/yfp9yjNgNU8G5pkYdujggEGMIIBAjAfBgNVHSMEGDAWgBRr
/hjaj0I6prhtsy6Igzo0osEw4TAMBgNVHRMBAf8EAjAAMEgGA1UdIARBMD8wPQYIYIEchu8qAQEw
MTAvBggrBgEFBQcCARYjaHR0cDovL3d3dy5jZmNhLmNvbS5jbi91cy91cy0xNC5odG0wOQYDVR0f
BDIwMDAuoCygKoYoaHR0cDovL3VjcmwuY2ZjYS5jb20uY24vU00yL2NybDE0MzU2LmNybDAOBgNV
HQ8BAf8EBAMCBsAwHQYDVR0OBBYEFPiGPZT0oTuRXvkyGoOgviNEWnc1MB0GA1UdJQQWMBQGCCsG
AQUFBwMCBggrBgEFBQcDBDAMBggqgRzPVQGDdQUAA0gAMEUCIQCJDSsVPfhr+gnDASMj5Syt+hxs
amHygPecjCLbcdFQQgIgSXC4musF5Fnj/CpNTqvk9+56FuINkATGS8xRh7kzKBE=

有没有对国密比较了解的,请问一下如何通过 golang 从这个 sm2 文件提取私钥?

或者 gmssl/openssl 有办法直接提取吗?


Golang Go语言中关于国密私钥问题求助

更多关于Golang Go语言中关于国密私钥问题求助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

13 回复

这个看起来就是 pem 文件掐头去尾,应该可以直接用 openssl 看的

更多关于Golang Go语言中关于国密私钥问题求助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这个是 SM2 的证书吧,不包含私钥


不知要用什么命令?
我有试了像下面的命令不行
gmssl x509 -in test.sm2 -passin pass:123456



java 的读取代码如下,可以读取到公钥和私钥.

<br>import cfca.sadk.util.KeyUtil;<br><br>public class HelloWorld {<br> public static void main(String[] args) {<br> PrivateKey priKey = KeyUtil.getPrivateKeyFromSM2("test.sm2", "123456");<br> System.out.println(priKey.toString());<br> System.out.println(args.length);<br> }<br>}<br>

刚才看漏了,我重新看了一下:感觉是 PKCS#12 格式,用 SM4 加密了私钥,稍后我确认下

提取用户证书:

openssl pkcs12 -in 1.p12 -clcerts -nokeys -out cert.pem //pem 格式
openssl pkcs12 -in 1.p12 -clcerts -nokeys -out cert.crt //crt 格式

提取公钥

openssl pkcs12 -in 1.p12 -clcerts -out public_key.pem //pem 格式
openssl pkcs12 -in 1.p12 -clcerts -out cert.crt //crt 格式

提取私钥:

openssl pkcs12 -in 1.p12 -nodes -out private_key.pem

golang 可以试试这个 https://github.com/tjfoc/gmsm
我用过这个库解析 p12 文件



试了,会报错 wrong tag.

用 gmsl 提示

tags don’t match (16 vs {class:0 tag:6 length:10 isCompound:false})

#3 反编译看了一下你提到的 SDK ,感觉这个 key/iv 派生方式,不是标准的 PKCS#12 ,可能是自定义的

既然有 SDK 能够转换为标准格式,你就先转换导出成 PEM/DER ,再在 Go 里面读取好了

#8 抱歉 图贴重复了……



感谢各位的回复,目前好像只能先用 sdk 转换提取再使用了.

另外我刚有找到了这篇文章.

https://www.thunes.com/2021/12/29/digital-signature-usage-of-chinese-cryptography-standards/

太概就是 asn.1 第一段 的那 48 个字节就是 经过 sm4 加密的 私钥.

我有空再研究一下,应该可以通过 sm4 来解密.

#10 看代码是
1. 先将 password 和 \0x00\0x00\0x00\0x00 拼接,然后用 SM3 散列得到 32byte
2. 取前 16B 作为 IV ,后 16B 作为 Key ,使用 SM4(CBC, PKCS7 Padding), 解密得到私钥



感谢,测试了一下确实可以, sm3 散列是 password 和 \0x00\0x00\0x00\0x01 拼接的( #8 图的内容).

先用 asn.1 解析得到 密文,然后解密就可以得到私钥了.

sm4data, _ := hex.DecodeString(“E42EF2A5963F595A168A53A3129F1041579C9A177B4470E935BD09E25B2573C9A400E05DE3FD8BC327012813C80E17FB”)
sm3Hash := sm3.Sm3Sum([]byte{‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, 0, 0, 0, 1})
_ = sm4.SetIV(sm3Hash[:16])
out, e := sm4.Sm4Cbc(sm3Hash[16:], sm4data, false)

关于Golang中国密私钥的问题,以下是一些专业解答和建议:

一、国密私钥的生成

在Golang中,可以使用gmssl库来生成国密私钥。具体来说,你可以使用sm2.GenerateKey函数来生成一个SM2密钥对,该密钥对包括一个私钥和一个公钥。生成的私钥可以用于签名和加密,而公钥则用于验证和解密。

二、国密私钥的使用

  1. 签名:使用私钥对消息进行签名,以确保消息的完整性和真实性。
  2. 加密:在某些特殊场景下,可能需要使用私钥进行加密(虽然通常使用公钥进行加密更为常见)。这可以通过自定义加密逻辑或使用第三方库来实现。

三、注意事项

  1. 安全性:私钥是敏感信息,必须妥善保管,避免泄露。
  2. 兼容性:使用国密算法时,需要确保通信双方都支持该算法,否则无法正确进行加密和解密操作。
  3. 法规遵循:在某些国家和地区,使用加密算法可能受到法律法规的限制,因此在使用前需要了解并遵守相关规定。

希望以上解答能帮助你解决关于Golang中国密私钥的问题。如有其他问题或需要更详细的指导,请随时提问。

回到顶部