天天看點

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

是我用于測試這些加密方式的性能時檢視加解密進度的工具,可以去掉