跳转至

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:脚本加密(编译)

  1. 在项目管理窗口下方的选项区勾选 脚本加密(编译);
  2. 点击 下载底层和脚本(或先 生成量产文件 再烧录量产文件)。

勾选后,工具在打包时会把脚本编译成字节码,中间的 .luac 文件可以在 Luatools/_temp/script/compile_script/ 下看到,文件头是 1B 4C 75 61(即 ASCII 的 \x1bLua)。

注意:只勾选"脚本加密(编译)"不会生成 .encrypt.zip。它只改变脚本在固件里的形态,不是加密包。

5.2 加密成 luae:加密脚本(密码8-16字节)

  1. 同上,先选好工程、底层 core 和脚本;
  2. 勾选 加密脚本(密码8-16字节),在它右侧的输入框里填写密码(密码框紧跟"密钥文件"按钮);
  3. 点击 下载底层和脚本。

Luatools 项目管理中的加密相关选项

勾选后,烧进模组的脚本就是加密后的 .luae;模组解析到 .luae 时会用密钥解密后再执行,所以你本地仍然用普通 .lua 开发,烧录时由工具完成加密。

密码规则

  • 密码必须非空,且不超过 16 字节。留空时点生成,工具会报「下载底层+脚本时,加密脚本必须有秘钥,请输入秘钥」。
  • 选项标签写的是"密码8-16字节",但实测少于 8 字节也能通过(用 7 位密码可正常生成),只是不安全;建议至少 8 位,字母+数字混合。
  • 密码请离线备份。密码丢了不影响你重新烧录(源码还在你手上,换个密码重烧即可),但你之前发给客户的 .luae 和 .encrypt.zip 就再也解不开了。

5.3 生成量产加密包(三次开发)

典型场景:你写好了库(业务逻辑),要交给客户 B 在这个基础上做二次开发,但不想让他看到你的库源码。

  1. 勾选 加密脚本(密码8-16字节) 并填好密码;
  2. 点击 生成量产文件;
  3. 到 Luatools/4G远程升级文件/ 下找产物("量产文件保存路径"留空时就是这里):
  4. 工程名_版本号_LuatOS-Air_版本_型号.dfota.bin:远程升级用的差分包
  5. 工程名_版本号_LuatOS-Air_版本_型号.encrypt.zip:加密脚本包
  6. 把 .encrypt.zip 解压,内容形如:
main.luae            # 你的脚本,已加密
test_module.luae
sys.luae / log.luae / clib.luae / patch.luae / pm.luae / utils.luae   # 默认 lib 也会一起加密
encrypt_key.cpio     # 密钥文件,解密用
  1. 交给客户 B 的是:.luae 脚本 + encrypt_key.cpio;
  2. 客户 B 在自己的工程里:
  3. 把 .luae 当成普通 .lua 一样加入"脚本和资源列表"(require "你的模块名" 照常写);
  4. 勾选 加密脚本(密码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。

搜索