Base64
1.Base64就是一种基于64个可打印的字符来表示二进制数据的方法
- Base64使用了26个字母、26个大写字母、10个数字以及两个符号(+、/),用语在电子邮件这样的基于文本的媒介中传输二进制数据。
- Base64通常用于编码邮件中的附件。
2.Base64的步骤
- 将每个字符转成ASCII编码(10进制)
- 将10进制编码转成2进制编码
- 将2进制编码按照6位一组进行平分
- 将6位一组的2进制数进行高位补零,然后转成10进制
- 将10进制数作为索引,从Base64编码表中查找字符
- 将3个字符的文本将编码为4个字符长度
3.Go实现Base64加密解密
package main
import (
"encoding/base64"
"fmt"
)
func main() {
str := "Oneck"
res := Base64EncodeString(str)
fmt.Println(res);
res1 := Base64DecodeString(res)
fmt.Println(res1)
}
func Base64EncodeString(str string) string {
return base64.StdEncoding.EncodeToString([]byte(str))
}
func Base64DecodeString(str string) string {
result,_ := base64.StdEncoding.DecodeString(str)
return string(result)
}
Base58
1.Base58是一种基于文本的二进制编码而是,用在比特币和其他的加密货币中
2.Base58是Base64编码格式的子集,同样适用大小写和10个数字,但是舍弃了一些容易错读和在特定字体中易混淆的字符
- Base58不含Base64中的0、Oo、lL、1以及+、/,目的就是为了去除容易混淆的字符。
- 简而言之,Base58就是不含(O0l1+/)的大小写和数字组成
3.Base58的编码步骤:
将数组对58取模,得到商和模,然后不断用商对58取模,知道商为0。将所有的模作为索引下标,获取其在base58字符集中的字符,左后大小端进行颠倒
package main
import (
"bytes"
"fmt"
"math/big"
)
var base58List = []byte("123456789ABCDEFGHJKMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz")
func main() {
str := "peter"
_,res := Base58Encode([]byte(str))
fmt.Println(res)
_,res = Base58Decode([]byte(res))
fmt.Println(res)
}
func Base58Encode(input[]byte) ([]byte,string) {
z := big.NewInt(0).SetBytes(input)
fmt.Println("z=",z)
base := big.NewInt(58)
zero := big.NewInt(0)
mod := &big.Int{}
var result []byte
fmt.Println("开始循环------------")
for z.Cmp(zero) != 0 {
z.DivMod(z,base,mod)
fmt.Println("mod=",mod)
fmt.Println("z=",z)
result = append(result,base58List[mod.Int64()])
fmt.Println("result=",fmt.Sprintf("%s",result))
fmt.Println("循环结束")
}
fmt.Println("整个循环结束-------------")
ReverseBytes(result)
return result,fmt.Sprintf("%s",result)
}
func Base58Decode(input []byte) ([]byte,string) {
result := big.NewInt(0)
for _,b :=range input {
charIndex := bytes.IndexByte((base58List),b)
result.Mul(result,big.NewInt(58))
result.Add(result,big.NewInt(int64(charIndex)))
}
decode := result.Bytes()
if input[0] == base58List[0] {
decode = append([]byte{0X00},decode...)
}
return decode,string(decode)
}
func ReverseBytes(data[]byte) {
for i,j := 0, len(data) - 1 ; i < j ; i,j = i + 1,j - 1 {
data[i],data[j] = data[j],data[i]
//fmt.Println(i,j)
//break
}
}