图像隐写算法LSB—Least Significant Bits,又称最不显著位。LSB算法就是将秘密信息嵌入到载体图像像素值得最低有效位,改变这一位置对载体图像的品质影响最小。

原理

以实验用的24位真彩图为例,每个像素用3Byte表示,每Byte分别表示R、G、B三色的亮度,亮度取值范围位0~0xFF。采用LSB算法就是将图像信息的每一Byte的最后一位二进制替换为待嵌入的秘密信息的一位,按顺序进行。因为对最后一位的替换操作其实就是对亮度信息的加一或减一,对颜色影响甚微,所以肉眼难以察觉,这就达到了隐藏信息的目的。对于24位真彩图,所能嵌入的最大秘密信息的大小为像素数量的3/8字节

/***
change.c
***/
#include<stdio.h>
#include<stdlib.h>
#include"define.h"
​
int main()
{  
    //创建头文件,信息头结构变量
    BMP_FILE_HEADER fileHeader;
    BMP_INFO_HEADER infoHeader;
    
    //打开载体图像文件,新建修改后的图像文件
    FILE *file = fopen("football.bmp","rb");
    FILE *newFile = fopen("change.bmp","wbx");
    
    //读取文件头,信息头
    fread(&fileHeader,14,1,file);
    fread(&infoHeader,40,1,file);
    
    //读取24位真彩图像的像素信息
    RGB *img = (RGB *)malloc(infoHeader.sizeImage);
    fread(img,infoHeader.sizeImage,1,file);
​
    printf("Picture Size(width x height):%d x %d ", infoHeader.width, infoHeader.height);
​
    //对图片内容进行修改,每隔五个像素染黑一个像素
    int i = 0;
    for (i = 0; i < infoHeader.sizeImage / 3; i += 5)
    {
        img[i].red = 0;
        img[i].green = 0;
        img[i].blue = 0;
    }
    printf("fwirte");
​
    //将新的二进制文件写入到新文件中
    fwrite(&fileHeader,14,1,newFile);
    fwrite(&infoHeader,40,1,newFile);
    fwrite(img,infoHeader.sizeImage,1,newFile);
    fclose(file);
    fclose(newFile);
    return 0;
}

infoHeader.sizeImage表示图像数据的字节数,在24位真彩位图中,表示每个像素需要三个字节,infoHeader.sizeImage/3表示位图总像素数

循环体中将每个颜色分量的亮度赋值为0,让像素变黑,最终得到修改后的图像。

以上是处理BMP图像信息的原理。

下面通过LSB算法隐藏秘密信息,这里把define.h文件作为秘密信息隐藏,也可以选择任何大小合适的文件作为秘密信息。

LSB全称为 least significant bit,是最低有效位的意思。Lsb图片隐写是基于Lsb算法的一种图片隐写术,一般能使用LSB进行隐写的图片需要是无损压缩(png图片)或者无压缩的图片(BMP图片),因为这能保证我们修改的信息不至于丢失,也就能得到正确的表达。

以png图片为例子,png图片中的图像像数一般是由RGB三原色(红绿蓝)组成,每一种颜色占用8位,取值范围为0x00~0xFF,即有256种颜色,一共包含了256的3次方的颜色,即16777216种颜色。而人类的眼睛可以区分约1000万种不同的颜色,这就意味着人类的眼睛无法区分余下的颜色大约有6777216种。

 

而LSB隐写算法就是去修改RGB颜色分量的最低二进制位也就是最低有效位(LSB),人类的眼睛不会注意到这前后的变化,每个像素可以携带3比特的信息。

例如下面这张经典的图:绿色,十进制的235,二进制的11101011,通过二进制运算加、减3修改最低有效位,发现肉眼根本区分不出来差别: