python源代码加密实现

发布时间:2023年12月28日


在这里插入图片描述

前言

Python 的动态特性和开源特点,导致 Python 代码很难做到很好的加密。应该通过法律手段而或者商业化的加密技术来达到对源码的保护和授权;而还有一些声音则是不论如何都希望能有一种手段来加密。于是乎,人们想出了各种或加密、或混淆的方案,借此来达到保护源码的目的。

首先理解一些概念

.py 文件

以 .py 作扩展名的文件是 Python 源代码文件,由 python.exe 解释,可在控制台下运行。当然,也可用文本编辑器进行修改。

.pyc 文件

以 .pyc 作扩展名的文件是 python 编译文件。.pyc 文件是不能用文本编辑器进行编辑的,其优点是 .pyc 文件的执行速度要远快于 .py 文件。至于为什么要有 .pyc 文件,这个需求太明显了,因为 .py 文件是可直接看到源码的,若是软件开发商的话,不可能把源码泄漏出去?所以,就需编译成 .pyc 后再发布。

.pyw 文件

.pyc 文件执行时,桌面会出现类似 CMD 命令的黑色 shell 窗口,十分难看,于是 .pyw 文件就应运而生了。.pyw 文件与 .pyc 文件的执行,本质上并没什么区别,只是 .pyw 文件执行的时候不会出现类似 CMD 命令的黑色 shell 窗口。

.pyw 文件格式主要是设计用来运行纯 GUI 图形用户界面程序的。 纯 GUI 图形用户界面程序的用户不需要看到类似 CMD 命令的黑色 shell 控制台窗口。.pyw 文件运行时,所有 stdout、stderr 输出无效,所有原 stdin 的读取只会得到 EOF。

值得一提的是,开发纯 GUI 图形用户界面程序时,可暂时把 .pyw 改成 .py,以便运行时调出控制台窗口,看到所有错误信息,方便修改、调试。

.pyo 文件

.pyo 文件是优化编译后的程序。 “python -O 源文件” 即可将源程序编译为 .pyo 文件。同样,.pyo 文件也是不能用文本编辑器进行编辑的。

pyd 文件

.pyd 文件并不是用 python 编写成的,.pyd 文件一般是其他语言编写的 python 扩展模块。.pyd 文件是用 D 语言按照一定格式编写,并处理成二进制的文件。

以下方案仅仅作为参考

pyarmor加密目前采用的较多的

pyarmor obfuscate app.py 命令 obfuscate 用来加密脚本。最常用的一种情况是切换到脚本app.py所在的路径,然后执行。 加密:pyarmor obfuscate app.py,PyArmor 会加密 app.py 和相同目录下面的所有 *.py 文件到dist文件夹中。 运行加密代码:cd dist之后,python app.py即可

第一种

也是值得成功实践的一种方式, 使用cython将源代码转化为c 的二进制形式

Cython的官方文档:

cython.readthedocs.io/en/latest/i…

简单的说,Cython的两个主要作用是:

将python代码编译成二进制的扩展模块,以获得加速;同时可以在python中使用类型声明,进一步提升性能;这就意味着可以使用python代替c编写python扩展在python代码里调用外部的c库

  1. The simplest way of installing Cython is by using pip:

Pip install -i pypi.douban.com/simple cython

下面依据CDSS算法实现cython的转化

算法目录为:

image.png

当前共有六个文件需要转化成c的二进制文件

以下为简单操作流程, 具体请看文档

  1. 书写setup.py文件

image.png

  1. python setup.py build_ext --inplace

  2. 在当前目录会生成以下文件

image.png

会生成build 文件临时文件 .c结尾的文件 c代码 .pyd结尾的文件

  1. 此时可以通过 python解释器 import 这些pyd文件

image.png

  1. 如果想要在以此python环境为基础的其他py文件内引入这些文件。需要将这些文件引入到PYTHONPATH所在的路径内。

将这些pyd文件看做是python的模块即可。 我的python模块路径在

D:\pydemo\CdssProject\cdssvenv\Lib\site-packages

优缺点

生成的二进制 .so 或 .pyd 文件难以破解

同时带来了性能提升

兼容性稍差,对于不同版本的操作系统,可能需要重新编译

虽然支持大多数 Python 代码,但如果一旦发现部分代码不支持,完善成本较高


第二种方式为 代码混淆

如果代码被混淆到一定程度,连作者看着都费劲的话,是不是也能达到保护源码的目的呢?

既然我们的目的是混淆,就是通过一系列的转换,让代码逐渐不让人那么容易明白,那就可以这样下手: - 移除注释和文档。没有这些说明,在一些关键逻辑上就没那么容易明白了。 - 改变缩进。完美的缩进看着才舒服,如果缩进忽长忽短,看着也一定闹心。 - 在tokens中间加入一定空格。这就和改变缩进的效果差不多。 - 重命名函数、类、变量。命名直接影响了可读性,乱七八糟的名字可是阅读理解的一大障碍。 - 在空白行插入无效代码。这就是障眼法,用无关代码来打乱阅读节奏。 使用 oxyry 进行混淆

pyob.oxyry.com/ 是一个在线混淆 Python 代码的网站,使用它可以方便地进行混淆。

image.png 优缺点

简单方便,提高了一点源码破解门槛

兼容性好,只要源码逻辑能做到兼容,混淆代码亦能****

只能对单个文件混淆,无法做到多个互相有联系的源码文件的联动混淆

代码结构未发生变化,也能获取字节码,破解难度不大

第三种 使用 py2exe

py2exe 是一款将 Python 脚本转换为 Windows 平台上的可执行文件的工具。其原理是将源码编译为 .pyc 文件,加之必要的依赖文件,一起打包成一个可执行文件。

如果最终发行由 py2exe 打包出的二进制文件,那岂不是达到了保护源码的目的?

使用 py2exe 进行打包的步骤较为简便。

1)编写入口文件。本示例中取名为 hello.py:

print ‘Hello World’

2)编写 setup.py:

from distutils.core import setupimport py2exe

setup(console**=**[‘hello.py’])

3)生成可执行文件

python setup.py py2exe

生成的可执行文件位于 hello.exe

优缺点

能够直接打包成 exe,方便分发和执行

破解门槛比 .pyc 更高一些

兼容性差,只能运行在 Windows 系统上

生成的可执行文件内的布局是明确、公开的,可以找到源码对应的 .pyc 文件,进而反编译出源码

第四种 使用pyc

不推荐

.pyc文件是由.py文件经过编译后生成的字节码文件,其加载速度相对于之前的.py文件有所提高

image.png

image.png

生成后的文件会在对应目录下的__pycache__下面 移出到相应的py文件路径从而实现代码的代替。

优缺点:

简单方便,提高了一点源码破解门槛

平台兼容性好,.py 能在哪里运行,.pyc 就能在哪里运行

解释器兼容性差,.pyc 只能在特定版本的解释器上运行

有现成的反编译工具,破解成本低

python-uncompyle6 就是这样一款反编译工具


Python技术资源分享

小编是一名Python开发工程师,自己整理了一套 【最新的Python系统学习教程】,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。

保存图片微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

如果你是准备学习Python或者正在学习,下面这些你应该能用得上:

1、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

2、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

在这里插入图片描述

3、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

img

4、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

5、清华编程大佬出品《漫画看学Python》

用通俗易懂的漫画,来教你学习Python,让你更容易记住,并且不会枯燥乏味。

在这里插入图片描述

6、Python副业兼职与全职路线

在这里插入图片描述
这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

👉CSDN大礼包:《Python入门资料&实战源码&安装工具】免费领取安全链接,放心点击

文章来源:https://blog.csdn.net/2301_80239908/article/details/135264803
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。