码迷,mamicode.com
首页 > 编程语言 > 详细

python实现base64算法加密

时间:2017-05-05 14:13:35      阅读:394      评论:0      收藏:0      [点我收藏+]

标签:htm   ring   nbsp   bin   letter   base   print   return   utf8   

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

如有疏漏之处还请指正

python实现base64算法加密

标签:htm   ring   nbsp   bin   letter   base   print   return   utf8   

原文地址:http://www.cnblogs.com/dyfblog/p/6812131.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!