!!!注意:该两种算法只实现了英文状态的下字符串(中文未支持),如果使用到线上环境请谨慎~
利用位的异或运算来实现对称加密。
自己实现一个Base64编码(主要学习编码原理)。
代码如下:main.go
package main
import (
"encoding/base64"
"errors"
"fmt"
"strconv"
"strings"
)
func main(){
salt := "507b2c0240a5dae0b2894cff080dfc46"; // 盐
// 加密
code, err := SymmetricEncryptio("hezhongli", salt)
if err != nil {
panic(err)
}
fmt.Println(code) // XVVNCl0NV15d=
//解密
str, err := SymmetricDecryptio(code, salt)
if err != nil {
panic(err)
}
fmt.Println(str) // hezhongli
// base64加密解密
fmt.Println(base64Encode("hezhongli")) // aGV6aG8uZ2xp
fmt.Println(base64Decode("aGV6aG8uZ2xp")) // hezhongli
}
// SymmetricEncryptio 对称加密
func SymmetricEncryptio(str, salt string) (code string, err error) {
if str == "" || salt == "" {
err = errors.New("str与salt不能为空")
}
for i := 0; i < len(str); i++ {
idx := i % len(salt)
code += string(rune(str[i] ^ salt[idx]))
}
code = base64.StdEncoding.EncodeToString([]byte(code))
return
}
// SymmetricDecryptio 对称解密
func SymmetricDecryptio(code, salt string) (str string, err error) {
if code == "" || salt == "" {
err = errors.New("code与salt不能为空")
}
byteCode, err := base64.StdEncoding.DecodeString(code)
if err != nil {
err = errors.New("base64解析错误")
}
code = string(byteCode)
for i := 0; i < len(code); i++ {
idx := i % len(salt)
str += string(int(code[i] ^ salt[idx]))
}
return
}
// base64Encode 加密
func base64Encode(str string) (encode string){
mapping := mapping()
padlen := len(str) % 3 // 加密后的字符串末尾需要填充的`=`的个数
longBinstring := "" // 初始化字符串的二进制字符串
for i := 0; i < len(str); i++ {
binstr := strconv.FormatInt(int64(str[i]), 2)
longBinstring += fmt.Sprintf("%08s", binstr)
}
if len(longBinstring) % 6 != 0 {
num := 6 - len(longBinstring) % 6 // 对6求模后,需要在低位补0的数
longBinstring += fmt.Sprintf("%0*s", num,"") // 在末位补0
}
var cut int
for cut < len(longBinstring) {
binStr := fmt.Sprintf("%08s", string([]byte(longBinstring)[cut:cut+6]))
key, _ := strconv.ParseInt(binStr,2,10)
val, ok := mapping[strconv.Itoa(int(key))]
if ok {
encode += val
}
cut += 6
}
if padlen == 1 {
encode += "=="
}
if padlen == 2 {
encode += "="
}
return
}
// base64Decode 解密
func base64Decode(encode string) (str string) {
tmp := mapping()
mapping := make(map[string]string, 64)
for key, val := range tmp {
mapping[val] = key
}
encode = strings.Replace(encode,"=","", -1)
longBinstring := ""
for i := 0; i < len(encode); i++ {
val, ok := mapping[string(encode[i])];
if ok {
int, _ := strconv.Atoi(val)
str := strconv.FormatInt(int64(int), 2)
longBinstring += fmt.Sprintf("%06s",str)
}
}
var cut int
for cut < len(longBinstring) - len(longBinstring) % 8 {
binStr := string([]byte(longBinstring)[cut:cut+8])
int, _ := strconv.ParseInt(binStr,2,10)
str += string(int)
cut += 8
}
return
}
func mapping() map[string]string {
base64Map := map[string]string{
"0" : "A",
"1" : "B",
"2" : "C",
"3" : "D",
"4" : "E",
"5" : "F",
"6" : "G",
"7" : "H",
"8" : "I",
"9" : "J",
"10": "K",
"11": "L",
"12": "M",
"13": "N",
"14": "O",
"15": "P",
"16": "Q",
"17": "R",
"18": "S",
"19": "T",
"20": "U",
"21": "V",
"22": "W",
"23": "X",
"24": "Y",
"25": "Z",
"26": "a",
"27": "b",
"28": "c",
"29": "d",
"30": "e",
"31": "f",
"32": "g",
"33": "h",
"34": "i",
"35": "j",
"36": "k",
"37": "l",
"38": "m",
"39": "n",
"40": "o",
"41": "p",
"42": "q",
"43": "r",
"44": "s",
"45": "t",
"46": "u",
"47": "v",
"48": "w",
"49": "x",
"50": "y",
"51": "z",
"52": "0",
"53": "1",
"54": "2",
"55": "3",
"56": "4",
"57": "5",
"58": "6",
"59": "7",
"61": "8",
"62": "9",
"63": "+",
"64": "/",
}
return base64Map
}
go run main.go 运行已达到自己预期的效果。
作者理解的浅,如有错误欢迎指出。
转发请注明出处!