123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- package encrypt
- import (
- "bytes"
- "encoding/base64"
- "encoding/hex"
- "net/url"
- "strings"
- )
- /**
- 加解密
- 数据结构
- 密文+sha32校验
- */
- //
- type SimpleEncrypt struct {
- Key string //加解密用到的key(加密key索引)+
- }
- //计算检验和
- func (s *SimpleEncrypt) calaCheckCode(src []byte) []byte {
- check := 0
- for i := 0; i < len(src); i++ {
- check += int(src[i])
- }
- return []byte{byte((check >> 8) & 0xff), byte(check & 0xff)}
- }
- //验证数据有效性
- func (s *SimpleEncrypt) verify(src []byte) bool {
- v := s.calaCheckCode(src[:len(src)-2])
- return bytes.Equal(v, src[len(src)-2:])
- }
- //加密String
- func (s *SimpleEncrypt) EncodeString(str string) string {
- data := []byte(str)
- s.doEncode(data)
- return base64.StdEncoding.EncodeToString(data)
- }
- //加密String,ByCheck
- func (s *SimpleEncrypt) EncodeStringByCheck(str string) string {
- data := []byte(str)
- s.doEncode(data)
- v := s.calaCheckCode(data)
- data = append(data, v...)
- return base64.StdEncoding.EncodeToString(data)
- }
- //
- func (s *SimpleEncrypt) Encode2Hex(str string) string {
- data := []byte(str)
- s.doEncode(data)
- return hex.EncodeToString(data)
- }
- func (s *SimpleEncrypt) Encode2HexByCheck(str string) string {
- data := []byte(str)
- s.doEncode(data)
- v := s.calaCheckCode(data)
- data = append(data, v...)
- return hex.EncodeToString(data)
- }
- //解密String
- func (s *SimpleEncrypt) DecodeString(str string) string {
- data, _ := base64.StdEncoding.DecodeString(str)
- s.doEncode(data)
- return string(data)
- }
- //解密String,ByCheck
- func (s *SimpleEncrypt) DecodeStringByCheck(str string) string {
- data, _ := base64.StdEncoding.DecodeString(str)
- if len(data) < 2 || !s.verify(data) {
- return ""
- }
- data = data[:len(data)-2]
- s.doEncode(data)
- return string(data)
- }
- //
- func (s *SimpleEncrypt) Decode4Hex(str string) string {
- data, _ := hex.DecodeString(str)
- s.doEncode(data)
- return string(data)
- }
- func (s *SimpleEncrypt) Decode4HexByCheck(str string) string {
- data, _ := hex.DecodeString(str)
- if len(data) < 2 || !s.verify(data) {
- return ""
- }
- data = data[:len(data)-2]
- s.doEncode(data)
- return string(data)
- }
- //加密
- func (s *SimpleEncrypt) Encode(data []byte) {
- s.doEncode(data)
- }
- func (s *SimpleEncrypt) EncodeByCheck(data []byte) {
- s.doEncode(data)
- v := s.calaCheckCode(data)
- data = append(data, v...)
- }
- //解密
- func (s *SimpleEncrypt) Decode(data []byte) {
- s.doEncode(data)
- }
- //解密
- func (s *SimpleEncrypt) DecodeByCheck(data []byte) {
- if len(data) < 2 || !s.verify(data) {
- data = []byte{}
- return
- }
- s.doEncode(data)
- }
- func (s *SimpleEncrypt) doEncode(bs []byte) {
- tmp := []byte(s.Key)
- THEFOR:
- for i := 0; i < len(bs); {
- for j := 0; j < len(tmp); j, i = j+1, i+1 {
- if i >= len(bs) {
- break THEFOR
- }
- bs[i] = bs[i] ^ tmp[j]
- }
- }
- }
- //短地址加密
- func EncodeArticleId(keys ...string) string {
- kstr := strings.Join(keys, ",")
- return SE.EncodeString(kstr)
- }
- //短地址解密
- func DecodeArticleId(id string) []string {
- return strings.Split(SE.DecodeString(id), ",")
- }
- //短地址加密,二次加密带校验和
- func EncodeArticleId2ByCheck(keys ...string) string {
- kstr := strings.Join(keys, ",")
- kstr = SE.EncodeStringByCheck(kstr)
- return url.QueryEscape("ABC" + SE2.EncodeStringByCheck(kstr))
- }
- //短地址解密,二次解密带校验和
- func DecodeArticleId2ByCheck(id string) []string {
- if !strings.Contains(id, "+") { //新加密算法解密
- id, _ = url.QueryUnescape(id)
- }
- if id[:3] == "ABC" { //前三位为ABC是新加密数据
- kstr := SE2.DecodeStringByCheck(id[3:])
- return strings.Split(SE.DecodeStringByCheck(kstr), ",")
- } else { //历史数据
- rep := DecodeArticleId(id)
- oldpushid := "58f87a9561a0721f157bc74d" //剑鱼1.9发版前最后一次推送信息id
- if rep[0] > oldpushid {
- return []string{""}
- } else {
- return rep
- }
- }
- }
|