base64和base58

算法 · 03-21 · 322 人浏览

base64

一、什么是Base64

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2^6=64,所以每6个比特为一个单元,对应某个可打印字符。

3个字节有24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。

二、python中的base64模块

base64模块实际上调用的是binascii模块
Base64模块真正用得上的方法只有8个,分别是:

encode, decode为一组, 专门用来编码和解码文件的, 也可以对StringIO里的数据做编解码;

encodestring, decodestring为一组,专门用来编码和解码字符串

b64encode, b64decode为一组, 用来编码和解码字符串,并且有一个替换符号字符的功能

因为Base64编码后的字符除了英文字母和数字外还有三个字符’ + / =‘,其中’=‘只是为了补全编码后的字符数为4的整数,而’+‘和’/‘在一些情况下需要被替换的,b64encode和b64decode正是提供了这样的功能。至于什么情况下’+‘和’/'需要被替换,最常见的就是对url进行Base64编码的时候。

urlsafe_b64decode, urlsafe_b64encode为一组,这个就是用来专门对url进行Base64编解码的,实际上也是调用的前一组函数。

base64.b64encode()将bytes类型数据进行base64编码,返回编码后的bytes类型

base64.b64deocde()将base64编码的bytes类型进行解码,返回解码后的bytes类型

decode的作用是将其他编码的字符串转换成unicode编码

encode的作用是将unicode编码转换成其他编码的字符串

三、Base64使用场景

        Base64是一种任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据,包括MIME的电子邮件及XML的一些复杂数据。

四、base64转换过程

Pasted image 20231110105047.png

五、代码实现

1. 简单使用

import base64
 
s = '人生苦短,我学python!'
#加密 ..........................................
b = base64.b64encode(s.encode('utf-8'))
print(b)
 
#解密
c = base64.b64decode(b).decode('utf-8')
print(c)

运行结果:
Pasted image 20231110110611.png

2.url使用base64

示例代码:

import base64
 
url = 'http://www.baidu.com/info'
#加密
b = base64.b64encode(url.encode('utf-8'))
print(b)
 
#解密
c = base64.b64decode(b).decode('utf-8')
print(c)

运行结果:
Pasted image 20231110110813.png

3.读写文件

示例代码:

from base64 import b64encode, b64decode
 
with open(r'./text.txt', 'rb') as f:  # 此处不能使用encoding='utf-8', 否则报错
    base64_data = b64encode(f.read())  # b64encode是编码
    print(base64_data)  # 输出生成的base64码,Bytes类型, b'xxxxx'类型的字符串
 
new_data = b64decode(base64_data)
print(new_data)

运行结果:
Pasted image 20231110110934.png

5.base64对图片数据进行加密

见博客:python中base64库用法详解_base64 python-CSDN博客

6. base64嵌套加密

见博客:python中base64库用法详解_base64 python-CSDN博客

base58

  • Base58编码方式(将冲突项都去掉),在Base64的基础上去掉了比较容易混淆的字符
  • Base58中不含Base64中的数字 0 ,大写字母 O ,小写字母 l ,大写字母 I ,以及 “+” 和 “/” 两个字符。
  • 无法用整字节来转换表示Base58,所以开销会比64和16大得多,但是利于展示地址。

    辗转相除法解决上述字节编码问题

1、字符1代表0、字符2代表1,字符3代表2…字符z代表57.
Pasted image 20231214101431.png

2、如果将1234转换为58进制:
(1)、1234除以58,商为21,余数为16,查上表得H
(2)、21除以58,商为0,余数为21,查表得N
(3)、得到base58编码为:NH
(4)、每个字符串转换之前先把转换数前面的0,转成对应的编码1
3、base58输出字节数:
(1)、位数:log2(58)(每一个字母代表的信息量是log2(58))
(2)、输出的字节:(length8)bit
(3)、预留的字符数量:(length8)/log2(58)=length*1.38

编码和解码:

python脚本如下:

def b58encode(tmp: str) -> str:  
    tmp = list(map(ord, tmp))  
    temp = tmp[0]  
    base58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"  
    for i in range(len(tmp) - 1):  
        temp = temp * 256 + tmp[i + 1]  
    tmp = []  
    while True:  
        tmp.insert(0, temp % 58)  
        temp = temp // 58  
        if temp == 0:  
            break  
    temp = ""  
    for i in tmp:  
        temp += base58[i]  
    return temp  
  
  
def b58decode(tmp: str) -> str:  
    import binascii  
    base58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"  
    temp = []  
    for i in tmp:  
        temp.append(base58.index(i))  
    tmp = temp[0]  
    for i in range(len(temp) - 1):  
        tmp = tmp * 58 + temp[i + 1]  
    return binascii.unhexlify(hex(tmp)[2:].encode("utf-8")).decode("UTF-8")  
  
  
print(b58encode("ABDCDEFGA"))  
print(b58decode("D9cS9N9iHjMLTdA8YSMRMp"))
算法 加密 base 编码
Theme Jasmine by Kent Liao