之前用异或算法自己加密文件,感觉密码还是太弱,在网上传输需要优秀的算法。于是用AES对称加密算法实现对电脑文件的加密。
实现主要有两个.py文件,一个是ecy.py,主要写了加密的核心算法。另一个是QT Desinger生成的界面文件,用信号与槽与核心算法链接。
一、算法文件
主要实现一个文件夹中文件的遍历,对每一个文件进行加解密操作,生成的新文件还放在该文件夹中。老文件可以删除,也可以保留。还可以选择是否对文件重新命名。下面是ecy.py文件。
from Crypto.Cipher import AES
import os
# 密钥(key), 密斯偏移量(iv) CBC模式加密
BLOCK_SIZE = 16 # Bytes
def pad(bs):
rbs=(BLOCK_SIZE - len(bs) % BLOCK_SIZE) * chr(BLOCK_SIZE - len(bs) % BLOCK_SIZE)
rb=rbs.encode('utf8')
rb=bs+rb
return rb
unpad = lambda s: s[:-ord(s[len(s) - 1:])]
vi = b'0102030405060708'
def encrypt_all(path1,key,flag,remove,rename):
"""
:param path1: 操作文件的路径
:param key: 密码
:param flag: 加解密标志。False位加密,True为解密
:param remove: False是不删除原文件,True删除源文件。
:param rename: False是添加前缀,True是不添加前缀。
:return:
"""
for root, dirs, files in os.walk(path1):
for name in files:
path3 = os.path.join(root, name)
if not flag:
name1 = "ej_" + name
else:
name1 = "dj_" + name
path4 = os.path.join(root, name1)
print(str(path3))
fin = open(path3, "rb+")
fou = open(path4, "ab+")
if not flag:
while True:
byt1 = fin.read(1023)
if not byt1:
break
byt2 = AES_Encrypt(key, byt1)
fou.write(byt2)
else:
while True:
byt1 = fin.read(1024)
if not byt1:
break
byt2 = AES_Decrypt(key, byt1)
fou.write(byt2)
fin.close()
fou.close()
if remove:
os.remove(path3)
if rename:
os.rename(path4, path3)
def make_key(key):
'''
密码必须是16字节的。如果小于16字节,如果小于16位,直接复制。如果大于16位,直接剪掉。
等下要考虑密码为空的情况。
'