`
modabobo
  • 浏览: 509528 次
文章分类
社区版块
存档分类
最新评论

PNG Encrpyt加密和解密开发

 
阅读更多

现在的手机游戏一般都是基于两个操作系统,Android和IOS,而这两个系统的应用程序的格式虽然不同,但从结构上基本上都是由可执行程序和各种资源组成。现在的手游市场非常大,国内的情况是通常一款游戏火起来后,很多游戏开发商立刻跟风从而在最短的时间内山寨一个出来。山寨的方法有很多种,文明一点的是只是抄袭创意,粗鲁一点的将游戏应用程序的各种资源逆向出来,虽然这些资源不会直接拿来在自己的游戏里使用,但却可以成为在山寨开发阶段的临时文件。所以,怎样保护自己游戏里的资源,就成为了一个不得不研究的课题。

这里只讨论图片资源,音乐资源或者其它资源先不讨论。一个手机游戏的图片资源通常都是分为三种,其一是UI图片,其二是人物/场景资源,其三是特效图片。一般来说,UI和特效图片(序列帧式)一般都是使用图片集工具打包,常用的就有TexturePacker,TexturePacker的功能很强大,不仅支持多种图片格式,而且还自带Content Protection,也就是加密功能。但场景和人物图片很多都是不打包,而是直接单个存储的,这类型的图片资源有个特点就是要么图片规格非常大,例如RPG游戏里的场景,要么就是数量非常多,而且出现的频率不一样导致不能同时打包在一起,例如卡牌游戏里的卡牌图片。而且这些图片资源对于整个游戏来说是最重要的,因此使用自己的加密方式就非常重要了。

手机游戏常用的图片格式有几种,有pvr、png、jpg和jxr。jpg不支持透明通道,jxr是微软的一种格式,在有损压缩的情况下压缩率非常高,pvr虽然在使用PowerVR的GPU的手机上加载得非常快,但相对比较大。所以我一般对有透明要求的人物和场景的图片都是使用PNG。

说了这么多,这里的主题其实就是研究自己对PNG图片的加密方式,PNG的文件结构其实是很容易理解的,大体上可以分为三部份:文件头,各种数据块和文件尾。


文件头就是从文件开始固定的8个字节:0x89504e47 0x0d0a1a0a,文件尾就是在文件结束的时候固定的12个字节:0x00000000 0x49454e44 0xae426082。各种数据块内容繁多,这里不一一描述,但有一个好消息就是,所有数据块的格式都是一致的,具体结构如下:

1、Chunk Lenth:4字节,就是通常说块长度。

2、Chunk Type:4字节,描述了块的类型,每个字节是一个字符。

3、Chunk Data:数据块的内容,容纳ChunkLenth数量的字节。

4、Chunk CRC:4字节,校验码,使用crc算法。

PNG的数据块有很多种,甚至是可以自定义的,只要符合数据块的格式即可。而必须存在的数据块有以下几种:

1、IHDR,文件信息头,用来描述图像的基本信息,其格式为

图像宽: 4byte

图像高: 4byte

图像色深: 4byte

颜色类型: 1byte

压缩方法: 1byte

滤波方法: 1byte

扫描方法: 1byte

2、PLTE块,就是调色板,只适用于PNG8,就是常说的8位PNG,在24位PNG中是不需要调色板的,其格式为

循环

RED: 1byte

GREEN: 1byte

BLUE: 1byte

END

循环次数就是Chunk Length / 3的长度嘛,而且Chunk Length一定为3的倍数。

3、tRNS块,这个块时有时无,主要是看你是否使用了透明色。该区块的格式为:

循环

if(对应调色盘颜色非透明)

0xFF: 1byte

else

0x00: 1byte

END

循环长度为调色盘的颜色数,相当于调色盘颜色表的一个对应表,标识该颜色是否透明,0xFF不透明,0x00透明。故如果用UltraEdit查看PNG文件的二进制编码,如果看到一大片FF,一般就是tRNS区块啦,因为一个PNG文件一般只有一个透明色。在24位PNG中这个也是不需要存在的。

4、IDAT块,就是存储图片实际内容的地方。

除了上述的数据块,还有很多常用的数据块,例如如果是使用PhotoShop编辑的图片,会带有iCCP数据块,描述是这是由Photoshop生成的图片。因为我们现在并不是要拆解整个PNG的文件结构,所以无论PNG图片里有多少冗余的数据块,我们都可以置之不理,对于24位PNG,只需要将IHDR数据块的内容读取出来,对于8位的PNG,还需要将调色板数据块也读取出来,然后按照自己的格式保存IHDR和PLTE,当然可以自己加上一些干扰的数据,最后当然要加上IDAT数据块的内容。将这些数据写入到文件里,命名为自己的格式,加密工作就完成了。在使用的时候当然需要解密,但只要能加密,解密也很容易。只需要写上述必需的文件头,IHDR,PLTE、IDAT和文件尾按PNG的Chunk格式写入即可。

最后,不上代码是不行的,用过cocos2d-x移植到Android平台的人估计都对libpng这个库有点印象,这个开源库对png的处理已经到了炉火纯青的境界,最新的版本的代码过于复杂,相对旧一点的版本的代码则清淅很多,刚开始的时候我也是以这个作为研究的对象的,但后来我又发现了一个外国人写的库,只有几个文件,代码也简单。有需要的可以到这里下载:

http://download.csdn.net/detail/visualcatsharp/6777537

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics