由于另一个项目用的是hutool 的国密加密工具,当然底层都是 bouncycastle
方式用的是公钥,和私钥方式。
现在要在Golang里进行转换
代码用到的国密库是
github.com/tjfoc/gmsm
加密:
//国密 公钥加密
func GmEncode(endstr string, publickKey string) (result string, err error) {
//publickKey := ""
//publickKey = "-----BEGIN PUBLIC KEY-----\r\n" +
// "MFkwEwYHKoZIzj0CAQ3=\r\n" +
// "-----END PUBLIC KEY-----"
if !strings.Contains(publickKey, "PUBLIC KEY") {
publickKey = "-----BEGIN PUBLIC KEY-----\r\n" +
publickKey + "\r\n" +
"-----END PUBLIC KEY-----"
}
d2 := []byte(publickKey)
pubMen, err := x509.ReadPublicKeyFromPem(d2)
if err != nil {
println(err.Error())
return
}
msg := []byte(endstr)
ciphertxt, err := sm2.Encrypt(pubMen, msg, nil, sm2.C1C3C2)
if err != nil {
println(err.Error())
return
}
result = hex.EncodeToString(ciphertxt)
return
}
解密
//国密 私解密
func GmDecode(ciphertxt string, privateKey string) (result string, err error) {
//privateKey := ""
//privateKey = "-----BEGIN PRIVATE KEY-----\r\n" +
// "MIGTAgEAMBMGByqGSM49\r\n" +
// "-----END PRIVATE KEY-----"
if !strings.Contains(privateKey, "PRIVATE KEY") {
privateKey = "-----BEGIN PRIVATE KEY-----\r\n" +
privateKey + "\r\n" +
"-----END PRIVATE KEY-----"
}
d := []byte(privateKey)
privateKeys, err := x509.ReadPrivateKeyFromPem(d, nil)
if err != nil {
println(err.Error())
return
}
ciphertxtbyte, err := hex.DecodeString(ciphertxt)
if err != nil {
fmt.Printf(err.Error())
return
}
ciphertxt3, err := sm2.Decrypt(privateKeys, ciphertxtbyte, sm2.C1C3C2)
if err != nil {
fmt.Printf(err.Error())
return
}
result = string(ciphertxt3)
return
}
完美解决。
希望对大家有用。