LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 区块链资产 > Base64、Base58原理及GO实现其加密解密

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

2020-01-17 区块新趋势 来源:区块链网络

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

}

}

版权声明:本文为CSDN博主「Oneck_peter」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_45828877/article/details/103997621

—-

编译者/作者:区块新趋势

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...