simple_encrypt.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package utils
  2. import (
  3. "bytes"
  4. "encoding/base64"
  5. "encoding/hex"
  6. )
  7. /**
  8. 加解密
  9. 数据结构
  10. 密文+sha32校验
  11. */
  12. //
  13. type SimpleEncrypt struct {
  14. Key string //加解密用到的key(加密key索引)+
  15. }
  16. //计算检验和
  17. func (s *SimpleEncrypt) calaCheckCode(src []byte) []byte {
  18. check := 0
  19. for i := 0; i < len(src); i++ {
  20. check += int(src[i])
  21. }
  22. return []byte{byte((check >> 8) & 0xff), byte(check & 0xff)}
  23. }
  24. //验证数据有效性
  25. func (s *SimpleEncrypt) verify(src []byte) bool {
  26. v := s.calaCheckCode(src[:len(src)-2])
  27. return bytes.Equal(v, src[len(src)-2:])
  28. }
  29. //加密String
  30. func (s *SimpleEncrypt) EncodeString(str string) string {
  31. data := []byte(str)
  32. s.doEncode(data)
  33. return base64.StdEncoding.EncodeToString(data)
  34. }
  35. //加密String,ByCheck
  36. func (s *SimpleEncrypt) EncodeStringByCheck(str string) string {
  37. data := []byte(str)
  38. s.doEncode(data)
  39. v := s.calaCheckCode(data)
  40. data = append(data, v...)
  41. return base64.StdEncoding.EncodeToString(data)
  42. }
  43. //
  44. func (s *SimpleEncrypt) Encode2Hex(str string) string {
  45. data := []byte(str)
  46. s.doEncode(data)
  47. return hex.EncodeToString(data)
  48. }
  49. func (s *SimpleEncrypt) Encode2HexByCheck(str string) string {
  50. data := []byte(str)
  51. s.doEncode(data)
  52. v := s.calaCheckCode(data)
  53. data = append(data, v...)
  54. return hex.EncodeToString(data)
  55. }
  56. //解密String
  57. func (s *SimpleEncrypt) DecodeString(str string) string {
  58. data, _ := base64.StdEncoding.DecodeString(str)
  59. s.doEncode(data)
  60. return string(data)
  61. }
  62. //解密String,ByCheck
  63. func (s *SimpleEncrypt) DecodeStringByCheck(str string) string {
  64. data, _ := base64.StdEncoding.DecodeString(str)
  65. if len(data) < 2 || !s.verify(data) {
  66. return ""
  67. }
  68. data = data[:len(data)-2]
  69. s.doEncode(data)
  70. return string(data)
  71. }
  72. //
  73. func (s *SimpleEncrypt) Decode4Hex(str string) string {
  74. data, _ := hex.DecodeString(str)
  75. s.doEncode(data)
  76. return string(data)
  77. }
  78. func (s *SimpleEncrypt) Decode4HexByCheck(str string) string {
  79. data, _ := hex.DecodeString(str)
  80. if len(data) < 2 || !s.verify(data) {
  81. return ""
  82. }
  83. data = data[:len(data)-2]
  84. s.doEncode(data)
  85. return string(data)
  86. }
  87. //加密
  88. func (s *SimpleEncrypt) Encode(data []byte) {
  89. s.doEncode(data)
  90. }
  91. func (s *SimpleEncrypt) EncodeByCheck(data []byte) {
  92. s.doEncode(data)
  93. v := s.calaCheckCode(data)
  94. data = append(data, v...)
  95. }
  96. //解密
  97. func (s *SimpleEncrypt) Decode(data []byte) {
  98. s.doEncode(data)
  99. }
  100. //解密
  101. func (s *SimpleEncrypt) DecodeByCheck(data []byte) {
  102. if len(data) < 2 || !s.verify(data) {
  103. data = []byte{}
  104. return
  105. }
  106. s.doEncode(data)
  107. }
  108. func (s *SimpleEncrypt) doEncode(bs []byte) {
  109. tmp := []byte(s.Key)
  110. THEFOR:
  111. for i := 0; i < len(bs); {
  112. for j := 0; j < len(tmp); j, i = j+1, i+1 {
  113. if i >= len(bs) {
  114. break THEFOR
  115. }
  116. bs[i] = bs[i] ^ tmp[j]
  117. }
  118. }
  119. }