## 背景
平时我会通过百度网盘分享一些好看的电影和电视剧等视频,但是奈何度娘比较生猛,秉着宁可错杀一千、绝不放过一个的原则,分享的视频链接经常会被和谐,让人很是苦恼
之前考虑通过更改文件名和格式来避开百度网盘的和谐
但是时间长了还是会被和谐
盲猜百度可能是在字节级别对文件进行检查了
所以就想到了通过打乱文件存储内容的的方式
是不是就可以解决这个问题了呢?
## 需求
1、最终需要一个加(解)密的可执行文件
2、通过双击加(解)密文件,将当前目录下的所有文件加(解)密
## 程序设计
首先想到的肯定是对称加密算法:AES加密解密
只要网盘不知道密钥是什么
破解几乎是不可能的
其次语言就选用python,比较简单灵活
最后是代码思路
拿到当前目录下所有的文件列表
递归遍历每一个文件并做加(解)密处理
## 代码实现
### 加密程序
代码语言:javascript复制import os
import msvcrt
from Crypto.Cipher import AES
key = 'dfdkdfdijidfdjiddssdfdsdfythgdjs'
def encryption_files(path):
file_list = os.listdir(path)
for file in file_list:
absolute_file = path "/" file
if os.path.isfile(absolute_file):
if file.endswith(".py") or file.endswith(".exe") or file.endswith(".txt"):
continue
# 进行加密算法,模式ECB模式,把叠加完的秘钥传进来
aes = AES.new(pad_key(key.encode()), AES.MODE_ECB)
# 加密内容,此处需要将字符串转为字节
data = bytearray(os.path.getsize(absolute_file))
with open(absolute_file, 'rb') as f:
f.readinto(data)
f.close()
# 将数据传入加密类中,结果为字节类型
encrypted_data = aes.encrypt(pad(data))
with open(absolute_file "_encryption", 'ba') as f:
f.write(encrypted_data)
f.close()
print("加密成功,请查看文件夹下" absolute_file "_encryption")
else:
# 递归文件夹修改文件名
encryption_files(absolute_file)
# 加密内容需要可以被16整除,所以进行空格拼接
def pad(text):
while len(text) % 16 != 0:
text = b' '
return text
# 加密秘钥需要可以被16整除,所以进行空格拼接
def pad_key(key):
while len(key) % 16 != 0:
key = b' '
return key
if __name__ == '__main__':
# 获取当前程序所在的文件路径
path = os.getcwd()
print("当前文件夹路径:" path)
# 加密数据
encryption_files(path)
print("欢迎关注微信公众号”你好戴先生“~~~~~")
print("请按任意键退出~")
ord(msvcrt.getch())
### 解密程序
代码语言:javascript复制import os
import msvcrt
from Crypto.Cipher import AES
key = 'dfdkdfdijidfdjiddssdfdsdfythgdjs'
def decryption_files(path):
file_list = os.listdir(path)
for file in file_list:
absolute_file = path "/" file
if os.path.isfile(absolute_file):
if not file.endswith("_encryption"):
continue
# 进行加密算法,模式ECB模式,把叠加完的秘钥传进来
aes = AES.new(pad_key(key.encode()), AES.MODE_ECB)
# 加密内容,此处需要将字符串转为字节
data = bytearray(os.path.getsize(absolute_file))
with open(absolute_file, 'rb') as f:
f.readinto(data)
f.close()
# 将数据传入加密类中,结果为字节类型
decrypted_data = aes.decrypt(pad(data))
absolute_file_after = absolute_file.replace("_encryption", "")
with open(absolute_file_after, 'ba') as f:
f.write(decrypted_data)
f.close()
print("解密成功,请查看文件夹下" absolute_file_after)
else:
# 递归文件夹修改文件名
decryption_files(absolute_file)
# 加密内容需要可以被16整除,所以进行空格拼接
def pad(text):
while len(text) % 16 != 0:
text = b' '
return text
# 加密秘钥需要可以被16整除,所以进行空格拼接
def pad_key(key):
while len(key) % 16 != 0:
key = b' '
return key
if __name__ == '__main__':
# 获取当前程序所在的文件路径
path = os.getcwd()
print("当前文件夹路径:" path)
# 解密数据
decryption_files(path)
print("欢迎关注微信公众号”你好戴先生“~~~~~")
print("请按任意键退出~")
ord(msvcrt.getch())
### 生成可执行文件
Terminal执行以下命令安装pyinstaller依赖并生成可执行文件
代码语言:javascript复制# 安装pyinstaller
pip install pyinstaller
# rename_file.py是python程序的相对路径
# 执行以下命令将在当前路径下生成dist/rename_file.exe可执行文件(Windows环境下)
# mac环境下将生成mac系统的可执行文件
pyinstaller -F rename_file.py
文/戴先生@2022年7月31日