在前端游戏开发中,特别是在游戏开发或一些商业应用中,我们经常需要对JavaScript源代码进行保护,防止代码被轻易查看或修改。JSC(JavaScript Compiled)
文件是一种常见的JavaScript
代码保护方式,它通过加密和压缩技术将原始JS代码转换为难以阅读的格式。我们知道Cocos Creator2.4.x
构建后如果选择压缩模式,会生成JSC
后缀的压缩文件,那么我们如何解析JSC
文件呢?本文将介绍一个基于Node.js的JSC
文件加密解密工具的实现原理和使用方法。该工具使用XXTEA
加密算法和Pako
压缩库,能够将普通的JavaScript
文件加密为JSC
文件,也能将JSC文件解密回原始的JavaScript
代码。
技术栈介绍
- Node.js:运行环境
- xxtea-node:提供XXTEA加密算法的实现
- pako:提供高效的压缩和解压缩功能
- readline-sync:处理命令行交互输入
- fs和path:Node.js内置模块,用于文件系统操作
XXTEA加密算法
XXTEA(Corrected Block TEA)是一种分组密码算法,由剑桥大学计算机实验室的David Wheeler和Roger Needham设计。它是TEA(Tiny Encryption Algorithm)的改进版本,具有以下特点:
- 简单高效:算法结构简单,实现容易,运行速度快
- 安全性较高:虽然不如AES等现代加密算法,但对于代码保护已足够
- 密钥长度灵活:通常使用128位密钥
- 资源消耗低:适合在资源受限的环境中使用
Pako压缩库
Pako是一个高性能的JavaScript压缩库,是zlib的JavaScript移植版本。在本项目中,我们使用Pako来:
- 减小加密后文件的大小
- 增加代码的混淆程度,提高破解难度
- 提高加载效率
核心功能实现
文件操作工具
首先,我们实现了基本的文件读写功能:
1 | // 文件操作工具 |
压缩与解压缩
使用Pako库实现文件内容的压缩和解压缩:
1 | // 压缩文件 |
加密与解密
结合XXTEA加密算法和压缩功能,实现核心的加密解密逻辑:
1 | // 加密文件 |
这里的加密流程是:
- 根据
isZip
参数决定是否先压缩内容 - 使用XXTEA算法和提供的密钥对内容进行加密
解密流程则是加密的逆过程:
- 使用XXTEA算法和密钥解密内容
- 如果内容是压缩的,则进行解压缩
文件加密与解密功能
基于上述核心功能,我们实现了完整的文件加密和解密功能:
1 | // 解密逻辑 |
这两个函数分别处理了:
- 文件存在性检查
- 读取源文件内容
- 调用核心加密/解密函数
- 创建输出目录
- 写入处理后的文件
- 错误处理和日志输出
命令行交互
为了方便用户使用,我们实现了命令行交互功能,支持通过命令行参数或交互式输入来指定操作类型、文件路径和密钥:
1 | // 主程序入口 |
命令行支持的参数包括:
- 操作类型:
encrypt
(加密)或decrypt
(解密) - 文件路径:要处理的JS或JSC文件路径
- 密钥:用于加密或解密的密钥
- 选项:
--nozip
表示不使用压缩
如果用户没有通过命令行提供这些参数,程序会通过交互式提示要求用户输入。
最后完整代码:
1 | const fs = require("fs"); |
package.json
1 | { |
使用示例
加密JavaScript文件
1 | # 命令行方式 |
加密成功后,加密后的JSC文件将保存在encryptOutput
目录下,文件名为projectChanged.jsc
。
解密JSC文件
1 | # 命令行方式 |
解密成功后,解密后的JS文件将保存在decryptOutput
目录下,文件名为dec.js
。
不使用压缩的加密/解密
如果你不希望在加密过程中使用压缩(或在解密过程中进行解压缩),可以添加--nozip
选项:
1 | node index.js encrypt path/to/your/file.js your-secret-key --nozip |
总结
本文介绍了一个基于Node.js的JSC文件加密解密工具,它使用XXTEA加密算法和Pako压缩库,能够有效地保护JavaScript代码。该工具支持命令行参数和交互式输入,使用简单方便。通过这个工具,开发者可以在保持JavaScript灵活性的同时,为代码增加一层保护,使得核心业务逻辑不易被窃取或篡改。