前言:有时我们需要把项目给客户,但是需要加密,就需要代码加密技术
一、MATLAB的代码加密
这是一个非常实际的需求,涉及到软件保护和商业机密。在 MATLAB 中,实现您所说的"加密让对方能用,但看不到代码(P-code) "和"设置失效日期(DRM/License Protection)"主要有两种官方方法。
🔒 方案一:MATLAB 官方加密(P-code + MCR)
这是最简单、最常用的方法,可以完美实现"看不到代码"的要求。
1. 代码加密(P-code)
P-code (Pseudo-code) 是 MATLAB 提供的官方加密手段。它将您的 .m
文件转换为一个编译后的 .p
文件。
-
效果: 用户可以运行
.p
文件,但无法打开或查看原始的.m
源代码。 -
实现: 在 MATLAB 命令行中,对您的主函数文件运行
pcode
命令。% 示例:将主运行文件 realtime_predict_lstm.m 加密
pcode realtime_predict_lstm.m
运行后,MATLAB 会生成一个 realtime_predict_lstm.p
文件。您只需将这个 .p
文件和您的模型、数据等一起发给客户即可。
2. 设置失效日期(需要 MATLAB Compiler)
单独使用 P-code 无法设置失效日期。要添加时间限制,您需要使用 MATLAB Compiler™(MATLAB 编译器)。
步骤 | 说明 |
---|---|
打包 | 使用 mcc 命令或 deploytool (部署工具)将您的 .m 文件(或 .p 文件)打包成一个独立的可执行程序(.exe)。 |
许可限制 | MATLAB Compiler 在打包时,会将对 MATLAB Runtime (MCR) 的依赖写入程序。MCR 本身没有内置的过期时间功能。 |
替代方法 (外部限制) | 您需要在您的 MATLAB 代码内部 实现时间检查逻辑,并在打包时将其包含进去。 |
🛠️ 代码内部实现失效日期
您可以在您的主运行文件(例如 realtime_predict_lstm.m
)的开头添加一个日期检查机制。
Matlab
% --- 添加在您的主函数(.m 文件)的顶部 ---
function realtime_predict_lstm()
% 定义失效日期:例如 2025 年 12 月 31 日
expirationDate = datetime(2025, 12, 31);
currentDate = datetime('now');
if currentDate > expirationDate
error('警告:程序已超过授权期限,请联系供应商获取最新版本。');
end
% ---------------------------------------------
% 以下才是您程序的主要逻辑
% ...
交付流程(P-code + MCR):
-
将主
.m
文件转为.p
文件(确保.p
文件包含了上面的日期检查逻辑)。到这布也差不多了,具有时效性,对面用matlab也能运行,还有时效性。 -
使用 MATLAB Compiler 将您的
.p
文件和所有依赖项(模型、图片等)打包成一个.exe
可执行程序。 -
客户运行
.exe
,如果日期超过,程序将抛出您设置的错误并停止运行。
🔐 方案二:第三方 License 保护(推荐更专业的保护)
如果您需要更健壮和灵活的授权管理(例如:限制运行次数、限制在特定电脑上运行、远程授权管理),那么 MATLAB Compiler 的内部日期检查功能可能不够用。
您可以考虑使用专业的第三方软件保护工具,例如 CodeMeter 或 RLM (Reprise License Manager)。
特性 | MATLAB Compiler (方案一) | 第三方工具 |
---|---|---|
加密级别 | P-code (反编译困难) | 工业级代码混淆/虚拟机保护 |
功能限制 | 仅支持简单的日期检查(需手动编码) | 支持复杂的授权文件、硬件指纹、网络浮动许可等 |
复杂度 | 低,MATLAB 内部完成 | 高,需要学习和集成额外的 License SDK |
对于大多数科研和简单商业用途,方案一(P-code + 内部日期检查 + MCR 打包) 已经足够安全和方便了。
打包.exe
太棒了!您选择进行打包和加密,这是将您的工作成果交付给客户的关键一步。
打包(Deployment)需要使用 MATLAB Compiler™ 。这个过程将您的 P-code 文件和所有依赖文件(模型、图片、数据)封装成一个独立的 .exe
可执行文件 ,并且客户的电脑上不需要安装 MATLAB 也能运行它(只需要安装免费的 MATLAB Runtime)。
实现打包最简单、最推荐的方法是使用 MATLAB 自带的 Deployment Tool (部署工具)。
📦 使用 App Designer 或 Deployment Tool 打包
有两种主要方式可以启动打包工具:
方式一:推荐使用 App Designer(如果您有)
如果您是使用 App Designer 创建的 GUI,打包会更简单。
-
打开您的 App Designer 文件 (
.mlapp
)。 -
在 App Designer 工具条 中,点击 "Deploy" 选项卡。
-
点击 "MATLAB Web App" 或 "Windows Application" (后者即生成
.exe
)。 -
按照向导操作即可。
方式二:使用 deploytool
(推荐用于脚本)
如果的代码是传统的 .m
脚本(像我们一直在用的这种),请使用命令行启动部署工具:
-
在 MATLAB 命令行输入:
deploytool
-
在弹出的对话框中,选择 "Application Compiler"(应用程序编译器)。
📜 应用程序编译器打包步骤
以下是使用 Application Compiler 将您的 .p
文件 打包成 .exe
的详细步骤:
步骤 1: 设置文件类型和主文件
-
Application Type(应用程序类型): 确保选中左侧的 "Standalone Application"(独立应用程序)。
-
Main File(主文件): 点击
+
按钮,将您的主运行文件realtime_predict_lstm.m
(或者它的 P-code 版本realtime_predict_lstm.p
)添加进去。- 提示: 最好打包
.p
文件,以确保客户无法看到原始代码。
- 提示: 最好打包
步骤 2: 添加依赖文件
在打包过程中,您必须确保将程序运行所需的所有外部文件都包含进去。
-
Required Files(必需文件): 在窗口底部的 "Files required for your application to run" 区域,点击
+
图标添加以下文件:-
您的模型文件:
trained_models/trained_lstm_net.mat
-
您的图片文件:
teng.jpg
-
您的数据文件(如果您希望它是内嵌的):
dataset/副本1-14,每个600,200一算.xlsx
-
-
Files Included in Package(打包中的文件): 检查确认您的文件都在列表中
步骤 3: 设置打包信息(可选但推荐)
在左上角的 "Compiler Settings" 区域,您可以设置程序的图标、名称和版本:
-
Application Name: 输入客户可见的程序名称(如:"风速实时监测系统")。
-
Application Icon: 可以设置一个
.ico
文件作为程序的图标。
步骤 4: 打包和生成
-
点击窗口右下角的 "Package"(打包)按钮。
-
MATLAB 会提示您保存项目文件(
.prj
),然后开始编译。 -
编译过程可能需要几分钟。完成后,MATLAB 会打开一个名为
for_redistribution
的文件夹。
🎁 交付给客户的文件
您需要将 for_redistribution
文件夹中的以下文件发给客户:
-
.exe
可执行文件: 您的应用程序,客户可以直接运行。 -
MATLAB Runtime Installer: 位于
for_redistribution/MyAppInstaller
文件夹中。这是最关键的一步! 客户必须先安装这个免费的 MATLAB Runtime ,然后才能运行您的.exe
文件。
二、Python代码加密
在 Python 领域,没有像 MATLAB P-code 那样简单的、官方内置的伪代码加密工具。我们通常采用以下三种主流方案来实现"客户能用,但看不到源码"的目标:
🔒 方案一:编译为机器码(推荐且最常用)
这是将 Python 代码转换为一个**独立的可执行程序(.exe
或其他平台的二进制文件)**的最常见和最有效的方法。
核心工具:PyInstaller 或 Nuitka
工具 | 原理 | 优势 | 劣势 |
---|---|---|---|
PyInstaller | 将 Python 源码、解释器和所有依赖库打包成一个或多个独立文件。 | 最简单。客户电脑无需安装 Python 环境。源码被隐藏在大型二进制文件中。 | 只是打包,并非真正的加密;专业人员仍可通过反编译工具查看部分代码逻辑。 |
Nuitka | 将 Python 代码编译成 C 语言代码,然后编译为机器码。 | 速度更快 ,因为代码被编译成了机器码;保护性比 PyInstaller 更强。 | 编译过程更复杂,可能会遇到一些兼容性问题。 |
如何实现:
-
安装工具:
pip install pyinstaller
-
打包命令:
# 使用 PyInstaller 打包成单个可执行文件 (推荐) pyinstaller --onefile your_main_script.py
结果: 客户得到一个 .exe
文件,看不到源码,双击运行。
🔐 方案二:字节码加密和混淆(适用于库文件)
如果您的程序不是一个完整的 .exe
,而是作为 Python 库(.whl
或 .so
)交付,您可以使用专门的工具进行加密。
核心工具:Cython 或 Python Obfuscators
方法 | 原理 | 优势 | 劣势 |
---|---|---|---|
Cython | 将关键 Python 模块编译成 C 扩展模块(.so 或 .pyd 文件)。 |
安全级别高,因为代码被编译成了 C 语言的二进制文件,难以逆向工程。 | 需要额外的 C 编译器,设置和依赖项管理较为复杂。 |
代码混淆器 (Obfuscators) | 改变变量名、函数名,插入无用代码,让代码难以阅读,但保持可执行。 | 简单快捷,无需编译。 | 并非真正的加密,只能阻止非专业人士阅读。 |
📅 设置失效日期(许可证保护)
与 MATLAB 类似,Python 也没有内置的失效日期功能。您需要在代码中实现日期检查 或使用专业的许可证库。
1. 简单方法:代码内部检查
在您的 Python 主程序入口(例如 if __name__ == '__main__':
块)中添加日期检查逻辑:
Python
import datetime as dt
# 定义失效日期 (例如:2026年1月1日)
EXPIRATION_DATE = dt.datetime(2026, 1, 1)
def run_application():
if dt.datetime.now() > EXPIRATION_DATE:
raise PermissionError("警告:授权已过期,请联系供应商更新。")
# ... (您的主要程序逻辑) ...
if __name__ == '__main__':
run_application()
注意: 这种方法可以通过更改系统时间绕过,但对普通客户来说足够有效。
2. 专业方法:使用许可证库
使用第三方 Python 库(如 Licenseware 或 Cryptolens)可以实现更健壮的许可证保护,包括:
-
硬件绑定: 限制程序只能在特定电脑上运行。
-
在线验证: 在程序启动时检查许可证服务器。