base64编码解码的函数实现(Python)

Python中有自带的base64解码编码库。在学习CTF编码解码中,为了深入了解base64编码解码的实现原理,尝试动手编码对应的函数。
如下函数经过实际验证。

编码过程中的错误积累

#   列表字符串函数使用index函数寻找无果后不会返回-1 直接报错   2022年4月17日
#   ValueError: substring not found
cipher = 'SG9uZ0ZlaQ=='
letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
print(letters.index('='))
plain_text_input = "Yinxue"
#   输出编码后密文  WWlueHVl
print(base64_encode(plain_text_input))
#   加密再解密,输出明文
print(base64_decode(base64_encode(plain_text_input)))
def base64_decode(cipher_input):
    # 定义64个字母字符串
    letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    # 接收base64密文输入
    cipher = cipher_input
    # 计算密文中=号数量
    number_cut = cipher.count('=')
    # 逐个输出密文在letters字符串中序号二进制码
    ascii_64 = ['{:0>6}'.format(bin(letters.index(i)).replace('0b', '')) for i in cipher if i != '=']
    # 补充=号对应的二进制字节
    ascii_string = ''.join(ascii_64) + '0' * 6 * number_cut
    #  按照8字节一组计算十进制后求出对应的ascii码字符
    ascii_8 = [chr(int(ascii_string[x:x + 8], 2)) for x in range(0, len(ascii_string), 8)]
    #  返回明文字符串
    plain_text = ''.join(ascii_8[0:len(ascii_8) - number_cut])
    return plain_text

def base64_encode(input_str):
    #  定义Base64编码的64个字符
    letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    #  接收明文字符
    input_string = input_str
    #  逐个计算明文字符ascii值的二进制码,每8个一组生成二进制码列表
    ascii_input_string = ['{:0>8}'.format(str(bin(ord(i))).replace('0b', '')) for i in input_string]
    # 上述列表每3个8比特二进制为一组,最后一组不足3个8字节,用0补齐
    number = 0
    output_string = ''
    while ascii_input_string:
        # 自左向右三个一组编排
        ascii_temp = ascii_input_string[:3]
        # 最后一组不足三字节的补齐
        while len(ascii_temp) < 3:
            ascii_temp.append('0' * 8)
            number += 1
        #  生成24比特字符串
        ascii_24 = ''.join(ascii_temp)
        #  24个比特均分为4组
        ascii_to_6 = [ascii_24[x: x + 6] for x in range(0, 24, 6)]
        #  生成包含3个十进制数字的列表
        ascii_to_10 = [int(i, 2) for i in ascii_to_6]
        #   根据letters字符串输出上述列表值对应字符
        ascii_to_64 = [letters[i] for i in ascii_to_10]
        #   剔除人为补齐的字符
        ascii_to_64 = ascii_to_64[0:4 - number]
        ascii_to_64 = ''.join(ascii_to_64)
        #   不足部分用=号补齐
        ascii_to_64 = ascii_to_64 + "=" * number
        #   逐步累加生成密文
        output_string += ascii_to_64
        #   开始下一个3字节转换
        ascii_input_string = ascii_input_string[3:]
    #   输出密文
    return output_string

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值