IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Golang 解密算法

    李鹏发表于 2016-12-06 07:43:56
    love 0

    这个算法是针对之前 PHP 加密算法(可逆) 中的算法得来的,是使用 Go 语言去解密 PHP 加密的内容。

     

     

    package main
    
    
    import (
    	"crypto/md5"
    	"encoding/base64"
    	"encoding/json"
    	"errors"
    	"fmt"
    	"io"
    	"log"
    )
    func main() {
    	token := "token======";
    
    	data, err := Decrypt(token, "key=====")
    	log.Println(data, err)
    	
    }
    func Md5(key string) string {
    	h := md5.New()
    	io.WriteString(h, key)
    	key = fmt.Sprintf("%x", h.Sum(nil))
    	return key
    }
    
    func Base64Decode(str string) string {
    	data, _ := base64.StdEncoding.DecodeString(str)
    	return string(data)
    }
    func Decrypt(data string, key string) (map[string]interface{}, error) {
    	key = Md5(key)
    
    	var (
    		char = ""
    		str  = ""
    		x    = 0
    		l    = len(key)
    	)
    	data = Base64Decode(data)
    	lenths := len(data)
    
    	for i := 0; i < lenths; i++ {
    		if x == l {
    			x = 0
    		}
    		char = char + fmt.Sprintf("%s", key[x:x+1])
    		x++
    	}
    
    	for i := 0; i < lenths; i++ {
    		if data[i : i+1][0] < char[i : i+1][0] {
    			str = str + string(char[i : i+1][0]-data[i : i+1][0])
    		} else {
    			str = str + string((data[i : i+1][0])-(char[i : i+1][0]))
    		}
    	}
    	var newData map[string]interface{}
    	if err := json.Unmarshal([]byte(str), &newData); err != nil {
    		log.Println("数据错误")
    		return newData, errors.New("数据错误")
    	}
    
    	return newData, nil
    
    }
    
    
    
    


沪ICP备19023445号-2号
友情链接