package crypter
|
|
|
|
import (
|
|
"encoding/hex"
|
|
"errors"
|
|
"log"
|
|
"strings"
|
|
|
|
"crypto/rand"
|
|
|
|
"fmt"
|
|
|
|
"github.com/tjfoc/gmsm/sm2"
|
|
"github.com/tjfoc/gmsm/x509"
|
|
)
|
|
|
|
func Sm2EncryptWithHexKey(message string, public_key string) (string, error) {
|
|
|
|
sm2PubKey, err := x509.ReadPublicKeyFromHex(public_key)
|
|
if err != nil {
|
|
fmt.Println("Error parsing SM2 public key:", err)
|
|
return "", err
|
|
}
|
|
|
|
// 待加密的数据
|
|
data := []byte(message)
|
|
|
|
// 使用SM2公钥加密数据
|
|
ciphertext, err := sm2.Encrypt(sm2PubKey, data, rand.Reader, sm2.C1C3C2)
|
|
if err != nil {
|
|
log.Println("Error encrypting data with SM2:", err)
|
|
return "", errors.New("Error encrypting data with SM2," + err.Error())
|
|
}
|
|
|
|
if err != nil {
|
|
log.Println("Error encrypting data with SM2:", err)
|
|
return "", errors.New("Error encrypting data with SM2")
|
|
}
|
|
|
|
return hex.EncodeToString(ciphertext), nil
|
|
// return base64.StdEncoding.EncodeToString(ciphertext), nil
|
|
|
|
}
|
|
|
|
func Sm2DecryptWithHexKey(message string, private_key string) (string, error) {
|
|
|
|
sm2PriKey, err := x509.ReadPrivateKeyFromHex(private_key)
|
|
if err != nil {
|
|
fmt.Println("Error parsing SM2 private key:", err)
|
|
return "", err
|
|
}
|
|
// 待加密的数据
|
|
data, err := hex.DecodeString(message) //base64.StdEncoding.DecodeString(message) //
|
|
if err != nil {
|
|
fmt.Println("Error base64 message:", err)
|
|
return "", err
|
|
}
|
|
|
|
// 使用SM2私钥加密数据
|
|
ciphertext, err := sm2.Decrypt(sm2PriKey, data, sm2.C1C3C2)
|
|
if err != nil {
|
|
log.Println("Error decrypting data with SM2:", err)
|
|
return "", errors.New("Error encrypting data with SM2:" + err.Error())
|
|
}
|
|
|
|
return string(ciphertext), nil
|
|
|
|
}
|
|
|
|
func CreateHexKey() (string, string, error) {
|
|
// 生成SM2密钥对
|
|
priv, err := sm2.GenerateKey(rand.Reader)
|
|
if err != nil {
|
|
return "", "", err
|
|
}
|
|
// 将私钥转换为PEM格式的字符串
|
|
privPem := x509.WritePrivateKeyToHex(priv)
|
|
|
|
pubPem := x509.WritePublicKeyToHex(priv.Public().(*sm2.PublicKey))
|
|
|
|
return strings.ToUpper(privPem), strings.ToUpper(pubPem), err
|
|
}
|