Base64、Base58原理及GO实现其加密解密

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
	}
}

在这里插入图片描述

发布了20 篇原创文章 · 获赞 88 · 访问量 1863

猜你喜欢

转载自blog.csdn.net/qq_45828877/article/details/103997621