加密
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

  1. package crypter
  2. import (
  3. "encoding/hex"
  4. "errors"
  5. "log"
  6. "strings"
  7. "crypto/rand"
  8. "fmt"
  9. "github.com/tjfoc/gmsm/sm2"
  10. "github.com/tjfoc/gmsm/x509"
  11. )
  12. func Sm2EncryptWithHexKey(message string, public_key string) (string, error) {
  13. sm2PubKey, err := x509.ReadPublicKeyFromHex(public_key)
  14. if err != nil {
  15. fmt.Println("Error parsing SM2 public key:", err)
  16. return "", err
  17. }
  18. // 待加密的数据
  19. data := []byte(message)
  20. // 使用SM2公钥加密数据
  21. ciphertext, err := sm2.Encrypt(sm2PubKey, data, rand.Reader, sm2.C1C3C2)
  22. if err != nil {
  23. log.Println("Error encrypting data with SM2:", err)
  24. return "", errors.New("Error encrypting data with SM2," + err.Error())
  25. }
  26. if err != nil {
  27. log.Println("Error encrypting data with SM2:", err)
  28. return "", errors.New("Error encrypting data with SM2")
  29. }
  30. return hex.EncodeToString(ciphertext), nil
  31. // return base64.StdEncoding.EncodeToString(ciphertext), nil
  32. }
  33. func Sm2DecryptWithHexKey(message string, private_key string) (string, error) {
  34. sm2PriKey, err := x509.ReadPrivateKeyFromHex(private_key)
  35. if err != nil {
  36. fmt.Println("Error parsing SM2 private key:", err)
  37. return "", err
  38. }
  39. // 待加密的数据
  40. data, err := hex.DecodeString(message) //base64.StdEncoding.DecodeString(message) //
  41. if err != nil {
  42. fmt.Println("Error base64 message:", err)
  43. return "", err
  44. }
  45. // 使用SM2私钥加密数据
  46. ciphertext, err := sm2.Decrypt(sm2PriKey, data, sm2.C1C3C2)
  47. if err != nil {
  48. log.Println("Error decrypting data with SM2:", err)
  49. return "", errors.New("Error encrypting data with SM2:" + err.Error())
  50. }
  51. return string(ciphertext), nil
  52. }
  53. func CreateHexKey() (string, string, error) {
  54. // 生成SM2密钥对
  55. priv, err := sm2.GenerateKey(rand.Reader)
  56. if err != nil {
  57. return "", "", err
  58. }
  59. // 将私钥转换为PEM格式的字符串
  60. privPem := x509.WritePrivateKeyToHex(priv)
  61. pubPem := x509.WritePublicKeyToHex(priv.Public().(*sm2.PublicKey))
  62. return strings.ToUpper(privPem), strings.ToUpper(pubPem), err
  63. }