python文件加密方法和加密工具程序

175 阅读2分钟

1. 为什么要加密Python程序

  • 对于一些私有的库,或者付费使用的python包,可以通过编译把.py转译成.pyd加密的不可阅读源代码的形式。而包的调用仍然可以使用import pkg的形式

2. 核心方法和教程

2.1 python环境

需要安装Cython

pip install Cython==3.0.8

2.2 核心代码

setup.py 核心代码

作用:用于将.py文件转译成.pyd文件

import os  
import sys  
import shutil  
from distutils.core import setup  
from Cython.Build import cythonize  
from distutils.command.build_ext import build_ext  
  
  
def get_export_symbols_fixed(self, ext):  
    pass  # return [] also does the job!  
  
  
# replace wrong version with the fixed:  
build_ext.get_export_symbols = get_export_symbols_fixed  
  
if __name__ == '__main__':  
    if os.path.exists('build'):  
        shutil.rmtree('build')  
    # print('argv: ', sys.argv, len(sys.argv))  
    appname = sys.argv[3]  
    pypath = sys.argv[4]  
    sys.argv = sys.argv[:3]  
    # print('argv: ', sys.argv, len(sys.argv))  
    cpath = pypath.replace('.py', '.c')  
    if os.path.exists(cpath):  
        os.remove(cpath)  
    setup(  
        name=appname,  
        ext_modules=cythonize(pypath)  
    )  
    if os.path.exists(cpath):  
        os.remove(cpath)
py2pyd.py 单个.py文件转换执行器

作用:内置参数,用于调用setup.py程序,执行该程序可以完成.py到.pyd

import os  
  
os.system(fr"python setup.py build_ext --inplace xxxx.\source\xxxx.py")
py2pyd2.py 文件夹中.py文件转换执行器

作用:内置参数,用于调用setup.py程序,执行该程序可以完成文件夹内所有.py到.pyd,支持深度遍历文件夹(支持多层文件夹嵌套)

import os  
  
def dir_files(dir_path: str) -> list:  
    files = []  
    py_files = []  
    path_list = []  
    if not os.path.exists(dir_path):  
        logging.info(f"{dir_path}文件夹不存在")  
    else:  
        for dirpath, dirnames, filenames in os.walk(dir_path):  
            path_list.append(dirpath)  
            for filename in filenames:  
                files.append(os.path.join(dirpath, filename))  
                if filename.endswith(".py"):  
                    py_files.append(os.path.join(dirpath, filename).replace("\\", "/"))  
                    # print(os.path.join(dirpath, filename))  
    return py_files  
     
dir_path = './page_demo/source'  
py_files = dir_files(dir_path)  
for file in py_files:  
    os.system(fr"python setup.py build_ext --inplace test {file}")

3. 使用教程

3.1 新建page_demo文件夹用于测试

文件夹名称可以随意命名 image.png

3.2 将跑pyd.py和setup.py文件copy到page_demo文件夹中

3.3 在page_demo中新建source文件夹

3.4 在source文件夹中放入要加密的文件(以hello.py为例)

image.png

3.5 将py2pyd.py文件中的 .\source\hello.py 修改成需要加密的.py文件

image.png

3.6 运行py2pyd.py,会在page_demo文件夹中出现一个.pyd的文件

image.png

3.7 打包模块测试

在page_demo文件夹中新建demo.py文件,导入这个模块,使用模块中的函数测试打包是否成功 image.png

4. 问题和解答

  • 支持多层文件文件夹嵌套吗?
    • 支持,多层文件和文件夹嵌套,会递归找出所有的python文件,并转译成.pyd文件 image.png
  • 支持的python解释器版本是多少?
    • 支持python3.6 3.7 3.8 3.9 python3.10(3.10只支持低版本,高版本打包会出错)
  • 打包后效率有什么变化?
    • 效率提升了:对于纯计算代码,打包成pyd的性能与用python3调用相比,性能约提高一倍
    • 用于测试的代码片断
import time   
def sum_int():
     start_time = time.time()     
     a = (x for x in range(4*10 ** 8))     
     sum_int = 0     
     for i in a:
         sum_int += i      
     print(sum_int)     
     print(f'cost_time:{time.time() - start_time}')   
 if __name__ == "__main__":
     sum_int()

5. 打包工具

演示效果

  • 如果不想写使用源代码加密可以使用封装好的EncryptTool.exe
  • 工具采用了PyQT5框架做桌面应用搭建,欢迎下载。 20240207172907_rec_.gif

工具下载

GIT地址:gitee.com/mtoooo/py2-…