cocos2dx 图片资源加密解密
本文将和大家分享 Cocos2dx 图片资源加密解密的方法。如果大家对该方法有疑问或有完善建议,可到社区发帖交流学习,社区也会持续更新这方面的内容,共同探讨使用过程中遇到的问题。
TexturePacker 图片加密功能
TexturePacker 最新版本新增了 ContentProtection 功能,可防止产品资源被反编译,即图片加密。不过目前官方仅支持 Cocos2d - iphone 的解密。TexturePacker 作者表示,不久后 Cocos2d - x 也将集成解密功能,相关代码已提交至 Cocos2d - x 的 GitHub 官方库。(文章部分内容参考自泰然论坛 TexturePacker 图片加密)
你的应用或游戏能够正常解密数据,但他人破解则需耗费大量时间。理论上,他人有可能从源码中提取密钥并编写解码器,因为解码器和密钥存储在应用中,否则无法使用游戏资源。然而,这需要具备专业知识,且耗费大量时间和精力,所以他们很可能会选择更简单的目标进行破解,而非你的资源文件。
TexturePacker 加密策略设置
假设你已使用 TexturePacker 创建过精灵表,只需打开一个已有的 .tps
文件。具体操作步骤如下:
- 下载最新版的 TexturePacker,在左侧会看到一个新的 option 属性:Content Protection。按下“Lock”图标,会弹出一个新窗口。
- 设置密钥:在编辑框中可输入想要设置的密钥,也可按“Create new key”按钮创建新密钥。若要关闭加密功能,使用“Clear/Disable”选项。
- 密钥存储与使用:在 TexturePacker 中按下“Save as global key”,可将密钥存储为全局变量,用于在
.pvr
查看器中解密。按下“Use global key”按钮,可将密钥复制到其他精灵表中。 - 文件格式设置:将文件格式改为
pvr.ccz
非常重要,这是当前唯一支持解密的格式。 - 完成操作:在 TexturePacker 中按下“Publish”完成设置。在命令行中输入的命令是
--content - protection <key>
,其中key
必须是 32 位十六进制值。
Cocos2d - x 工程准备 Content protection
替换文件
下载并拷贝以下 2 个文件到你的 cocos2d - x 文件夹里,替换原有的文件后重新编译 libcocos2d.lib
:
cocos2d - 2.1rc0 - x - 2.1.*\\cocos2dx\\support\\zip_support\\ZipUtils.h
cocos2d - 2.1rc0 - x - 2.1.*\\cocos2dx\\support\\zip_support\\ZipUtils.cpp
设置密钥
在应用中设置密钥,可在第一个精灵表导入前,于程序启动前调用 4 个方法完成。为增加破解难度,建议分开调用这些方法。
若密钥为 aaaaaaaabbbbbbbbccccccccdddddddd
,需将其分成 4 部分,每部分 8 位:
aaaaaaaa
bbbbbbbb
cccccccc
dddddddd
128 位加密密钥每个值是 32 位,作为不同值传递给函数,在应用中更难被定位。设置密钥有以下两种方式:
- 方式一:
ZipUtils::ccSetPvrEncryptionKey(0xaaaaaaaa, 0xbbbbbbbb, 0xcccccccc, 0xdddddddd);
- 方式二:
ZipUtils::ccSetPvrEncryptionKeyPart(0, 0xaaaaaaaa); ZipUtils::ccSetPvrEncryptionKeyPart(1, 0xbbbbbbbb); ZipUtils::ccSetPvrEncryptionKeyPart(2, 0xcccccccc); ZipUtils::ccSetPvrEncryptionKeyPart(3, 0xdddddddd);
导入头文件与资源文件
在每个需要使用解密的文件中,确保添加以下代码:
#import "ZipUtils.h"
若已更改文件格式,需导入 .pvr.ccz
文件替代之前使用的文件,当然也可添加新文件到工程中。
总结
保护游戏资源不被盗用并不复杂。使用新的 Content Protection 功能,只需不到五分钟即可完成设置。