Python实现代码加密的两种方案详解

 更新时间:2026年03月13日 08:52:38   作者:wgr_1009  
这篇文章主要为大家详细介绍了Python实现代码加密的两种方案,主要是使用Pyarmor工具进行加密和使用cython进行加密,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

方案1:使用Pyarmor工具进行加密

PyArmor 是一个用于加密和保护 Python 脚本的工具。它能够在运行时刻保护 Python脚本的二进制代码不被泄露,设置加密后 Python 源代码的有效期限,绑定加密后的Python源代码到硬盘、网卡等硬件设备。

1、安装

pip install pyarmor
# 验证是否安装成功, 7.0 以下版本为稳定版
pyarmor --version

2、加密过程

首先把源代码编译成代码块

char *filename = "foo.py";
char *source = read_file( filename );
PyCodeObject *co = Py_CompileString( source, "<frozen foo>", Py_file_input );

接着进行如下处理

使用 try…finally 语句把代码块的代码段 co_code 包裹起来

新添加一个头部,对应于 try 语句:

        LOAD_GLOBALS    N (__armor_enter__)     N = length of co_consts
        CALL_FUNCTION   0
        POP_TOP
        SETUP_FINALLY   X (jump to wrap footer) X = size of original byte code

接着是处理过的原始代码段:

对于所有的绝对跳转指令,操作数增加头部字节数

加密修改过的所有指令代码

追加一个尾部,对应于 finally 块:

        LOAD_GLOBALS    N + 1 (__armor_exit__)
        CALL_FUNCTION   0
        POP_TOP
        END_FINALLY

添加字符串名称 __armor_enter, __armor_exit__ 到 co_consts

如果 co_stacksize 小于 4,那么设置为 4

在 co_flags 设置自定义的标志位 CO_OBFUSCAED (0x80000000)

按照上面的方式递归修改 co_consts 中的所有类型为代码块的常量

然后把改装后的代码块转换成为字符串,把字符串进行加密,保护其中的常量和字符串

char *string_code = marshal.dumps( co );
char *obfuscated_code = obfuscate_algorithm( string_code  );

最后生成加密后的脚本,写入到磁盘文件

sprintf( buf, "__pyarmor__(__name__, __file__, b'%s')", obfuscated_code );
save_file( "dist/foo.py", buf );

3、加密模式

PyArmor 提供多种加密模式,以满足安全和性能方面的平衡。通常情况下,默认 的加密模式能够满足绝大多数的需要,一般情况下也不需要对加密模式有详细 的了解。仅当对性能有特别的要求或者默认加密模式无法满足需求的时候,才需 要改变加密模式,这就需要理解 PyArmor 的不同加密模式。

默认加密模式

加密脚本命令

pyarmor obfuscate xx.py

超级模式

目前支持版本

  • python 2.7
  • python 3.7

加密脚本命令

pyarmor obfuscate --advanced 2 xx.py

高级模式

加密脚本命令

pyarmor obfuscate --advanced 1 xx.py

其他加密模式(不常用)

  • 代码加密模式
  • 代码包裹模式
  • 模块加密模式
  • 约束模式

4、使用pyarmor

1.加密脚本

pyarmor [command] [options]

常用命令:pyarmor obfuscate main.py

pyarmor会加密main.py文件和相同目录下的所有*.py文件,并创建输出子目录dist, 生成加密的主脚本main,py、相同目录下的**.py、生成的运行加密脚本所需的全部辅助文件保存到dis输出目录

2.发布加密脚本

发布加密脚本给客户只需要把输出路径dist的所有文件拷贝过去即可

3.生成新的许可文件(可选)

使用命令 licenses为加密脚本生成新的许可文件license.lic,加密脚本的同时会在输出目录下面生成一个默认许可文件,dist/licnese.lic,需要生成新的许可文件,并覆盖默认许可文件

例如:

pyarmor licneses --expired 2019 -01-01 code-001

执行该命令会生成一个带有效期的认证文件,这样超过指定日期后加密脚本就无法正常运行了

4.绑定加密脚本到固定机器上(可选)

如果想绑定加密脚本到固定机器上,首先在该机器上面运行下面的命令获取硬件信息

pyarmor hdinfo

然后生成绑定到固定机器的许可文件

pyarmor licenses --bind-disk “100304PBN2081SF3NJ5T” --bind-mac “20:c1:d2:2f:a0:96” code-002,

同样,覆盖默认的许可证,这样加密脚本就只能在指定机器上运行

5、优缺点

优点

  • 使用方便,加密脚本较快且能一键加密,操作较简单
  • 多种加密模式,满足常规绝大多数的加密要求
  • 有文档支持,对于常见的错误异常可以通过查阅官方文档解决
  • 支持其他功能,例如,检查加密脚本的性能、交叉保护机制
  • 可以设置加密文件有效期及绑定在固定机器上

缺点

  • 每个大的版本的改动比较大,安装时需要查看官方文档选用合适的版本进行安装
  • 个别版本交叉发布时脚本无法运行,具体查看官方文档
  • 安装python版本时需要开启静态库的共享进行安装,否则会无法加密文件
  • 运行加密文件时的python版需要和加密时的python版本一致
  • pyarmor安装的默认是试用版,对加密文件的大小、模块的函数个数等都有限制,用于商业时需要单独购买

方案2:使用cython进行加密

1、安装

pip install cython

2、加密过程

  • 利用Cython将.py文件编译为.c文件
  • 将.c文件编译为为.so或.pyd文件,linux系统为.so文件,Windows系统为.pyd文件

3、使用Cython

创建setup.py加密指定的python文件

from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules = cythonize(["main.py"], language_level=3)

4、简化Cython加密过程

jmpy3为python的一个第三方库,能够将python代码一键加密为.so或者.pyd文件,支持单个文件加密,整个项目加密,加密后会在项目目录中增加一个dist的文件夹,把源文件替换为加密后的文件即可正常运行

安装

pip install jmpy3

切换到项目所在目录,执行以下命令

jmpy -i 项目名称

发布加密脚本

同样加密后会在项目目录中增加一个dist的文件夹,把源文件替换为加密后的文件即可正常运行

5、优缺点

优点

  • 通过jmpy3可以实现一键加密,加密较为方便
  • 加密后代码运行效率有所提升
  • 生成.so或.pyd文件难以破解

缺点

  • 兼容性稍差,对于不同的版本的操作系统,需要重新编译
  • 运行加密文件时的python版需要和加密时的python版本一致
  • 没有官方文档,使用加密后的代码出错后,需要自己排查解决错误

到此这篇关于Python实现代码加密的两种方案详解的文章就介绍到这了,更多相关Python代码加密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Py accelerate的简介安装使用方法详解

    Py accelerate的简介安装使用方法详解

    Accelerate是Huggingface开发的PyTorch库,抽象分布式训练和混合精度样板代码,支持多设备(CPU/GPU/TPU)及FP16/BFloat16混合精度,集成CLI与Notebook启动方式,便于快速部署和扩展模型训练,本文大家介绍Py accelerate的简介安装使用方法之详细攻略,感兴趣的朋友一起看看吧
    2025-07-07
  • TensorFlow人工智能学习创建数据实现示例详解

    TensorFlow人工智能学习创建数据实现示例详解

    这篇文章主要为大家介绍了TensorFlow人工智能学习创建数据实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • 关于pytorch训练分类器

    关于pytorch训练分类器

    这篇文章主要介绍了关于pytorch训练分类器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Pyecharts绘制可视化地球实现示例

    Pyecharts绘制可视化地球实现示例

    这篇文章主要为大家介绍了Pyecharts绘制可视化地球实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • python利用winreg生成桌面路径及实现扫描二维码图片返回相关信息

    python利用winreg生成桌面路径及实现扫描二维码图片返回相关信息

    这篇文章主要介绍了python生成桌面路径及实现扫描二维码图片返回相关信息,winreg是python的一个标准库,用来对windows注册表的操作,更多相关内容需要的小伙伴可以参考一下
    2022-06-06
  • 轻松掌握Python中的if和循环判断技巧

    轻松掌握Python中的if和循环判断技巧

    这篇文章主要介绍了轻松掌握Python中的if和循环判断技巧的相关资料,需要的朋友可以参考下
    2023-11-11
  • Python调用豆包API实现批量提取图片信息

    Python调用豆包API实现批量提取图片信息

    这篇文章主要为大家详细介绍了Python如何通过调用豆包API实现批量提取图片信息的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
    2025-11-11
  • python实现杨辉三角思路

    python实现杨辉三角思路

    本文给大家分享的是作者使用python实现杨辉三角的思路,非常的实用,有需要的小伙伴可以参考下
    2017-07-07
  • django使用F方法更新一个对象多个对象字段的实现

    django使用F方法更新一个对象多个对象字段的实现

    这篇文章主要介绍了django使用F方法更新一个对象多个对象字段的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Linux安装Pytorch1.8GPU(CUDA11.1)的实现

    Linux安装Pytorch1.8GPU(CUDA11.1)的实现

    这篇文章主要介绍了Linux安装Pytorch1.8GPU(CUDA11.1)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论