Base64编码算法(Python实现)

一、搜索Base64算法资料,详细解释该算法。用Python实现它,把自己的学号(字母大写)用Base64编码输出。并且把上面的源代码文件编译成pyc文件。

Base64算法实现转换原理
它是用64个可打印字符表示二进制所有数据方法。由于2的6次方等于64,所以可以用每6个位元为一个单元,对应某个可打印字符。我们知道三个字节有24个位元,就可以刚好对应于4个Base64单元,即3个字节需要用4个Base64的可打印字符来表示。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9 ,这样共有62个字符,此外两个可打印符号在不同的系统中一般有所不同。但是,我们经常所说的Base64另外2个字符是:“+/”。这64个字符,所对应表如下。

转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/中的字符作为编码后的输出。不断进行,直到全部输入数据转换完成。
这是恰好三个字节转为base64:

如果最后剩下两个输入数据,在编码结果后加1个“=”;如果最后剩下一个输入数据,编码结果后加2个“=”:
如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。无论什么样的字符都会全部被编码,编码后的数据比原始数据略长,为原来的4/3。
源代码:

import string
# Base64的64个可打印字符
#letters = list( string . ascii_letters) + list(string.digits) + ['+', '/']
#print(letters)

letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
#print(letters)

#定义base64加密函数
def encryption(inputString):
    # 对每一个字节取ascii数值或unicode数值,然后转换为2进制
    ascii = ['{:0>8}'.format(str(bin(ord(i))).replace('0b', ''))
             for i in inputString]
    #返回的加密文本
    outputString = ''
    # 不够3字节的整数倍,需要补齐“=”的个数
    equalNumber = 0
    #对每个字符的转换
    while ascii:
        #三个asciiw为一组
        AsciiList = ascii[:3]
        if len(AsciiList) != 3:
            #不满三个的,在后面加“=”
            while len(AsciiList) < 3:
                equalNumber += 1
                AsciiList += ['0'*8]
        #join方法连接成三个8字节的字符串
        tempString = ''.join(AsciiList)
        # 三个8字节的二进制,转换为4个6字节的二进制
        tempStringList = [tempString[x:x+6] for x in [0, 6, 12, 18]]
        # 二进制转为10进制
        tempStringList = [int(x, 2) for x in tempStringList]
        # 判断是否需要补“=”,只要equakNumber大于0即需要
        if equalNumber:
            tempStringList = tempStringList[0:4-equalNumber]
        #装换成那64个字符
        outputString += ''.join([letters[x] for x in tempStringList])
        ascii = ascii[3:]
    #在最后加上“=”
    outputString = outputString + '=' * equalNumber
    #返回加密后的文本
    return outputString

#定义base64解密函数
def decryption(inputString):
    # 对前面不是“=”的字节取索引,然后转换为2进制
    asciiList = ['{:0>6}'.format(str(bin(letters.index(i))).replace('0b', ''))
                      for i in inputString if i != '=']
    outputString = ''
    #补齐“=”的个数
    equalNumber = inputString.count('=')
    while asciiList:
        tempList = asciiList[:4]
        #转换成2进制字符串
        tempString = ''.join(tempList)
        # 对没有8位2进制的字符串补够8位2进制
        if len(tempString) % 8 != 0:
            tempString = tempString[0:-1*equalNumber*2]
        # 4个6字节的二进制  转换  为三个8字节的二进制
        tempStringList = [tempString[x:x+8] for x in [0, 8, 16]]
        # 二进制转为10进制
        tempStringList = [int(x, 2) for x in tempStringList if x]
        #连接成字符串
        outputString += ''.join([chr(x) for x in tempStringList])
        asciiList = asciiList[4:]
    #print(output_str)
    return outputString

studentNumber = 'A12345678'
#加密
encryptedText = encryption(studentNumber)
print("加密文本为:"+encryptedText)
#解密
decryptedText = decryption(encryptedText)
print("解密文本为:"+decryptedText)

import base64
#Python2中可直接编码打印
#Python3中的因为3.x中字符都为unicode编码,而b64encode函数的参数为byte类型,所以必须先转码utf-8。
encodestr = base64.b64encode('A12345678'.encode('utf-8'))
print("Python库中的base64编码:"+str(encodestr,'utf-8'))
decodestr = base64.b64decode(encodestr.decode('utf-8'))
print("Python库中的base64解码:"+str(decodestr,'utf-8'))

代码结果截图:
在这里插入图片描述

自己实现的Base64算法编码和解码的结果,与导入Python库中的Base64算法编码和解码的结果相同,编码结果为:QTEyMzQ1Njc4,解码结果为:A12345678。

猜你喜欢

转载自blog.csdn.net/Onlyone_1314/article/details/108938039