基于最低有效位 把信息隐藏到图片中

来源:互联网 发布:无人驾驶近年数据 编辑:程序博客网 时间:2024/05/15 04:20
呵呵,当然算法不是我的,是在一次无意间看关于信息安全方面的书籍时,看到“最低有效位隐藏信息”这个名词。

于是在网上查,论文比较多,但都要收费,偶尔有几篇在前面的有一点信息。

于是就了下文:

其实讲了之后就非常简单,大家知道,图像是由一个一个像素组成的,每个像素又是由R(红)G(绿)B(蓝)三个亮度分量组成,每个分量又是一个8位二进数。

这个算法其实就是把信息按位替换这三个分量的最低几位,而对图像的视觉效果没什么特别的改变。

网上论文很多,论的大部份是隐藏效率问题。

其中效率比较高,而视觉隐响最小的替换是:R替换1位,B替换2位,G替换1位

下面的代码的作用是:把一段信息隐藏在.bmp格式中(当然还可隐藏到其它多媒体文件中),因为它比较好操作,没有进行压缩。

如果你是第一次接触,请到网上先了解bmp文件的结构,还要熟悉下面的知识

1.       位操作

2.       熟悉多媒体文件的结构

3.       熟练文件操作

贴代码了:(只是几个主要的涵数,比较乱,这个实现比较简单,就是修改了每个分量的最低位,听说这个算法还可以用来给图片加版权信息)

void mainok(FILE *fp_t)//修改最低1位
{
FILE *fp;
bits bits_;
bits bit_t;
BITMAPFILEHEADER header;

fp=fopen("QQ.bmp", "r+b");//要编辑的BMP文件
fread(&header, sizeof(header), 1, fp);
if(fp==NULL||fp_t==NULL)
{
   printf("文件打开失败。\n");
   return;
}
fseek(fp, 54, SEEK_SET);
int j=1;
while(1)
{
   fread(&bits_, 1, 1, fp);
   fread(&bit_t, 1, 1, fp_t);
   //printf("a:%d ", ftell(fp));
   //Sleep(100);
   switch(j%8)
   {
   case 1:bits_.a1=bit_t.a1;break;
   case 2:bits_.a1=bit_t.a2;break;
   case 3:bits_.a1=bit_t.a3;break;
   case 4:bits_.a1=bit_t.a4;break;
   case 5:bits_.a1=bit_t.a5;break;
   case 6:bits_.a1=bit_t.a6;break;
   case 7:bits_.a1=bit_t.a7;break;
   case 0:bits_.a1=bit_t.a8;break;
   }
   if(j%8!=0)
   {
    fseek(fp_t, -1, SEEK_CUR);
   }
   j++;
   fseek(fp, -1, SEEK_CUR);
   fwrite(&bits_, 1, 1, fp);
   if(ftell(fp)==header.bfSize||feof(fp_t))
   {
    break;
   }
   fseek(fp, -1, SEEK_CUR);
   fseek(fp, 1, SEEK_CUR);
}
fclose(fp);
}

void GetInformation()    //信息提取函数
{
bits bit_i, bit_o;
FILE *fp, *fp_i, *fp_s;
fp=fopen("QQ.bmp", "rb");
fp_i=fopen("out.txt", "wb");
if(fp==NULL)
{
   printf("信息文件打开失败\n");
   return;
}
fseek(fp, 54, SEEK_SET);
long size=0;
GetFileSize("txt.txt", &size);
printf("%d", size);
int j=1;//信息计数器

      while(j!=(size*8+1))
{
   fread(&bit_i, 1, 1, fp);
   switch(j%8)
   {
   case 1:bit_o.a1=bit_i.a1;break;
   case 2:bit_o.a2=bit_i.a1;break;
   case 3:bit_o.a3=bit_i.a1;break;
   case 4:bit_o.a4=bit_i.a1;break;
   case 5:bit_o.a5=bit_i.a1;break;
   case 6:bit_o.a6=bit_i.a1;break;
   case 7:bit_o.a7=bit_i.a1;break;
   case 0:bit_o.a8=bit_i.a1;break;
   }
   if(j%8==0)
   {
    fwrite(&bit_o, 1, 1, fp_i);
   }
   j++;
}
fclose(fp);
printf("信息提取成功\n");
}

想要完整代码的:可给我留信息

原创粉丝点击