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

如有疏漏之處還請指正


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM