rsaEncDec.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package util
  2. import (
  3. "crypto/aes"
  4. "crypto/cipher"
  5. "crypto/rand"
  6. "crypto/rsa"
  7. "crypto/x509"
  8. "encoding/base64"
  9. "encoding/pem"
  10. "errors"
  11. "fmt"
  12. "github.com/gogf/gf/v2/frame/g"
  13. "github.com/gogf/gf/v2/os/gctx"
  14. "io"
  15. "io/ioutil"
  16. "log"
  17. )
  18. var (
  19. PublicKey *rsa.PublicKey
  20. PrivateKey *rsa.PrivateKey
  21. )
  22. func InitPrivatePublicKey() {
  23. // 读取私钥文件
  24. privateKeyBytes, err := ioutil.ReadFile("./etc/rsa_private_key.pem")
  25. if err != nil {
  26. log.Println("无法读取私钥文件:", err)
  27. return
  28. }
  29. // 解码私钥
  30. privateKeyBlock, _ := pem.Decode(privateKeyBytes)
  31. if privateKeyBlock == nil || privateKeyBlock.Type != "PRIVATE KEY" {
  32. log.Println("私钥文件格式错误")
  33. return
  34. }
  35. // 解析私钥
  36. privateKeys, err := x509.ParsePKCS8PrivateKey(privateKeyBlock.Bytes)
  37. if err != nil {
  38. log.Println("私钥解析失败:", err)
  39. return
  40. }
  41. // 转换为RSA类型的私钥
  42. rsaPrivateKey, ok := privateKeys.(*rsa.PrivateKey)
  43. if !ok {
  44. fmt.Println("无法转换为RSA类型的私钥")
  45. return
  46. }
  47. PrivateKey = rsaPrivateKey
  48. // 读取公钥文件
  49. publicKeyBytes, err := ioutil.ReadFile("./etc/rsa_public_key.pem")
  50. if err != nil {
  51. log.Println("无法读取公钥文件:", err)
  52. return
  53. }
  54. log.Println("读取公钥文件")
  55. // 解码公钥
  56. publicKeyBlock, _ := pem.Decode(publicKeyBytes)
  57. if publicKeyBlock == nil || publicKeyBlock.Type != "PUBLIC KEY" {
  58. log.Println("公钥文件格式错误", publicKeyBlock.Type)
  59. return
  60. }
  61. // 解析公钥
  62. publicKeyInterface, err := x509.ParsePKIXPublicKey(publicKeyBlock.Bytes)
  63. if err != nil {
  64. log.Println("公钥解析失败:", err.Error())
  65. return
  66. }
  67. // 转换为公钥类型
  68. rsaPublicKey, ok := publicKeyInterface.(*rsa.PublicKey)
  69. if !ok {
  70. log.Println("无法转换为公钥类型")
  71. return
  72. }
  73. PublicKey = rsaPublicKey
  74. log.Println("初始化公钥成功", PublicKey)
  75. //对称key加密
  76. //AesEncDecKey = g.Cfg().MustGet(gctx.New(), "aesEncDecKey").String()
  77. //使用非对称加密key
  78. //shiftValue := big.NewInt(g.Cfg().MustGet(ctx, "pos").Int64())
  79. //PublicKey.E = int(shiftValue.Int64())
  80. }
  81. func JyAntiEncrypt(plaintext []byte) (out, PKeyStr string, err error) {
  82. if plaintext == nil {
  83. return
  84. }
  85. if PublicKey == nil {
  86. err = errors.New("无效公钥")
  87. return
  88. }
  89. aesEncDecKey := g.Cfg().MustGet(gctx.New(), "aesEncDecKey").String()
  90. if aesEncDecKey == "" {
  91. err = errors.New("密钥获取失败")
  92. return
  93. }
  94. out, err = Encrypt(plaintext, []byte(aesEncDecKey))
  95. if err != nil {
  96. return
  97. }
  98. //非对称加密
  99. var pKeyByte []byte
  100. pKeyByte, err = rsa.EncryptPKCS1v15(rand.Reader, PublicKey, []byte(aesEncDecKey))
  101. if err == nil {
  102. PKeyStr = base64.StdEncoding.EncodeToString(pKeyByte)
  103. }
  104. log.Println("key加密前===", aesEncDecKey)
  105. log.Println("key加密后===", PKeyStr)
  106. //log.Println("加密后内容===", out)
  107. return
  108. }
  109. // 对称加密
  110. func Encrypt(plaintext []byte, key []byte) (string, error) {
  111. block, err := aes.NewCipher(key)
  112. if err != nil {
  113. return "", err
  114. }
  115. ciphertext := make([]byte, aes.BlockSize+len(plaintext))
  116. iv := ciphertext[:aes.BlockSize]
  117. if _, err := io.ReadFull(rand.Reader, iv); err != nil {
  118. return "", err
  119. }
  120. stream := cipher.NewCTR(block, iv)
  121. stream.XORKeyStream(ciphertext[aes.BlockSize:], plaintext)
  122. return base64.StdEncoding.EncodeToString(ciphertext), nil
  123. }
  124. /*func JyAntiDoc(plaintext []byte, pos int) (out string, err error) {
  125. if plaintext == nil {
  126. return "", errors.New("加密内容为空")
  127. }
  128. //exponent := big.NewInt(int64(pos)) // 位移处理的值
  129. //PrivateKey.D = new(big.Int).Mul(PrivateKey.D, exponent)
  130. return string(PrivateKey.D.Bytes()), nil
  131. }*/