zoukankan      html  css  js  c++  java
  • python实现base64算法加密

    python本身有base64加密的模块,不过是用C写的,封装成了.so文件,无法查看源码,本着学习的心态,自己实现了一遍,算法

    原理参考 浅谈Base64编码算法.

    代码如下:

    # coding:utf8
    import string
    import base64
    
    # 编码用64位数组 因为是转换为6个字节的字符 所以64位就够了
    letters = list(string.letters) + list(string.digits) + ['+', '/']
    
    def my_base64_encodestring(input_str):
        # 对每一个字节取ascii数值或unicode数值,然后转换为2进制
        str_ascii_list = ['{:0>8}'.format(str(bin(ord(i))).replace('0b', ''))
                          for i in input_str]
        output_str = ''
        # 不够3的整数倍 补齐所需要的次数
        equal_num = 0
        while str_ascii_list:
            temp_list = str_ascii_list[:3]
            if len(temp_list) != 3:
                while len(temp_list) < 3:
                    equal_num += 1
                    temp_list += ['0'*8]
            temp_str = ''.join(temp_list)
            # 三个8字节的二进制 转换为4个6字节的二进制
            temp_str_list = [temp_str[x:x+6] for x in [0, 6, 12, 18]]
            # 二进制转为10进制
            temp_str_list = [int(x, 2) for x in temp_str_list]
            # 判断是否为补齐的字符 做相应的处理
            if equal_num:
                temp_str_list = temp_str_list[0:4-equal_num]
            output_str += ''.join([letters[x] for x in temp_str_list])
            str_ascii_list = str_ascii_list[3:]
        output_str = output_str + '=' * equal_num
        #print(output_str)
        return output_str
    
    def my_base64_decodestring(input_str):
        # 对每一个字节取索引,然后转换为2进制
        str_ascii_list = ['{:0>6}'.format(str(bin(letters.index(i))).replace('0b', ''))
                          for i in input_str if i != '=']
        output_str = ''
        equal_num = input_str.count('=')
        while str_ascii_list:
            temp_list = str_ascii_list[:4]
            temp_str = ''.join(temp_list)
            # 补够8位
            if len(temp_str) % 8 != 0:
                temp_str = temp_str[0:-1*equal_num*2]
            # 4个6字节的二进制  转换  为三个8字节的二进制 
            temp_str_list = [temp_str[x:x+8] for x in [0, 8, 16]]
            # 二进制转为10进制
            temp_str_list = [int(x, 2) for x in temp_str_list if x]
            output_str += ''.join([chr(x) for x in temp_str_list])
            str_ascii_list = str_ascii_list[4:]
        #print(output_str)
        return output_str
    
    if __name__ == "__main__":
        input_str = '11我'
        input_str = 'MTHmiJE='
        #my_base64_encodestring(input_str)
        my_base64_decodestring(input_str)
        pass

    如有疏漏之处还请指正

  • 相关阅读:
    2012工作计划!
    造船篇系统实施(新老衔接工作)
    Android学习摘要一之Android历史
    DEVReport控件使用方法
    造船篇 前传
    软件实施(1)
    茫然疑问未来
    造船篇钢材管理
    wcf身份验证问题
    IDL中关于波段计算的问题
  • 原文地址:https://www.cnblogs.com/dyfblog/p/6812131.html
Copyright © 2011-2022 走看看