天天看点

python3加解密:AES加密解密、DES加密解密、BASE64加密解密和RSA加密解密AES加密与解密DES加密解密BASE64加密解密RSA加密解密

得空,把一些之前用到的自己查找到以及自己封装好的内容拿来分享一下,希望有需要的朋友

AES加密与解密

import base64,datetime,time
from urllib import request
from Crypto.Cipher import AES
from tqdm import tqdm


#依赖安装:pip3 install pycryptodome
ENCRYPT_KEY = "chenjq"

#补足16位并返回bytes
def add_to_16(value):
    while len(value) % 16 != 0:
        value = value + "\0"
    return str.encode(value)

#AES加密
def encrypt_aes(text):
    text = request.quote(text)
    aes = AES.new(add_to_16(ENCRYPT_KEY),AES.MODE_ECB)
    encrypt_aec = aes.encrypt(add_to_16(text))
    encrypt_text = str(base64.encodebytes(encrypt_aec),encoding="utf-8").strip()
    return encrypt_text

#AES解密
def decrypt_aes(text):
    aes = AES.new(add_to_16(ENCRYPT_KEY),AES.MODE_ECB)
    decrypt_aec = base64.decodebytes(text.encode(encoding='utf-8'))
    decrypt_text = str(aes.decrypt(decrypt_aec),encoding='utf-8').replace("\0",'')
    decrypt_text = request.unquote(decrypt_text)
    return decrypt_text
           

DES加密解密

import base64,datetime,time
from urllib import request
from Crypto.Cipher import DES
from tqdm import tqdm
#依赖安装:pip3 install pycryptodome
ENCRYPT_KEY = "29909"

#补足8位并返回bytes =================>如果是3DES,要import DES3,然后 add_to_16即可
def add_to_8(value):
    while len(value) % 8 != 0:
        value = value + "\0"
    return value.encode(encoding='utf-8')

#DES加密
def encrypt_des(text):
    text = request.quote(text)
    aes = DES.new(add_to_8(ENCRYPT_KEY),DES.MODE_ECB)

    encrypt_aec = aes.encrypt(add_to_8(text))
    encrypt_text = str(base64.encodebytes(encrypt_aec),encoding="utf-8").strip()
    return encrypt_text

#DES解密
def decrypt_des(text):
    aes = DES.new(add_to_8(ENCRYPT_KEY),DES.MODE_ECB)
    decrypt_aec = base64.decodebytes(text.encode(encoding='utf-8'))
    decrypt_text = str(aes.decrypt(decrypt_aec),encoding='utf-8').replace("\0",'')
    decrypt_text = request.unquote(decrypt_text)
    return decrypt_text
           

BASE64加密解密

import math

BASEDATA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'

# 补齐到6位_在后面补充
def add_to_6s(data):
    if len(data) % 6 != 0:
        data = data + "0" * (6 - len(data) % 6)
    else:
        pass
    return data
    
# 补齐到6位_在前面补充
def add_to_6p(data):
    if len(data) % 6 != 0:
        data = "0" * (6 - len(data) % 6) + data
    else:
        pass
    return data


def encode_base64(data):
    bin_str = ""
    # 将所有字符转为2进制
    for letter in data:
        if letter == " ":
            bin_str += bin(ord(letter)).replace("b", "0")
        else:
            bin_str += bin(ord(letter)).replace("b", "")
    # 计算可拆分的组数
    count = int(math.ceil(len(bin_str) / 24))
    all_str = ""
    for i in range(count):
        bin24 = bin_str[i * 24:(i + 1) * 24]                        # 每24位一组

        if len(bin24) % 6 != 0:
            bin24 = add_to_6s(bin24)                                # 不足24位,补充成6的倍数

        for j in range(int(len(bin24) / 6)):
            index = int(bin24[j * 6:(j + 1) * 6], 2)               # 每6位一组,并转为10进制数
            all_str += BASEDATA[index]                             # 对照base64索引表获取转换后字符

        if len(all_str) % 4 != 0:
            all_str += "=" * (4 - len(all_str) % 4)              # 如果最终字符不是4的整数倍,用=号填充
    return all_str


def decode_base64(data):
    origin = data.replace("=", "")                              #去除补充的=号
    bin_all = ""
    for letter in origin:
        index = BASEDATA.index(letter)                          #根据base64索引表取出对应数字
        bin_all += add_to_6p(bin(index).replace("0b", ""))     #数字换成6位的二进制数
    remain = len(bin_all) % 8
    if remain != 0:
        bin_all = bin_all[0: - remain]                         #去除补充的0

    all_str = ""
    for i in range(int(len(bin_all) / 8)):
        bin8 = bin_all[i * 8:(i + 1) * 8]                     #获取8位二进制数
        oc = int(bin8, 2)                                     #换成十进制
        all_str += chr(oc)                                    #换成ASCIII字符并累加
    return all_str
           

RSA加密解密

import base64,datetime,time
from Crypto.PublicKey import RSA
from Crypto.Cipher import  PKCS1_v1_5 as p5
from tqdm import tqdm
from tqdm._tqdm import trange

def gen_rsa_key(pwd = "my_sign"):
    key = RSA.generate(1024)
    encrypted_key = key.export_key()
    public_key = key.publickey().export_key()
    with open("private_rsa_key.pem", "wb") as f:
        f.write(encrypted_key)
    with open("public_rsa_key.pem", "wb") as f:
        f.write(public_key)

def encrypt_rsa(text,file="public_rsa_key.pem"):
    with open(file,"r") as rd:
        key = rd.read()
    pubKey = RSA.import_key(key)
    cipKey = p5.new(pubKey)
    encrypt_text = base64.b64encode(cipKey.encrypt(text.encode(encoding="utf-8")))
    return encrypt_text.decode()

def decrypt_rsa(text,file="private_rsa_key.pem"):
    with open(file,"r") as f:
        key = f.read()
    priKey = RSA.import_key(key)
    cipKey = p5.new(priKey)
    decrypt_text = cipKey.decrypt(base64.b64decode(text),"ERROR")
    return decrypt_text.decode()

           

其中的

impor tqdm

from tqdm.xxx import xxx

是我用于测试这些加密方式的性能时查看加解密进度的工具,可以去掉