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

本文深入探讨了Base64和Base58两种二进制到文本编码方式的基本原理与应用场景,详细解释了编码步骤,并提供了Go语言实现的Base64和Base58编码解码示例代码。

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

在这里插入图片描述

面向工程应用:市面上的一些密码学课程和密码学的书籍,很多都是从考证出发,讲解算法原理并不面向工程应用,而我们现在缺少的是工程应用相关的知识,本课程从工程应用出发,每种技术都主要讲解其在工程中的使用,并演示工程应用的代码。 从零实现部分算法: 课程中实现base16编解码 ,XOR对称加解密算法,PKCS7 pading数据填充算法,通过对一些简单算法实现,从而加深对密码学的理解。理论与实践结合: 课程如果只是讲代码,同学并不能理解接口背后的原理,在项目设计中就会留下隐患,出现错误也不容易排查出问题。如果只讲理论,比如对密码学的一些研究,对于大部分从事工程应用的同学并没有必要,而是理论与实践结合,一切为了工程实践。代码现场打出: 代码不放在ppt而是现场打出,更好的让学员理解代码编写的逻辑,老师现场敲出代码正是展示出了工程项目的思考,每个步骤为什么要这么做,考虑了哪些异常,易学不枯燥: 课程为了确保大部分人开发者都学得会,理解算法原理(才能真正理解算法特性),学会工程应用(接口调用,但不局限接口调用,理解接口背后的机制,并能解决工程中会出现的问题),阅读算法源码但不实现密码算法,,并能将密码学投入到实际工程中,如果是想学习具体的加密算法实现,请关注我后面的课程。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值