关于PNG文件的学习

文件格式

文件头 89 50 4E 47 0D 0A 1A 0A + 数据块 + 数据块 + 数据块

数据块chunk PNG又两种数据块,关键数据块(critical chunk)与辅助数据块(ancillary chunks)。关键数据块定义4各标准数据块,每个PNG文件都不可缺少

标准数据块为:IHDR(文件头数据块)、IDAT(图象数据块)、EIND(图象结束数据)

每个数据块由4部分组成

名称 字节数 说明 length 4 指定数据长度 chunk type code 4 指定数据类型 chunk data 可变 数据 CRC 4 校验数据 IHDR 在PNG数据流中唯一,内容共13字节。

Width:              4 bytes
Height:             4 bytes
Bit depth:          1 byte
Color type:         1 byte
Compression method: 1 byte
Filter method:      1 byte
Interlace method:   1 byte
后面跟4位CRC,CRC由12-29位数据计算得出

CRC

循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。

常见题目

通过修改图片的高度隐写,可通过CRC校验,还原图片

EXP:

import os
import binascii
import struct

misc = open("img.png", "rb").read()

for i in range(1920):
    data = misc[12:16] + struct.pack('>i', i) + misc[20:29]#验证宽度
    crc32 = binascii.crc32(data) & 0xffffffff
    if crc32 == 0x37EC2D65:#此处为CRC
        print(i)

上文中,若验证图片高度,则代码为

data = misc[16:20] + struct.pack('>i', i) + misc[24:29]