python AES加密


使用的包:

  pycryptodome

  安裝 pip install pycryptodome

導入 :

  from Crypto.Cipher import AES

  import base64

  import random

  import secrets

基本參數

mode = 2 # mode 1:ECB,2:CBC
KEYLENGTH = 32  # 密鑰長度:256bit(32bytes)
BS = 16  # 可加密的固定長度
# 當長度不足16時,用於填充信息的,如果為a,則用16進制的16-a 填充
# 如果長度正好為16,則在后面填充16位的 16進度16,解密時最后16bytes解密出來是空
# s為bytes類型
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS).encode()
# 解密時把填充的信息去掉
unpad = lambda s: s[0:-s[-1]]

加密文件:
# 加密前可以將文件壓縮,以減小加密運算量
def aes_encrypt_file(filepath, encrypted_file_path):
'''使用256位加密,密鑰長度256bit,iv固定16bytes'''
key = random.randbytes(KEYLENGTH) # 隨機生成密鑰和偏移量
iv = random.randbytes(BS)
   # 上面的隨機數生成器,不能用於產生密鑰,應該使用secrets.token_bytes(n)來產生
aes = AES.new(key, mode, iv=iv) # 生成AES對象
filesize = os.path.getsize(filepath) # 要加密的文件大小
filllength = filesize % BS
times = filesize // BS  # 計算讀取次數,取商,剩余量作為最后一次讀取並填充到16bytes
with open(zipfilepath, 'rb') as rfs:
with open(encrypted_file_path, 'wb') as wfs:
for time in range(times):  # 循環讀取並加密、寫入到新文件
data = rfs.read(BS)
data_en = aes.encrypt(data)
wfs.write(data_en)
data = rfs.read(BS) # 最后一次讀取
data = pad(data)  # 填充
data_en = aes.encrypt(data)  # 加密
wfs.write(data_en)
return key, iv  # 返回 key和iv,用於后期解密

解密文件:
由於是對稱加密,key和iv使用加密時的key和iv
def aesdefile(encrypted_file_path, decrypted_file_path, key, iv):
aes = AES.new(key, mode, iv=iv)  # 生成AES對象
filesize = os.path.getsize(encrypted_file_path)  # 獲取 文件大小
times = filesize // BS - 1  #計算讀取次數,由於被填充過,所以可以整除,只有最后一次需要去除填充
with open(encrypted_file_path, 'rb') as rfs:
with open(decrypted_file_path, 'wb') as wfs:
for time in range(times):  # 循環讀取文件
data = rfs.read(BS)
data_en = aes.decrypt(data)
wfs.write(data_en)
data = rfs.read(BS)  # 最后一次讀取,
data_en = unpad(aes.decrypt(data))  # 解密並去除填充的內容,
wfs.write(data_en)
os.remove(encrypted_file_path)  # 刪除 未解密的文件



免責聲明!

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



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