14 脚本加密与量产加密包
一、简介
脚本加密是 Luatools 在打包下载时对 Lua 脚本做保护的功能。Luatools 的项目管理窗口里提供了三个容易混淆的选项,它们解决的是完全不同的问题,可以叠加使用。
| 选项 | 做了什么 | 产物 | 能防什么 | 不能防什么 |
|---|---|---|---|---|
| 脚本加密(编译) | 把 .lua 编译成 Lua 字节码 | .luac(\x1bLua 开头) |
防随手改脚本,加载更快 | 不防读,字节码可反编译还原出逻辑 |
| 加密脚本(密码8-16字节) | 字节码再用密码做对称加密 | .luae(无 Lua 头,512 字节对齐) |
没有密码无法还原脚本 | 不能阻止别人往设备里刷其它固件 |
| 固件签名 | RSA 非对称签名,公钥校验 | key.db 签名密钥 |
防止刷入非你签名的固件 | 不保护脚本内容本身 |
另外还有一个 密钥文件 按钮,配合"三次开发"使用(把你加密好的 .luae 交给别人做二次开发)。
- 只想提高加载速度、随手改不了 → 勾「脚本加密(编译)」。
- 不想让别人看到源码 → 勾「加密脚本(密码8-16字节)」并设置密码。
- 不想让别人往你的设备里刷固件 → 勾「固件签名」。
1.1 原理(为什么 luac 和 lua 可以混用,luae 不行)
- luac:Lua 解释器本身就同时支持"文本源码"和"二进制 chunk(字节码)"两种输入,
luac只是源码经过词法/语法分析后的定长指令序列。所以.luac与.lua相互兼容、可以互相 require,只是可读性差、加载更快。 - luae:这是合宙自定义的格式,不是 Lua 标准的一部分。模组对每个 lua 文件单独解析,遇到
.luae就用密钥解密再执行。所以.luae不能和.lua/.luac混用,工具和底层会在各个环节做校验。 - secure boot:确保芯片运行的是可信代码,验签通过才允许执行。secure boot 一旦打开就无法再关闭,量产前确认清楚。
1.2 适用范围
本文的操作与产物格式基于 RDA8910 平台验证,适用于 Air724UG、Air795UG、Air720UH、Air722UG、Air820UG 的 LuatOS-Air 版本。其它平台(Air780E / Air780EPM / Air8000 等 LuatOS 版本,EC618 / EC7xx 平台)的脚本加密机制、密钥文件格式与此不同,请勿照搬本文步骤。
二、演示功能概述
本教程教你如何用 Air724 开发板,演示 Luatools 的脚本加密功能:把脚本编译成 luac、把脚本加密成 luae,以及生成给客户二次开发用的量产加密包,并且通过产物和日志观察结果。
三、准备硬件环境
3.1 开发板准备
使用 EVB_Air724 开发板,如下图所示:

淘宝购买链接:Air724UG-NFM 开发板淘宝购买链接 ;
此开发板的详细使用说明参考:Air724UG 产品手册 中的《EVB_Air724UG_AXX 开发板使用说明》,写这篇文章时最新版本的使用说明为:《EVB_Air724UG_A14 开发板使用说明》;开发板使用过程中遇到任何问题,可以直接参考这份使用说明文档。
3.2 数据通信线
USB 数据线一根(micro USB)。
3.3 PC 电脑
WIN7 以及以上版本的 WINDOWS 系统。
3.4 组装硬件环境
USB 数据线插入 USB 口,另一端与电脑相连,拨码开关全部拨到 ON,串口切换开关选择 UART1,USB 供电的 4V 对应开关拨至 ON 档,如下图所示。

四、准备软件环境
4.1 下载调试工具
使用说明参考:Luatools 下载和详细使用。本文使用 Luatools v3.4.14 验证,建议使用同版本或更新的版本。
4.2 底层固件
底层 core 下载链接:https://docs.openluat.com/air724ug/luatos/firmware/
注意固件版本要求:过老的固件不支持脚本加密,打包时会提示「V3102不支持脚本加密」,请先把底层 core 升到较新版本。本文验证使用的是 LuatOS-Air_V4028_RDA8910.pac。
4.3 准备工程与脚本
打开 Luatools,点击右上角 项目管理,创建一个工程,在弹出的界面中:
- 点击「选择文件」,选择底层 core(
*.pac); - 点击「增加脚本或资源文件」,选择你的脚本目录(如上图
main.lua、test_module.lua); - 建议勾选「添加默认扩展库」,让工具自动带上 lib。
本文验证用的脚本是一个 main.lua + 一个 test_module.lua,使用默认 lib(script_LuaTask_V2.4.4)。
五、功能演示
5.1 编译成 luac:脚本加密(编译)
- 在项目管理窗口下方的选项区勾选 脚本加密(编译);
- 点击 下载底层和脚本(或先 生成量产文件 再烧录量产文件)。
勾选后,工具在打包时会把脚本编译成字节码,中间的 .luac 文件可以在 Luatools/_temp/script/compile_script/ 下看到,文件头是 1B 4C 75 61(即 ASCII 的 \x1bLua)。
注意:只勾选"脚本加密(编译)"不会生成 .encrypt.zip。它只改变脚本在固件里的形态,不是加密包。
5.2 加密成 luae:加密脚本(密码8-16字节)
- 同上,先选好工程、底层 core 和脚本;
- 勾选 加密脚本(密码8-16字节),在它右侧的输入框里填写密码(密码框紧跟"密钥文件"按钮);
- 点击 下载底层和脚本。

勾选后,烧进模组的脚本就是加密后的 .luae;模组解析到 .luae 时会用密钥解密后再执行,所以你本地仍然用普通 .lua 开发,烧录时由工具完成加密。
密码规则
- 密码必须非空,且不超过 16 字节。留空时点生成,工具会报「下载底层+脚本时,加密脚本必须有秘钥,请输入秘钥」。
- 选项标签写的是"密码8-16字节",但实测少于 8 字节也能通过(用 7 位密码可正常生成),只是不安全;建议至少 8 位,字母+数字混合。
- 密码请离线备份。密码丢了不影响你重新烧录(源码还在你手上,换个密码重烧即可),但你之前发给客户的
.luae和.encrypt.zip就再也解不开了。
5.3 生成量产加密包(三次开发)
典型场景:你写好了库(业务逻辑),要交给客户 B 在这个基础上做二次开发,但不想让他看到你的库源码。
- 勾选 加密脚本(密码8-16字节) 并填好密码;
- 点击 生成量产文件;
- 到
Luatools/4G远程升级文件/下找产物("量产文件保存路径"留空时就是这里): 工程名_版本号_LuatOS-Air_版本_型号.dfota.bin:远程升级用的差分包工程名_版本号_LuatOS-Air_版本_型号.encrypt.zip:加密脚本包- 把
.encrypt.zip解压,内容形如:
main.luae # 你的脚本,已加密
test_module.luae
sys.luae / log.luae / clib.luae / patch.luae / pm.luae / utils.luae # 默认 lib 也会一起加密
encrypt_key.cpio # 密钥文件,解密用
- 交给客户 B 的是:
.luae脚本 +encrypt_key.cpio; - 客户 B 在自己的工程里:
- 把
.luae当成普通.lua一样加入"脚本和资源列表"(require "你的模块名"照常写); - 勾选 加密脚本(密码8-16字节),点击 密钥文件,选中你给他的
encrypt_key.cpio。
模组解析到 .luae 时会调用密钥解密后执行,客户 B 看不到你的源码,也不需要知道你的密码。
补充:「密钥文件」按钮的提示是"仅Air724/723/722等RDA8910模块支持",本节流程只在 RDA8910 平台内成立。
5.4 实测结果
| 验证项 | 结果 |
|---|---|
| 选项文案与位置 | 项目管理窗口下方:脚本加密(编译)、加密脚本(密码8-16字节)、密钥文件、固件签名 |
| 勾选"编译"并生成 | 生成 _temp/script/compile_script/*.luac,文件头 1B 4C 75 61;不产生 .encrypt.zip |
| 勾选"加密"并填 8 位密码 | 生成 *.dfota.bin + *.encrypt.zip;zip 内 8 个 .luae + encrypt_key.cpio |
.luae 内容 |
头部 13 FB 4D E9 ... 等随机值,非 Lua 字节码;main.luae 512 B(同源 main.luac 829 B) |
.cpio 内容 |
512 B,含 luat/key... 路径,即密钥文件 |
| 密码留空 | 报错「下载底层+脚本时,加密脚本必须有秘钥,请输入秘钥」 |
| 密码 7 字节 | 可以通过,正常生成(标签写 8-16,实际未强制下限) |
| 密码 17 字节 | 失败,界面「合并失败: 保存文件时发生错误」,日志 ERROR 保存文件时发生错误 |
| 量产文件保存路径留空 | 产物落在 Luatools/4G远程升级文件/ |
六、开机调试
6.1 下载到开发板
工程配置好之后,按住开发板的 BOOT 键再上电(或点复位)进入下载模式,在 Luatools 中点击 下载底层和脚本,等待下载完成。
加密脚本必须走 下载底层和脚本(或烧录完整量产文件),不能只下载脚本 —— 密钥随底层一起写入,只下脚本时设备解不开密码。
6.2 验证加密是否生效
保持工程不变,把「加密脚本」的勾去掉,再点一次 下载脚本,脚本会无法正常运行 —— 说明设备上跑的那份确实是密文,加密生效。
七、常见问题
7.1 勾了加密但没填密码
点击生成或下载时只提示「下载底层+脚本时,加密脚本必须有秘钥,请输入秘钥」,量产不会生成。填上密码重新生成即可。
7.2 密码填太长会报"保存文件时发生错误"
密码上限是 16 字节。超过 16 字节时工具没有"密码超长"的明确提示,只报「合并失败: 保存文件时发生错误」,日志里也是同一句,容易被误认为磁盘或权限问题。遇到这个报错,先把密码缩短到 16 字节以内再试。
7.3 提示"加密合并压缩后超出了底层文件能支持的空间"
.luae 按 512 字节块对齐,加密后体积会变大,脚本多、lib 全的时候更明显。请换脚本区更大的固件,或精简脚本与资源文件。
7.4 提示"V3102不支持脚本加密"
底层 core 版本过老,先把 core 升到较新版本再加密。
7.5 加密后的脚本还能和普通脚本互相升级吗
加密脚本的远程升级方式与普通脚本一致(差分包)。不同加密形态之间的兼容边界,建议量产前用小批量设备验证后再批量出货。
7.6 加密能防止别人刷固件吗
不能。加密只保护脚本内容不被还原;要防止别人往你的设备里刷固件,需要同时开启 固件签名,并保管好 key.db。