加密
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

82 lines
2.0 KiB

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
}