得空,把一些之前用到的自己查找到以及自己封裝好的内容拿來分享一下,希望有需要的朋友
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
是我用于測試這些加密方式的性能時檢視加解密進度的工具,可以去掉