失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > php+bmp+加密 郁闷啊 谁知道BMP图片加密技术吗

php+bmp+加密 郁闷啊 谁知道BMP图片加密技术吗

时间:2024-07-26 18:14:14

相关推荐

php+bmp+加密 郁闷啊 谁知道BMP图片加密技术吗

-1-14 03:32

根据人类视觉系统的特性,人眼对于细微的亮度变化的敏感度很低,特别是当图像对比度很小的时候。最低有效位算法(LSB:least significant bits)利用的就是这一人类生理特性。它利用图像的视觉冗余,将嵌入信息转换为二进制数据码流后依次写到掩体图像各RGB字节的最低有效位上面(这里最低有效位指的是图像RGB字节的最后一位)。对于掩体图像来说,仅相当于叠加了一个能量微弱的信号,在视觉上很难察觉,从而达到迷惑攻击者和保护秘密信息的目的。

实际应用上LSB算法通常与各类加密和压缩算法结合,先对待隐藏的信息进行预处理,然后再隐写入文件。

经过LSB算法处理过的图片大小与原图片完全一样,因此不能通过比较文件大小来检测其是否包含隐藏数据。

不过通常该算法实现的时候都会在位图文件头(BitMapFileHeader)的两个保留字段(WORD)里留下某些信息以方便将来提取之用,例如隐藏的信息长度以及某些自定义的信息。由于保留字段默认值为0,因此可以通过检测该两个字段是否为0来简单判断bmp文件是否包含有秘密数据。

LSB算法是一种典型的时空域算法,虽然应用简单高效,但是稳健性很差。恶意攻击者可以通过使用加噪,压缩,拉伸,剪切,旋转等简单变换来破坏隐藏信息的完整性,这时候嵌入信息就不能得到有效的恢复。

附上BMP文件格式:

BMP 图象文件通常分为四个部分:位图文件头(BitMapFileHeader)、位图信息头(BitMapInfoHeader)、调色板(Palette)和位图数据(ImageData)。位图文件头是一个长度为14字节的结构,其中包含了BMP文件的类型、文件大小和位图起始位置等信息,其定义如下:

typedef struct tagBitMapFileHeader{

WORD bfType; //文件类型

DWORD bfSize; //文件大小

WORD bfReserved1; //保留字段1

WORD bfReserved2; //保留字段2

DWORD bfOffBits; //数据偏移

} BitMapFileHeader;

其中WORD为16位无符号整数,DWORD为32位无符号整数,字段bfType的值规定文件类型只能是BM(即0x424D)。两个WORD类型的保留字段默认为0,有些信息隐藏技术就是利用此两个字段来存储图象是否已经隐藏信息及已隐藏信息的长度,字段bfOffBits则给出了BMP图象数据的存储位置。

位图信息头是一个长度为40字节的结构,描述了位图的尺寸、颜色等信息,其定义为:

typedef struct tag BitMapFileHeader {

DWORD biSize; //位图文件头的大小(包括调色板)

DWORD biWidth; //图像宽度(列数)

DWORD biHeight; //图像高度(行数)

WORD biPlanes; //目标设备的位平面数,必须置1

WORD biBitCount; //每个图象素的位数,必须为1、4、8或24

DWORD biCompression; //压缩方式

DWORD biSizeImage; //图像的字节数

DWORD biXPelsPerMeter; //目标设备水平方向每米长度上的像素数

DWORD biYPelsPerMeter; //目标设备垂直方向每米长度上的像素数

DWORD biClrUsed; //颜色表中点阵位图实际使用的颜色数

DWORD biClrImportant;//给出重要的颜色索引值,若被置为0则所有的颜色都是重要的

} BitMapFileHeader;

其中biCompression的值为0表示位图数据不压缩,值为1表示BI_RLE8压缩类型(即每像素为8位的点阵位图采用行程编码格式);值为2表示BI_RLE4压缩类型(即每像素为4位的点阵位图采用行程编码格式),这里为了能隐藏更多的信息将其设为0。

调色板用于说明位图中像素的颜色,它有若干项,每一项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:

typedef struct tagRGBQUAD {

BYTE rgbBlue;

BYTE rgbGreen;

BYTE rgbRed;

BYTE rgbReserved;

} RGBQUAD;

调色板数据中RGBQUAD结构数据的个数由位图信息头里的biBitCount来确定。当biBitCount=1,4,8 时,分别有2,16,256项;当biBitCount=24时(即24位真彩色BMP图像),没有调色板数据。

位图信息头和调色板组成位图信息。位图数据记录了位图的每一个象素值。每个象素值所占的位数即为biBitCount的值:当biBitCount=24时,1个象素占24位空间。记录顺序从位图的左下角开始,即在扫描行内是从左到右,扫描行之间则是从下到上:也就是说图象数据是以相反的顺序存储的,即从文件中读出的第一行实际上是图象的最后一行。因此BMP位图数据的大小(在不压缩情况下)为DataSize= biHeight*biWidth* biBitCount/8。然而,实际上Windows规定一个扫描行所占的字节数必须是4的倍数(即以DWORD为单位),不足的用0填充。例如,对于24位BMP图像,设width=101,则width*24/8=303,但是实际上每行图像所含字节数为304,即在303的基础上加上1使得其成为4的倍数。这样,每行图象数据的最后可能有0 至3 个字节是多余的,且均为0。显然这些多余的字节是不能隐藏信息的。

24位真彩色位图有其自身的特点,由于它没有调色板数据,因此从第55 个字节开始,是该文件的图象数据部分,数据的排列顺序以图象的左下角为起点,每连续3 个字节便描述图象一个象素点,这三个字节分别代表B、G、R(即蓝、绿、红)三基色在此像素中的亮度,若某连续三个字节为:FFH ,00H ,00H ,则表示该像素的颜色为纯蓝色。

如果觉得《php+bmp+加密 郁闷啊 谁知道BMP图片加密技术吗》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。