Golang 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
这个看起来就是 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>
提取用户证书:
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})
感谢各位的回复,目前好像只能先用 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密钥对,该密钥对包括一个私钥和一个公钥。生成的私钥可以用于签名和加密,而公钥则用于验证和解密。
二、国密私钥的使用
- 签名:使用私钥对消息进行签名,以确保消息的完整性和真实性。
- 加密:在某些特殊场景下,可能需要使用私钥进行加密(虽然通常使用公钥进行加密更为常见)。这可以通过自定义加密逻辑或使用第三方库来实现。
三、注意事项
- 安全性:私钥是敏感信息,必须妥善保管,避免泄露。
- 兼容性:使用国密算法时,需要确保通信双方都支持该算法,否则无法正确进行加密和解密操作。
- 法规遵循:在某些国家和地区,使用加密算法可能受到法律法规的限制,因此在使用前需要了解并遵守相关规定。
希望以上解答能帮助你解决关于Golang中国密私钥的问题。如有其他问题或需要更详细的指导,请随时提问。