我们平时在用Cocos2d-x时都不想让别人看到自己的文件,本篇教程将教你如何为你的Cocos2D-X资源加密解密。由于本文针对的是cocos2d-x 3.4 版本进行研究,希望不同版本的同学不要介意。
做加密解密的思路
加密解密算法的简单介绍
首先,加密解密应该是一个单独的话题,一般不会涉及具体使用的引擎、框架和技术。加密算法有Base64,DES等。Base64的原理类似于凯撒密码,啥是凯撒密码呢,就是一个字符用另一个字符来代替。比如:a用i代替,b用k代替,以此类推。加密和解密的过程就是一个互相映射的过程。
DES是一种使用密钥的加密算法。
DES和Base64这种无密钥的算法在使用上的区别是:
DES算法本身是可以不保密的,只要保密密钥即可,密钥才是解密的关键。
Base64如果用于加密的话,算法本身就是密钥。要保密算法。
MD5,SHA等是摘要算法。
Base64,DES都可以把密文还原出明文。
而MD5,SHA则不能对算法作用后的输出还原出原始数据。
摘要算法一般做身份验证。我们做资源加密是要选择能把密文还原出明文的算法。
设计自己的加密解密算法
这属于密码学的内容了,可深可浅。可以借鉴凯撒密码的原理自己对每个字节的内容进行映射来加密。也可以对1字节,2字节,4字节的数据,用某个数进行异或运算来加密。
异或的特性是,用数A对内容B进行异或得到内容C,再用数A对内容C异或可以得到内容B。这个特性可以被用来加密。同时,数A的作用就是密钥了。
设计的加密算法不同,加密算法的使用的接口也不同。
如果是用上面的2种思路做加密算法的话,加密算法的实现可以“in place”操作,就是可以直接在密文所在的内存进行解密,不单独分配内存来保存解密后的数据。如果加密算法很复杂,无法“就地还原”,就需要新申请内存来保存解密数据。当然,执行速度一般是”就地还原“快。我觉得,如果可以的话,最好是自己设计加密算法。使用现成的DES之类的算法,密钥是关键。如果是自己设计一个用密钥加密的算法,密钥和算法本身都是不公开的。
破解者要获取资源明文要经过如下步骤:
1.在程序中找到密钥的常量。
2.看懂反出来的汇编还原出算法,或者想办法利用加密算法的汇编代码。
其中步骤2会加大解密者解密的难度,这是自己设计加密算法比用现成的DES之类著名算法的好处。
加密解密的运用机制
我见过有一些人加密是对字段内容进行加密。比如,他用xml保存数据,他只对保存的值进行加密。
内容类似这样
这并不是一种好的运用加密的方式,因为这种方式会:
1.透露程序的配置文件结构。XML、json等。
2.透露了程序可能使用的数据结构。看以上内容可猜想Entity实体类有2个字段,Hp(血量),AttackValue(攻击力)
更彻底的加密方式是,对整个xml、json等文件进行加密。这样别人就不会知道关于你的数据的一丁点信息。这种做法不是直接用数据解析库封装的类似LoadFile的函数直接读取文件。而是,先把加密文件用文件读取方法读入内存,在内存解密后,再把解密数据传给解析库的解析函数。这种做法要求解析库有对内存进行解析的接口。比如,若用XML解析库,就会弃用LoadFile,要求有Parse方法。
有一种情况可能无法对整个数据文件进行加密。
就是使用sqlite等数据库的时候,这时候只能对字段进行加密了。有些人设计加密机制会要求配置程序本身。比如:程序需要一个配置(一个开关变量或者条件编译)来决定是否对资源进行解密。发布时,把资源都加密好,开启程序对资源的解密。开发时,资源不必加密,屏蔽程序对资源的解密。这种做法需要来回设置解密开关,比较繁琐。
有一种实现思路更有扩展性、更灵活、使用更方便。
那就是自己设计文件头。熟悉Win32编程的人可能会知道PE文件格式。Windows运行一个exe之前,会检查PE文件头,取得EXE文件的数据常量、代码区块等信息后,系统才能正确执行一个EXE。 我们可以设计一个加密文件头,加密文件头有一个字段标识该文件是否是被加密过的。解密算法可以通过判断加密头的标识符来决定是否进行解密、采用哪种解密算法等。这是一种数据驱动式的解密机制,解密信息都保存在加密数据本身中。对于没有被加密过的数据,程序判断没有文件加密头标识,就不执行解密。这样,程序可以同时读取未加密的数据和已经加密的数据,而不需要对程序进行任何修改。
注意:加密头的标识符应该足够特殊,保证和未加密的数据不会产生冲突。
若未加密的数据刚好出现了加密头的内容,那么程序就会对未加密的数据进行解密。
在Cocos2d-x 中做加密解密的研究过程
我的项目配置是用CSV文件。解析器,用的是我自己写的CSV解析器:
《CSV文件格式解析器的实现:从字符串Split到FSM》