Base64是把各个byte分解后,以64个字符替换之。Base64共使用64个字符,再加上padding的=号,最多就是65个字符,加密的方法非常简单,就是每个字符用其他随机字符替换掉。

首先是生成密码本的函数,密码本就是各个字符的对应字符:

import random

def generate_keys():
    base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    list_base64_chars = list(base64_chars)
    random.shuffle(list_base64_chars)

    result = {}
    for i, c in enumerate(base64_chars):
        result[c] = list_base64_chars[i]

    result['='] = '='
    result_str = str(result).replace("'", "\"")
    return result_str

下面是一个密码本的例子:

{"A": "D", "B": "l", "C": "P", "D": "G", "E": "Y", "F": "o", "G": "s", "H": "0", "I": "M", "J": "t", "K": "f", "L": "I", "M": "d", "N": "U", "O": "X", "P": "L", "Q": "2", "R": "g", "S": "y", "T": "j", "U": "F", "V": "3", "W": "r", "X": "p", "Y": "a", "Z": "u", "a": "1", "b": "/", "c": "n", "d": "A", "e": "E", "f": "O", "g": "x", "h": "N", "i": "K", "j": "+", "k": "W", "l": "H", "m": "Z", "n": "8", "o": "b", "p": "z", "q": "k", "r": "S", "s": "V", "t": "i", "u": "4", "v": "C", "w": "R", "x": "v", "y": "B", "z": "T", "0": "Q", "1": "q", "2": "h", "3": "6", "4": "c", "5": "e", "6": "J", "7": "m", "8": "5", "9": "w", "+": "7", "/": "9", "=": "="}

密码本生成后,需要记录下来,我们的加密和解密都要依靠它:

import base64
import json 

KEY_STR = '{"A": "D", "B": "l", "C": "P", "D": "G", "E": "Y", "F": "o", "G": "s", "H": "0", "I": "M", "J": "t", ' \
          '"K": "f", "L": "I", "M": "d", "N": "U", "O": "X", "P": "L", "Q": "2", "R": "g", "S": "y", "T": "j", ' \
          '"U": "F", "V": "3", "W": "r", "X": "p", "Y": "a", "Z": "u", "a": "1", "b": "/", "c": "n", "d": "A", ' \
          '"e": "E", "f": "O", "g": "x", "h": "N", "i": "K", "j": "+", "k": "W", "l": "H", "m": "Z", "n": "8", ' \
          '"o": "b", "p": "z", "q": "k", "r": "S", "s": "V", "t": "i", "u": "4", "v": "C", "w": "R", "x": "v", ' \
          '"y": "B", "z": "T", "0": "Q", "1": "q", "2": "h", "3": "6", "4": "c", "5": "e", "6": "J", "7": "m", ' \
          '"8": "5", "9": "w", "+": "7", "/": "9", "=": "="}'


def base64_encoded(origin_str):
    str_ascii = origin_str.encode("ascii")
    return base64.b64encode(str_ascii).decode("ascii")


def base64_decoded(encoded_str):
    return base64.b64decode(encoded_str).decode("ascii")


def encrypt(origin_str):
    b64 = base64_encoded(origin_str)
    key_data = json.loads(KEY_STR)
    result = ""

    for ch in b64:
        result += key_data[ch]

    return result


def decrypt(encrypted_str):
    key_data = json.loads(KEY_STR)
    key_dec = {v: k for k, v in key_data.items()}
    result = ""

    for ch in encrypted_str:
        result += key_dec[ch]

    return base64_decoded(result)

#below we will test it
origin = """The way I started learning about TCP was, I wrote a TCP stack in Python! \
This was really fun, it didn't take that long, \
and I learned a ton by doing it and writing up what I learned."""

enc_str = encrypt(origin)
dec_str = decrypt(enc_str)

print(enc_str)
print(dec_str)

Console output:

3sNHM0ANEyltM0UQaptQur2x/s3NnZez/ZnxartCAp2x3YU2M0ANnBRxyyl6nZwQuylNMogGFPlTAso+1Blz/Kl2Epgb/hcNMogb1pdxAhoTM0tHarvVEylZArcVMsHQMsgzusc8APlQariHM0gbap2x/sw4uBRxareWMYWx/s3NnZeHuPlNM0gC/KlKEylW/hH4uBlzAPlN/Z2xA6tzAsH4uBlqnPl61soQMYWx/s3NnZeHuPc=
The way I started learning about TCP was, I wrote a TCP stack in Python! This was really fun, it didn't take that long, and I learned a ton by doing it and writing up what I learned.