背景

由于另一个项目用的是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
}

完美解决。

希望对大家有用。