go如何对gmssl命令生成的密文做加解密和验签?
1. 运行环境
开发环境: Kubuntu22.04
GO: go version go1.22.1 linux/amd64
2. 问题描述?
由php调用gmssl命令生成的密文(密钥也是用gmssl命令生成的), 想用go进行解密, 用大佬的包github.com/deatil/go-cryptobin
可以解密但是验签一直都不正确,
在包的test文件里面也没有找到示例, 希望大佬们帮忙看下应该调用那些方法去做加解密和验签.
非常感谢!
代码部分
package sm_algorithm
import (
"encoding/base64"
"encoding/json"
"encoding/pem"
"fmt"
"github.com/deatil/go-cryptobin/cryptobin/sm2"
sm2p256 "github.com/deatil/go-cryptobin/gm/sm2"
)
func UseGmsslDecode() {
selfPri := `-----BEGIN EC PARAMETERS-----
BggqgRzPVQGCLQ==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEILVZdvMydZGiSaiwYU0u9sASEi2i3WwYE38MZjRvpGgroAoGCCqBHM9V
AYItoUQDQgAEe6Nc0BJgsyrcKmbpYDox7iX3adD165XA0NnNmDkk/XmJ5xK/Lfnm
MSTaI4vA+UGpGw5kqhKAbFzHJyKjgFz2sQ==
-----END EC PRIVATE KEY-----
`
selfpub := `-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEe6Nc0BJgsyrcKmbpYDox7iX3adD1
65XA0NnNmDkk/XmJ5xK/LfnmMSTaI4vA+UGpGw5kqhKAbFzHJyKjgFz2sQ==
-----END PUBLIC KEY-----
`
stdPri := `-----BEGIN EC PARAMETERS-----
BggqgRzPVQGCLQ==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIDA4QHiJv2gju/CVF8PzisNDfR4z8AH9nopYGATtXj0poAoGCCqBHM9V
AYItoUQDQgAEd5tZ/XlQgV9AbJbU5JuzZimcK/LCOX+xNwdI1XHHkIGl3W0VBmGR
BK3VxkBSvp8tsGkZsxEmA7ngXyECzrDiuA==
-----END EC PRIVATE KEY-----
`
stdPub := `-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEd5tZ/XlQgV9AbJbU5JuzZimcK/LC
OX+xNwdI1XHHkIGl3W0VBmGRBK3VxkBSvp8tsGkZsxEmA7ngXyECzrDiuA==
-----END PUBLIC KEY-----
`
// priBlock, priErr := x509.ParseECPrivateKey([]byte(qnPri))
// fmt.Println(priBlock, " -- ", priErr)
priBlock, prirest := pem.Decode([]byte(qnPri))
fmt.Println(priBlock.Type, " -- ", prirest)
priBlock1, prirest1 := pem.Decode(prirest)
fmt.Println(priBlock1.Type, priBlock1.Bytes, " -- ", prirest1)
pri, priErr := sm2p256.ParseSM2PrivateKey(priBlock1.Bytes)
fmt.Println(pri, priErr)
fmt.Println("------------------------------------- 666")
kdBlock, _ := pem.Decode([]byte(kdPub))
fmt.Println(kdBlock.Type)
pub, pubErr := sm2p256.ParsePublicKey(kdBlock.Bytes)
fmt.Println(pub, pubErr)
// 加密前是一个json字符串 {"data":"qwe"}
encrypted := `MH8CIQC5vLQm7+4JYg5MD39ViKgeuHnAN3BZpzD36pHYOada9QIgLiKsD1GLVRW5bW7sanplYCi+
+e6wuarVffKZDnTTWCkEIMcgRSAXgDLhEJDtmed4LCPdRitNjd3ywVpfi12b5rchBBaObgYaK/8s
h6D5seFQFqp7B246d9lr`
sign := `MEYCIQDr7Vgvt0pfMddIa94dxvc3IkpEvkMhm07A0NEKASHcWwIhANPaZzmsV5m4I3TKkWecCcV1
jGAJaWDORkhDVOkYH2Rt`
fmt.Println(encrypted, " --- ", sign)
encryptedAfter, _ := base64.StdEncoding.DecodeString(encrypted)
signAfter, _ := base64.StdEncoding.DecodeString(sign)
// fmt.Println(string(signAfter))
result, resultErr := pri.DecryptASN1(encryptedAfter, sm2p256.EncrypterOpts{
Mode: sm2p256.C1C3C2,
})
// 解密得到的是 ["{\"data\":\"qwe\"}"] 和加密前的不符, 感觉有点小问题
fmt.Println(string(result), " -- ", resultErr)
resultBool := pri.Verify(encryptedAfter, signAfter, nil)
// resultBool := pub.Verify([]byte(encrypted), signAfter, nil)
fmt.Println("--- sign verify: ", resultBool)
var jsonData interface{}
json.Unmarshal(result, &jsonData)
// fmt.Printf("%T \n", jsonData)
fmt.Println(jsonData)
// ecData := sm2.FromBase64String(encrypted).FromPKCS8PrivateKey(pri.).SetMode("C1C2C3").Decrypt().ToString()
}
为了防止代码复制格式问题, 我把公私钥再贴一下
"selfPri": "-----BEGIN EC PARAMETERS-----
BggqgRzPVQGCLQ==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEILVZdvMydZGiSaiwYU0u9sASEi2i3WwYE38MZjRvpGgroAoGCCqBHM9V
AYItoUQDQgAEe6Nc0BJgsyrcKmbpYDox7iX3adD165XA0NnNmDkk/XmJ5xK/Lfnm
MSTaI4vA+UGpGw5kqhKAbFzHJyKjgFz2sQ==
-----END EC PRIVATE KEY-----"
"selfPub": "-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEe6Nc0BJgsyrcKmbpYDox7iX3adD1
65XA0NnNmDkk/XmJ5xK/LfnmMSTaI4vA+UGpGw5kqhKAbFzHJyKjgFz2sQ==
-----END PUBLIC KEY-----"
"stdPri": "-----BEGIN EC PARAMETERS-----
BggqgRzPVQGCLQ==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIDA4QHiJv2gju/CVF8PzisNDfR4z8AH9nopYGATtXj0poAoGCCqBHM9V
AYItoUQDQgAEd5tZ/XlQgV9AbJbU5JuzZimcK/LCOX+xNwdI1XHHkIGl3W0VBmGR
BK3VxkBSvp8tsGkZsxEmA7ngXyECzrDiuA==
-----END EC PRIVATE KEY-----"
"stdPub": "-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEd5tZ/XlQgV9AbJbU5JuzZimcK/LC
OX+xNwdI1XHHkIGl3W0VBmGRBK3VxkBSvp8tsGkZsxEmA7ngXyECzrDiuA==
-----END PUBLIC KEY-----"
这里是php做解密和验签的操作
@deatil 我刚才在又试了一下, 把验签方法换了一下又正确了
代码这样写的
想在问下大佬在解密之后两边的中括号应该如何处理?有什么更好的方式作处理?