rsaEncDec.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. package util
  2. import (
  3. log "app.yhyue.com/moapp/jylog"
  4. "context"
  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. "io/ioutil"
  14. "math/big"
  15. )
  16. var (
  17. PublicKey *rsa.PublicKey
  18. PrivateKey *rsa.PrivateKey
  19. Displacement int64 = 9
  20. ctx = context.TODO()
  21. )
  22. func init() {
  23. //initPrivatePublicKey()
  24. }
  25. func JyAntiEncrypt(in []byte, pos int) (out string, err error) {
  26. return base64.StdEncoding.EncodeToString(in), err
  27. }
  28. func initPrivatePublicKey() {
  29. // 读取私钥文件
  30. privateKeyBytes, err := ioutil.ReadFile("./etc/rsa_private_key.pem")
  31. if err != nil {
  32. g.Log().Errorf(ctx, "无法读取私钥文件:%v", err)
  33. return
  34. }
  35. // 解码私钥
  36. privateKeyBlock, _ := pem.Decode(privateKeyBytes)
  37. if privateKeyBlock == nil || privateKeyBlock.Type != "PRIVATE KEY" {
  38. log.Println("私钥文件格式错误")
  39. return
  40. }
  41. // 解析私钥
  42. privateKeys, err := x509.ParsePKCS8PrivateKey(privateKeyBlock.Bytes)
  43. if err != nil {
  44. log.Println("私钥解析失败:", err)
  45. return
  46. }
  47. // 转换为RSA类型的私钥
  48. rsaPrivateKey, ok := privateKeys.(*rsa.PrivateKey)
  49. if !ok {
  50. fmt.Println("无法转换为RSA类型的私钥")
  51. return
  52. }
  53. PrivateKey = rsaPrivateKey
  54. // 读取公钥文件
  55. publicKeyBytes, err := ioutil.ReadFile("./etc/rsa_public_key.pem")
  56. if err != nil {
  57. log.Println("无法读取公钥文件:", err)
  58. return
  59. }
  60. // 解码公钥
  61. publicKeyBlock, _ := pem.Decode(publicKeyBytes)
  62. if publicKeyBlock == nil || publicKeyBlock.Type != "PUBLIC KEY" {
  63. log.Println("公钥文件格式错误", publicKeyBlock.Type)
  64. return
  65. }
  66. // 解析公钥
  67. publicKeyInterface, err := x509.ParsePKIXPublicKey(publicKeyBlock.Bytes)
  68. if err != nil {
  69. log.Println("公钥解析失败:", err.Error())
  70. return
  71. }
  72. // 转换为公钥类型
  73. rsaPublicKey, ok := publicKeyInterface.(*rsa.PublicKey)
  74. if !ok {
  75. log.Println("无法转换为公钥类型")
  76. return
  77. }
  78. PublicKey = rsaPublicKey
  79. //Displacement = g.Cfg().MustGet(gctx.New(), "displacement", 9).Int64()
  80. }
  81. // DisplacementEncryption 位移加密
  82. func DisplacementEncryption(content string) (string, error) {
  83. if content == "" {
  84. return "", errors.New("加密内容为空")
  85. }
  86. plaintext := []byte(content)
  87. if Displacement != 0 { // 位移处理的值
  88. shiftValue := big.NewInt(Displacement)
  89. PublicKey.E = int(shiftValue.Int64())
  90. }
  91. // 使用公钥加密数据
  92. ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, PublicKey, plaintext)
  93. if err != nil {
  94. log.Println("加密失败:", err)
  95. return "", err
  96. }
  97. return string(ciphertext), nil
  98. }
  99. // DisplacementDecryption 位移解密
  100. func DisplacementDecryption(content string) (string, error) {
  101. if content == "" {
  102. return "", errors.New("解密内容为空")
  103. }
  104. if PrivateKey == nil {
  105. return "", errors.New("无效私钥")
  106. }
  107. if Displacement != 0 {
  108. exponent := big.NewInt(Displacement) // 位移处理的值
  109. PrivateKey.D = new(big.Int).Mul(PrivateKey.D, exponent)
  110. }
  111. ciphertext, err := base64.StdEncoding.DecodeString(content)
  112. if err != nil {
  113. log.Println("密文解码失败:", err)
  114. return "", errors.New("密文解码失败")
  115. }
  116. // 使用私钥解密数据
  117. decryptedText, err := rsa.DecryptPKCS1v15(rand.Reader, PrivateKey, ciphertext)
  118. if err != nil {
  119. log.Println("解密失败:", err)
  120. return "", err
  121. }
  122. return string(decryptedText), nil
  123. }
  124. // Encryption 加密
  125. func Encryption(content string) (string, error) {
  126. if content == "" {
  127. return "", errors.New("加密内容为空")
  128. }
  129. plaintext := []byte(content)
  130. // 使用公钥加密数据
  131. ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, PublicKey, plaintext)
  132. if err != nil {
  133. log.Println("加密失败:", err)
  134. return "", err
  135. }
  136. return string(ciphertext), nil
  137. }
  138. func Decryption(content string) (string, error) {
  139. if content == "" {
  140. return "", errors.New("解密内容为空")
  141. }
  142. if PrivateKey == nil {
  143. return "", errors.New("无效私钥")
  144. }
  145. ciphertext, err := base64.StdEncoding.DecodeString(content)
  146. if err != nil {
  147. log.Println("密文解码失败:", err)
  148. return "", errors.New("密文解码失败")
  149. }
  150. // 使用私钥解密数据
  151. decryptedText, err := rsa.DecryptPKCS1v15(rand.Reader, PrivateKey, ciphertext)
  152. if err != nil {
  153. log.Println("解密失败:", err)
  154. return "", err
  155. }
  156. return string(decryptedText), nil
  157. }