文章目录
- def encrypt_file(key, in_path, out_path): “””使用AES-256 CBC模式加密文件””” iv = get_random_bytes(16) # 生成随机初始化向量 cipher = AES.new(key, AES.MODE_CBC, iv) # 创建加密器 with open(in_path, ‘rb’) as f_in: data = f_in.read() # 读取原始文件内容 # 加密并填充数据 ct_bytes = cipher.encrypt(pad(data, AES.block_size)) encrypted = iv + ct_bytes # 组合IV和密文 with open(out_path, ‘wb’) as f_out: f_out.write(encrypted) # 写入加密文件
- 这是加密后的EXE文件运行时显示的解锁界面核心代码: def generate_stub_code(password_hash, encrypted_data_base64): “””生成包含密码验证界面的Python代码””” return f”’#!/usr/bin/env python # Tkinter运行时修复 – 解决打包环境下的关键问题 def fix_tkinter_runtime(): if getattr(sys, ‘frozen’, False): base_path = sys._MEIPASS tk_data_dir = os.path.join(base_path, ‘_tk_data’) if not os.path.exists(tk_data_dir): tk_data_dir = os.path.join(base_path, ‘tk’, ‘data’) os.environ[‘TKDATA’] = tk_data_dir # 设置环境变量 # 在创建Tkinter界面之前调用修复函数 fix_tkinter_runtime() # 密码验证逻辑 def check_password(): password = password_entry.get() key = hashlib.sha256(password.encode()).digest() # 从密码生成密钥 decrypted_data = decrypt_data(key) # 尝试解密 if decrypted_data: root.destroy() execute_decrypted(decrypted_data) # 执行解密后的程序 # 创建美观的解锁界面 root = tk.Tk() root.title(“程序解锁”) root.geometry(“260×230″) root.resizable(False, False) root.configure(bg=”#f0f0f0″) # 界面组件:图标、输入框、按钮等 icon_label = ttk.Label(main_frame, text=”🔒”, font=(“Arial”, 24)) password_entry = ttk.Entry(main_frame, show=”*”, width=25) submit_btn = ttk.Button(main_frame, text=”解锁程序”, command=check_password, width=15) ”’
- def main(): “””主GUI界面和处理流程””” # 文件选择函数 def select_exe(): # 自动设置输出路径 output_path = os.path.join(dir_name, f”{name_without_ext}_protected.exe”) # 加密处理核心逻辑 def encrypt(): # 验证输入 if not all([exe_path, output_path, password, confirm]): messagebox.showerror(“错误”, “所有字段都必须填写”) return # 生成密钥和哈希 password_hash = hashlib.sha256(password.encode()).hexdigest() key = hashlib.sha256(password.encode()).digest() # 加密文件 encrypt_file(key, exe_path, encrypted_temp_path) # 生成stub代码 stub_code = generate_stub_code(password_hash, encrypted_data_base64) # PyInstaller打包处理 pyinstaller_cmd = [ *find_pyinstaller(), # 自动检测PyInstaller ‘–onefile’, ‘–noconsole’, ‘–name’, output_basename, *icon_cmd, # 图标参数 stub_path ] # 执行打包 subprocess.run(pyinstaller_cmd, shell=sys.platform.startswith(‘win’)) # 处理结果 if os.path.exists(generated_exe): shutil.copy(generated_exe, output_path) status_label.config(text=f”加密成功! 文件已保存到:n{output_path}”, fg=”green”)
- if __name__ == “__main__”: # 自动安装缺失依赖 try: from Crypto.Cipher import AES except ImportError: print(“正在安装依赖库pycryptodome…”) subprocess.check_call([sys.executable, “-m”, “pip”, “install”, “pycryptodome”]) os.execl(sys.executable, sys.executable, *sys.argv) # 重启脚本 # 检查PyInstaller try: import PyInstaller except ImportError: subprocess.check_call([sys.executable, “-m”, “pip”, “install”, “pyinstaller”]) main()
- def fix_tkinter_runtime(): “””解决PyInstaller打包环境下Tkinter的资源路径问题””” if getattr(sys, ‘frozen’, False): base_path = sys._MEIPASS tk_data_dir = os.path.join(base_path, ‘_tk_data’) if not os.path.exists(tk_data_dir): tk_data_dir = os.path.join(base_path, ‘tk’, ‘data’) os.environ[‘TKDATA’] = tk_data_dir
- def find_pyinstaller(): “””自动检测系统中可用的PyInstaller安装方式””” if shutil.which(‘pyinstaller’): return [‘pyinstaller’] # 尝试通过Python解释器调用 for py_exe in [‘python’, ‘python3’]: if shutil.which(py_exe): try: subprocess.run([py_exe, ‘-c’, ‘import PyInstaller’], check=True) return [py_exe, ‘-m’, ‘PyInstaller’] except: continue return None
- try: # 加密和打包过程 except Exception as e: error_details = traceback.format_exc() messagebox.showerror( “错误”, f”加密过程中出错:nn{str(e)}nn” f”详细错误信息:n{error_details[:1000]}” ) finally: # 确保清理临时文件 shutil.rmtree(temp_dir, ignore_errors=True)
目录
- 一、概述
- 二、核心功能模块
- 1. 文件加密模块
- 2. Stub程序生成器
- 3. 主界面与处理逻辑
- 4. 依赖管理
- 三、关键技术概要
- 1. Tkinter运行时修复
- 2. 智能PyInstaller检测
- 3. 健壮的错误处理
- 四、使用说明
- 五、技术优势
- 六、总结
这个Python脚本实现了一个强大的EXE文件加密保护工具,它能够将任何Windows可执行文件封装到一个带密码保护的GUI程序中。核心功能包括:
- 使用AES-256加密算法保护原始EXE文件
- 创建美观的密码验证界面
- 支持自定义程序图标
- 自动处理PyInstaller打包过程
- 修复Tkinter在打包环境中的运行时问题
def encrypt_file(key, in_path, out_path):
"""使用AES-256 CBC模式加密文件"""
iv = get_random_bytes(16) # 生成随机初始化向量
cipher = AES.new(key, AES.MODE_CBC, iv) # 创建加密器
with open(in_path, 'rb') as f_in:
data = f_in.read() # 读取原始文件内容
# 加密并填充数据
ct_bytes = cipher.encrypt(pad(data, AES.block_size))
encrypted = iv + ct_bytes # 组合IV和密文
with open(out_path, 'wb') as f_out:
f_out.write(encrypted) # 写入加密文件
这是加密后的EXE文件运行时显示的解锁界面核心代码:
def generate_stub_code(password_hash, encrypted_data_base64):
"""生成包含密码验证界面的Python代码"""
return f'''#!/usr/bin/env python
# Tkinter运行时修复 - 解决打包环境下的关键问题
def fix_tkinter_runtime():
if getattr(sys, 'frozen', False):
base_path = sys._MEIPASS
tk_data_dir = os.path.join(base_path, '_tk_data')
if not os.path.exists(tk_data_dir):
tk_data_dir = os.path.join(base_path, 'tk', 'data')
os.environ['TKDATA'] = tk_data_dir # 设置环境变量
# 在创建Tkinter界面之前调用修复函数
fix_tkinter_runtime()
# 密码验证逻辑
def check_password():
password = password_entry.get()
key = hashlib.sha256(password.encode()).digest() # 从密码生成密钥
decrypted_data = decrypt_data(key) # 尝试解密
if decrypted_data:
root.destroy()
execute_decrypted(decrypted_data) # 执行解密后的程序
# 创建美观的解锁界面
root = tk.Tk()
root.title("程序解锁")
root.geometry("260x230")
root.resizable(False, False)
root.configure(bg="#f0f0f0")
# 界面组件:图标、输入框、按钮等
icon_label = ttk.Label(main_frame, text="🔒", font=("Arial", 24))
password_entry = ttk.Entry(main_frame, show="*", width=25)
submit_btn = ttk.Button(main_frame, text="解锁程序", command=check_password, width=15)
'''
def main():
"""主GUI界面和处理流程"""
# 文件选择函数
def select_exe():
# 自动设置输出路径
output_path = os.path.join(dir_name, f"{name_without_ext}_protected.exe")
# 加密处理核心逻辑
def encrypt():
# 验证输入
if not all([exe_path, output_path, password, confirm]):
messagebox.showerror("错误", "所有字段都必须填写")
return
# 生成密钥和哈希
password_hash = hashlib.sha256(password.encode()).hexdigest()
key = hashlib.sha256(password.encode()).digest()
# 加密文件
encrypt_file(key, exe_path, encrypted_temp_path)
# 生成stub代码
stub_code = generate_stub_code(password_hash, encrypted_data_base64)
# PyInstaller打包处理
pyinstaller_cmd = [
*find_pyinstaller(), # 自动检测PyInstaller
'--onefile', '--noconsole',
'--name', output_basename,
*icon_cmd, # 图标参数
stub_path
]
# 执行打包
subprocess.run(pyinstaller_cmd, shell=sys.platform.startswith('win'))
# 处理结果
if os.path.exists(generated_exe):
shutil.copy(generated_exe, output_path)
status_label.config(text=f"加密成功! 文件已保存到:n{output_path}", fg="green")
if __name__ == "__main__":
# 自动安装缺失依赖
try:
from Crypto.Cipher import AES
except ImportError:
print("正在安装依赖库pycryptodome...")
subprocess.check_call([sys.executable, "-m", "pip", "install", "pycryptodome"])
os.execl(sys.executable, sys.executable, *sys.argv) # 重启脚本
# 检查PyInstaller
try:
import PyInstaller
except ImportError:
subprocess.check_call([sys.executable, "-m", "pip", "install", "pyinstaller"])
main()
def fix_tkinter_runtime():
"""解决PyInstaller打包环境下Tkinter的资源路径问题"""
if getattr(sys, 'frozen', False):
base_path = sys._MEIPASS
tk_data_dir = os.path.join(base_path, '_tk_data')
if not os.path.exists(tk_data_dir):
tk_data_dir = os.path.join(base_path, 'tk', 'data')
os.environ['TKDATA'] = tk_data_dir
def find_pyinstaller():
"""自动检测系统中可用的PyInstaller安装方式"""
if shutil.which('pyinstaller'):
return ['pyinstaller']
# 尝试通过Python解释器调用
for py_exe in ['python', 'python3']:
if shutil.which(py_exe):
try:
subprocess.run([py_exe, '-c', 'import PyInstaller'], check=True)
return [py_exe, '-m', 'PyInstaller']
except:
continue
return None
try:
# 加密和打包过程
except Exception as e:
error_details = traceback.format_exc()
messagebox.showerror(
"错误",
f"加密过程中出错:nn{str(e)}nn"
f"详细错误信息:n{error_details[:1000]}"
)
finally:
# 确保清理临时文件
shutil.rmtree(temp_dir, ignore_errors=True)
主界面功能:
- 选择要加密的EXE文件
- 设置输出路径(自动生成)
- 添加自定义图标(可选)
- 设置并确认解锁密码
处理流程:
- 验证输入信息
- 使用AES-256加密原始EXE
- 生成带GUI界面的stub程序
- 使用PyInstaller打包成单个EXE
- 输出保护后的可执行文件
生成的保护程序特点:
- 启动时显示密码输入界面
- 密码错误时友好提示
- 验证成功后自动执行原始程序
- 支持回车键快速提交
- 军事级加密:采用AES-256-CBC加密模式,使用随机初始化向量(IV)
- 密码安全:通过SHA-256哈希处理密码,不存储明文
- 优雅的UI:使用Tkinter创建美观的解锁界面
- 跨平台兼容:自动处理不同系统的路径问题
- 自包含:最终生成单个EXE文件,便于分发
- 错误恢复:完善的异常处理和临时文件清理
这个EXE文件加密保护工具集成了现代加密技术和Python打包技术,为Windows程序提供了简单易用的安全保护方案。通过将商业软件封装到密码保护的GUI界面中,开发者可以有效控制软件的分发和使用权限。工具还解决了PyInstaller打包环境下常见的Tkinter运行时问题,确保生成的保护程序在各种环境下都能稳定运行。
以上就是使用Python实现一个安全封装EXE文件加密保护工具的详细内容,更多关于Python EXE文件加密保护工具的资料请关注风君子博客其它相关文章!
您可能感兴趣的文章:
- Python打包EXE常见错误汇总及解决方案
- 基于Python编写一个git自动上传的脚本(打包成exe)
- Python利用PyInstaller库实现将脚本一键打包为EXE文件
- Python代码打包为EXE的完全指南(图文详解+问题排查)
- python代码打包到exe的实现示例