simpleencrypt.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package spider_com
  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. func (s *SimpleEncrypt) Encode2Hex(str string) string {
  44. data := []byte(str)
  45. s.doEncode(data)
  46. return hex.EncodeToString(data)
  47. }
  48. func (s *SimpleEncrypt) Encode2HexByCheck(str string) string {
  49. data := []byte(str)
  50. s.doEncode(data)
  51. v := s.calaCheckCode(data)
  52. data = append(data, v...)
  53. return hex.EncodeToString(data)
  54. }
  55. // 解密String
  56. func (s *SimpleEncrypt) DecodeString(str string) string {
  57. data, _ := base64.StdEncoding.DecodeString(str)
  58. s.doEncode(data)
  59. return string(data)
  60. }
  61. // 解密String,ByCheck
  62. func (s *SimpleEncrypt) DecodeStringByCheck(str string) string {
  63. data, _ := base64.StdEncoding.DecodeString(str)
  64. if len(data) < 2 || !s.verify(data) {
  65. return ""
  66. }
  67. data = data[:len(data)-2]
  68. s.doEncode(data)
  69. return string(data)
  70. }
  71. func (s *SimpleEncrypt) Decode4Hex(str string) string {
  72. data, _ := hex.DecodeString(str)
  73. s.doEncode(data)
  74. return string(data)
  75. }
  76. func (s *SimpleEncrypt) Decode4HexByCheck(str string) string {
  77. data, _ := hex.DecodeString(str)
  78. if len(data) < 2 || !s.verify(data) {
  79. return ""
  80. }
  81. data = data[:len(data)-2]
  82. s.doEncode(data)
  83. return string(data)
  84. }
  85. // 加密
  86. func (s *SimpleEncrypt) Encode(data []byte) {
  87. s.doEncode(data)
  88. }
  89. func (s *SimpleEncrypt) EncodeByCheck(data []byte) {
  90. s.doEncode(data)
  91. v := s.calaCheckCode(data)
  92. data = append(data, v...)
  93. }
  94. // 解密
  95. func (s *SimpleEncrypt) Decode(data []byte) {
  96. s.doEncode(data)
  97. }
  98. // 解密
  99. func (s *SimpleEncrypt) DecodeByCheck(data []byte) {
  100. if len(data) < 2 || !s.verify(data) {
  101. data = []byte{}
  102. return
  103. }
  104. s.doEncode(data)
  105. }
  106. func (s *SimpleEncrypt) doEncode(bs []byte) {
  107. tmp := []byte(s.Key)
  108. THEFOR:
  109. for i := 0; i < len(bs); {
  110. for j := 0; j < len(tmp); j, i = j+1, i+1 {
  111. if i >= len(bs) {
  112. break THEFOR
  113. }
  114. bs[i] = bs[i] ^ tmp[j]
  115. }
  116. }
  117. }