simpleencrypt.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package encrypt
  2. import (
  3. "bytes"
  4. "encoding/base64"
  5. "encoding/hex"
  6. "net/url"
  7. "strings"
  8. )
  9. /**
  10. 加解密
  11. 数据结构
  12. 密文+sha32校验
  13. */
  14. //
  15. type SimpleEncrypt struct {
  16. Key string //加解密用到的key(加密key索引)+
  17. }
  18. //计算检验和
  19. func (s *SimpleEncrypt) calaCheckCode(src []byte) []byte {
  20. check := 0
  21. for i := 0; i < len(src); i++ {
  22. check += int(src[i])
  23. }
  24. return []byte{byte((check >> 8) & 0xff), byte(check & 0xff)}
  25. }
  26. //验证数据有效性
  27. func (s *SimpleEncrypt) verify(src []byte) bool {
  28. v := s.calaCheckCode(src[:len(src)-2])
  29. return bytes.Equal(v, src[len(src)-2:])
  30. }
  31. //加密String
  32. func (s *SimpleEncrypt) EncodeString(str string) string {
  33. data := []byte(str)
  34. s.doEncode(data)
  35. return base64.StdEncoding.EncodeToString(data)
  36. }
  37. //加密String,ByCheck
  38. func (s *SimpleEncrypt) EncodeStringByCheck(str string) string {
  39. data := []byte(str)
  40. s.doEncode(data)
  41. v := s.calaCheckCode(data)
  42. data = append(data, v...)
  43. return base64.StdEncoding.EncodeToString(data)
  44. }
  45. //
  46. func (s *SimpleEncrypt) Encode2Hex(str string) string {
  47. data := []byte(str)
  48. s.doEncode(data)
  49. return hex.EncodeToString(data)
  50. }
  51. func (s *SimpleEncrypt) Encode2HexByCheck(str string) string {
  52. data := []byte(str)
  53. s.doEncode(data)
  54. v := s.calaCheckCode(data)
  55. data = append(data, v...)
  56. return hex.EncodeToString(data)
  57. }
  58. //解密String
  59. func (s *SimpleEncrypt) DecodeString(str string) string {
  60. data, _ := base64.StdEncoding.DecodeString(str)
  61. s.doEncode(data)
  62. return string(data)
  63. }
  64. //解密String,ByCheck
  65. func (s *SimpleEncrypt) DecodeStringByCheck(str string) string {
  66. data, _ := base64.StdEncoding.DecodeString(str)
  67. if len(data) < 2 || !s.verify(data) {
  68. return ""
  69. }
  70. data = data[:len(data)-2]
  71. s.doEncode(data)
  72. return string(data)
  73. }
  74. //
  75. func (s *SimpleEncrypt) Decode4Hex(str string) string {
  76. data, _ := hex.DecodeString(str)
  77. s.doEncode(data)
  78. return string(data)
  79. }
  80. func (s *SimpleEncrypt) Decode4HexByCheck(str string) string {
  81. data, _ := hex.DecodeString(str)
  82. if len(data) < 2 || !s.verify(data) {
  83. return ""
  84. }
  85. data = data[:len(data)-2]
  86. s.doEncode(data)
  87. return string(data)
  88. }
  89. //加密
  90. func (s *SimpleEncrypt) Encode(data []byte) {
  91. s.doEncode(data)
  92. }
  93. func (s *SimpleEncrypt) EncodeByCheck(data []byte) {
  94. s.doEncode(data)
  95. v := s.calaCheckCode(data)
  96. data = append(data, v...)
  97. }
  98. //解密
  99. func (s *SimpleEncrypt) Decode(data []byte) {
  100. s.doEncode(data)
  101. }
  102. //解密
  103. func (s *SimpleEncrypt) DecodeByCheck(data []byte) {
  104. if len(data) < 2 || !s.verify(data) {
  105. data = []byte{}
  106. return
  107. }
  108. s.doEncode(data)
  109. }
  110. func (s *SimpleEncrypt) doEncode(bs []byte) {
  111. tmp := []byte(s.Key)
  112. THEFOR:
  113. for i := 0; i < len(bs); {
  114. for j := 0; j < len(tmp); j, i = j+1, i+1 {
  115. if i >= len(bs) {
  116. break THEFOR
  117. }
  118. bs[i] = bs[i] ^ tmp[j]
  119. }
  120. }
  121. }
  122. //短地址加密
  123. func EncodeArticleId(keys ...string) string {
  124. kstr := strings.Join(keys, ",")
  125. return SE.EncodeString(kstr)
  126. }
  127. //短地址解密
  128. func DecodeArticleId(id string) []string {
  129. return strings.Split(SE.DecodeString(id), ",")
  130. }
  131. //短地址加密,二次加密带校验和
  132. func EncodeArticleId2ByCheck(keys ...string) string {
  133. kstr := strings.Join(keys, ",")
  134. kstr = SE.EncodeStringByCheck(kstr)
  135. return url.QueryEscape("ABC" + SE2.EncodeStringByCheck(kstr))
  136. }
  137. //短地址解密,二次解密带校验和
  138. func DecodeArticleId2ByCheck(id string) []string {
  139. if !strings.Contains(id, "+") { //新加密算法解密
  140. id, _ = url.QueryUnescape(id)
  141. }
  142. if id[:3] == "ABC" { //前三位为ABC是新加密数据
  143. kstr := SE2.DecodeStringByCheck(id[3:])
  144. return strings.Split(SE.DecodeStringByCheck(kstr), ",")
  145. } else { //历史数据
  146. rep := DecodeArticleId(id)
  147. oldpushid := "58f87a9561a0721f157bc74d" //剑鱼1.9发版前最后一次推送信息id
  148. if rep[0] > oldpushid {
  149. return []string{""}
  150. } else {
  151. return rep
  152. }
  153. }
  154. }