首页 > 其他分享 >golang 自行实现一个base64加密

golang 自行实现一个base64加密

时间:2023-03-10 14:36:57浏览次数:35  
标签:字符 Base64 加密 二进制 base64 golang 数为 对应

package main

import (
	"fmt"
	"strconv"
)

const base64table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"

func Mybase64(a string) {
	//定义一个byte数组 放要base64的字符
	d := []byte(a)
	//定义一个string 放解析的二进制
	var s string
	//定义补余个数用于最后==计算
	var buyu int
	//取模,3个一断,24个字节,跟base64 6个一断,刚好凑4个。
	if len(d)%3 != 0 {
		//计算要补多少个字符的0,不够三个字符的用0 补上去
		buyu = 3 - len(d)%3
		for i := 0; i < buyu; i++ {
			d = append(d, 0)
		}
	}
	//把要base64的字符转成一长串二进制,用于6个一断
	for _, b := range d {
		s += fmt.Sprintf("%08b", b)
	}
	//6个一断
	j := 6
	//不写if了 定义字典存放 补余的几个=
	buyumap := map[int]string{1: "=", 2: "=="}
	var ret string
	for i := 0; i < len(s); i += 6 {
		s := fmt.Sprintf("0b%s", s[i:j])
		j += 6
		b, _ := strconv.ParseInt(s[2:], 2, 32)
		fmt.Printf("%s===>%d==base64==>%s\n", s, b, string(base64table[b]))
		ret += fmt.Sprintf(string(base64table[b]))
	}
	s2 := ret[0 : len(ret)-buyu]
	s3 := fmt.Sprintf("%s%s", s2, buyumap[buyu])
	fmt.Println(s3)

}
func main() {
	Mybase64("123a45671")
	//data := []byte("123a45671")
	//dst := make([]byte, base64.StdEncoding.EncodedLen(len(data)))
	//base64.StdEncoding.Encode(dst, data)
	//fmt.Println(string(dst))

}

  

以下为chatGPT的回答解析,参考理论是对的,个别值解释的不对

当我们将字符串"abcd"转换成对应的ASCII码值时,得到97、98、99、100。然后将这四个值按照每3个一组进行分组,得到(97, 98, 99),(100)。

接着,将每组3个字节的数据拆分成4个6位的二进制数,这里以第一组为例:

第1个字节:97,对应的二进制数为 01100001
第2个字节:98,对应的二进制数为 01100010
第3个字节:99,对应的二进制数为 01100011
将这3个二进制数拼接在一起,得到24位的二进制数:01100001 01100010 01100011。

然后将这个24位的二进制数分成4个6位的二进制数:

第1个6位二进制数:011000,对应的十进制数为 24,Base64字符集中对应的字符为 'Y'。
第2个6位二进制数:010110,对应的十进制数为 22,Base64字符集中对应的字符为 'W'。
第3个6位二进制数:001100,对应的十进制数为 12,Base64字符集中对应的字符为 'M'。
第4个6位二进制数:000001,对应的十进制数为 1,Base64字符集中对应的字符为 'B'。
对于第二组(100),因为只有一个字节,所以需要在末尾添加两个字节值为0的字节,得到(100, 0, 0)。

将这三个字节拼接在一起,得到16位的二进制数:01100100 00000000 00000000。

然后将这个16位的二进制数分成3个6位的二进制数和1个填充字符:

第1个6位二进制数:011001,对应的十进制数为 25,Base64字符集中对应的字符为 'Z'。
第2个6位二进制数:000000,对应的十进制数为 0,Base64字符集中对应的字符为 'A'。
第3个6位二进制数:000000,对应的十进制数为 0,Base64字符集中对应的字符为 'A'。
第一个填充字符:'='
最后,将这4个Base64字符拼接在一起,得到"YWJjZA== ",这就是字符串"abcd"的Base64编码结果

  

 

标签:字符,Base64,加密,二进制,base64,golang,数为,对应
From: https://www.cnblogs.com/dribs/p/17203218.html

相关文章

  • Base64与File之间的相互转化
    //文件转base64文件流publicAttachmentModelReadDocument(T_BAFJmodelItem){AttachmentModelattachment=newAttachmentModel();......
  • rsa公钥和私钥到底哪个才是用来加密,哪个用来解密?
    本文转自:91博客;原文地址:http://www.9191boke.com/138589019.html 公钥和私钥在一些银行系统、第三方支付系统SDK中经常会遇到,刚接触公钥私钥的朋友们估计很难区分两者......
  • 前端中文转base64
    btoa浏览器的方法,可将字符串编码为Base64编码的ASCII字符串。btoa("helloworld");//'aGVsbG8gd29ybGQ='UTF-16字符编码表示不了中文,可以先把中文编码为Uint8Ar......
  • golang调用opencv实现图像识别
    https://gocv.io/https://github.com/hybridgroup/gocvpackagemainimport( "fmt" "image" "image/color" "os" "strconv" "gocv.io/x/gocv")funcmain(){......
  • vue中将base64流数据转成pdf文件可打印
    vue中将base64流数据转成pdf文件可打印这次后端返参不是oss那边传回来的,而是传给我一串base64编码的字符串,让我去生成可打印的pdf,返参如下所示。一、base编码转为pdf方......
  • 加密中间件对比
    MD5md5不可逆的原因是由于它是一种散列函数,使用的是hash(摘要)算法;不过基于键值对的字典关系原理,有一些收集海量md5信息与摘要的数据库(如彩虹表),采用枚举法能够从md5......
  • 【转】Golang base64 解码碰到的坑
    背景在一次调用三方API的时候,为了数据安全和三方API的请求和返回信息都用了rsa加密,由于rsa算法生成的内容是二进制的,所以需要用base64编码将二进制数据转化成64个可打......
  • JAVA (Spring Boot)数据AES加密解密
    packagecom.example.controller;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.client.RestTemplate;importjavax......
  • (转)Golang中time包用法及一些注意事项
    原文:https://blog.csdn.net/wade3015/article/details/109328485在我们日常软件开发过程中,经常会用到与时间相关的各种业务需求,下面来介绍golang中有关时间的一些基本用......
  • (转)Golang中log日志包的使用
    原文:https://juejin.cn/post/69872042995330580781.前言作为后端开发人员,日志文件记录了发生在操作系统或其他软件运行时的事件或状态。技术人员可以通过日志记录进而......