组成
png是由一个png文件签名[137,80,78,71,13,10,26,10]以及多个chunk组成的,如果你要校验一个文件是不是png文件,则可以直接校验前八个字节是不是[137,80,78,71,13,10,26,10]。
png结构如下:
可以看到除了header外,还有一个chunk列表,这个chunk就是png存储数据的位置。其中chunk的开头固定是类型(chunk_type)为IHDR的chunk块,结尾固定是类型(chunk_type)为IEND的chunk。
chunk的结构如下:
实现png数据隐写关键的点在于这个chunk_type,png固定使用的chunk_type在下图:
那么我们只要不和固定的chunk_type撞上,并符合chunk_type定义的规则,即可实现数据隐写。
chunk_type定义规则
png文件通过4个字节定义chunk的类型,通过每个字节的第5个bit位(大写的英文字符是0,小写的英文字符是1,也就是通过大小写区分不同的特性),我们以tEXt为例:
通过上面的定义可以发现,我们可以定义一个第三位大写的的chunk_type来确保我们写入的文件可以被解码器安全的读取,例如ruSt
。
示例
加密
将数据加密到一个新文件中
#命令 方法 源文件 chunk_type 消息 目标文件
pngsec encode .\chunk_test.png ruSt 这是一个隐藏的消息 chunk_encode.png
解密
#命令 方法 源文件 chunk_type
pngsec decode .\chunk_encode.png ruSt
打印
#命令 方法 源文件
pngsec print .\chunk_encode.png
开头
可以看到是IHDR开头
结尾
结尾是IEDN加上我们刚刚添加的ruSt
。