如何加密(一种方式,即不可逆也可以)仍然可执行的 python 脚本?

How to encrypt (one way i.e. irreversible is also fine) a python script which is still executable?

我有一个用 Python 编写的 AI 程序。我想在 Ubuntu/Windows 机器上部署脚本而不公开源脚本。 我怎样才能加密 Python 脚本,使其被不可逆编码但可以照常使用(比如从终端调用 python <script_name>.py)?

真正的加密是不可能的,但通过混淆和压缩,您可以让任何人都很难理解或重用源代码。你可以看看这个: https://liftoff.github.io/pyminifier/

您也可以尝试将 python 脚本编译为字节码,但如果有人真的想对您的代码进行逆向工程,所有这些过程仍然是半可逆的。

混淆Python脚本

  • 首先,将python源文件编译成代码对象

  • 迭代代码对象,将每个代码对象的字节码包装为 以下格式

  
    0   JUMP_ABSOLUTE            n = 3 + len(bytecode)

    3
    ...
    ... Here it's obfuscated bytecode
    ...

    n   LOAD_GLOBAL              ? (__pyarmor__)
    n+3 CALL_FUNCTION            0
    n+6 POP_TOP
    n+7 JUMP_ABSOLUTE            0
  • 将混淆后的代码对象保存为.pyc或.pyo,因此可以是运行或 由普通 Python 解释器导入。

运行 或导入混淆的 Python 脚本

那些混淆文件(.pyc 或 .pyo)可以 运行 并正常导入 通过普通 python 解释器的方式。但是当那些代码对象被调用时 第一次,从上一节中描述的包装字节码,我们 知道

  • 第一个操作是JUMP_ABSOLUTE,它会跳转到偏移量n

  • 在偏移量 n 处,指令是调用 PyCFunction。这个功能 将恢复偏移量 3 和 n 之间的那些混淆字节码,并且 将原始字节码放在偏移量 0

  • 函数调用后,最后一条指令是跳转到 offset 0. 现在真正的字节码被执行了。

有一个工具 Pyarmor 可以通过这种方式混淆 python 脚本。