lua和部分资源加解密 - GameKong/restaurant GitHub Wiki

加密流程(!!#ff0000 encrypt_files.sh!!)

  1. 在publish文件夹下创建!!#ff9900 tmp_crypt!!临时文件夹。
  2. 定义用于加密的!!#ff9900 密钥和签名!!以及压缩的!!#ff9900 签名!!。
  3. 使用luac编译lua代码,将编译好的二进制文件储存在tmp_crypt临时文件夹中。
  4. 使用制作好的!!#ff9900 encrypt工具!!(hookheroes/tools/encrypt/encrypt)进行加密,依次传入源目录、目标目录、加密密钥、加密签名和压缩签名作为参数。 - ** lua文件** 将src_raw文件夹下(不包括!!#ff9900 cocos!!文件夹中的lua文件)的所有lua文件进行加密。 - ** 部分资源文件** 将res_raw文件夹下(不包括!!#ff9900 audio、shaders、h5res、spinejson!!文件夹中的文件)的所有资源文件进行加密。 5. 移除旧的src和res文件夹,将最新加密好的src和res文件夹拷贝到项目工程目录。 6. 将未加密的文件拷贝到加密文件夹中。 7. 移除!!#ff9900 tmp_crypt!!临时目录。 8. 调用!!#ff9900 encrypt_json.sh!!脚本!!#ff9900 加密压缩spinejson!!,并拷贝到对应目录。 9. 加密和压缩完成。

encrypt工具

  • 工具涉及文件及其功能
build.sh:用于工具构建encrypt工具的shell脚本,主要是执行cmake命令、将生成的encrypt工具拷贝到相应目录、删除临时目录。
CmakeList.txt:用于构建encrypt工具的cmakeList配置文件,该文件中引用了cocos提供的zlib压缩库和xxtea对称加密库,这两个库提供了压缩和加密功能。
encrypt:压缩和加密的可执行文件。
main.cpp:encrypt工具的主函数入口文件,根据提供的源文件地址、目标文件地址、加密密钥和签名、 压缩签名,使用zlib和xxtea库对源文件进行压缩和加密,然后将处理后的二进制文件储存在目标地址中。

读取、解密lua和部分资源文件

  • 加密标记: 在工程根目录的CmakeList.txt文件中,根据构建类型执行设置相应的标记,在cpp代码中会根据!!#ff9900 CC_LUA_CRYPT_ENABLED!!这个宏的定义来决定,是否对读取到的资源数据进行解密,代码如下:
target_compile_definitions(${APP_NAME} PUBLIC $<$<CONFIG:Debug>:CC_LUA_CRYPT_ENABLED=0>)
target_compile_definitions(${APP_NAME} PUBLIC $<$<CONFIG:Release>:CC_LUA_CRYPT_ENABLED=1>)
  • 解密类(!!#ff9900 Magic!!)
namespace  cocos2d {
     class  Magic {
     public:
        // 加密有没有生效
         static   bool  isEnabled();
        // 设置密钥
         static   void  set( const   char key);
        // 解密文件,返回解密后的内容;不需要解密则直接返回文件字节流
         static  Data get( const  std::string&amp; filename);
        // 解密字节流,返回解密后的内容;不需要解密则返回NULL
         static  Data get( const  Data&amp; dataIn);
    };
}
  • 设置解密密钥(Appdelegate.cpp)
#if CC_LUA_CRYPT_ENABLED
    Magic::set(key);
#endif
  • 使用解密接口替换原有的文件读取函数。lua文件、图片资源、xml, 字体文件读取,涉及到到类有LuaStack、Image、SAXParser,FontFreeType。
// 使用Magic::get替换FileUtils::getInstance()->getDataFromFile
Data data = Magic::get(fullPath); // utils->getDataFromFile(fullPath);

加密、解密过程

  • 加密:A[开始]-->B(压缩)-->C(压缩签名)-->D(加密)-->E(加密签名)-->F[写入二进制文件保存]
  • 解密:A[开始] -->验证加密签名-->B(解密)-->验证压缩签名-->C(解压缩)-->D[获得原始数据]