⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 利用LSB(最低位)信息隐藏算法实现信息的隐藏和提取
💻 CPP
字号:
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>


/*
//位图文件头
typedef struct tagBITMAPFILEHEADER {
  WORD bfType; 
  DWORD bfSize; 
  WORD bfReserved1; 
  WORD bfReserved2; 
  DWORD bfOffBits; 
} BITMAPFILEHEADER; 


typedef struct tagBITMAPINFOHEADER { 
  DWORD biSize; 
  LONG biWidth; 
  LONG biHeight; 
  WORD biPlanes; 
  WORD biBitCount 
  DWORD biCompression; 
  DWORD biSizeImage; 
  LONG biXPelsPerMeter; 
  LONG biYPelsPerMeter; 
  DWORD biClrUsed; 
  DWORD biClrImportant; 
} BITMAPINFOHEADER; 

//彩色表
typedef struct tagRGBQUAD { 
	BYTE rgbBlue;
	BYTE rgbGreen;
	BYTE rgbRed;
	BYTE rgbReserved;
} RGBQUAD;

//位图信息头
typedef struct tagBITMAPINFO { 
	BITMAPINFOHEADER bmiHeader;
	RGBQUAD bmiColors[1];
} BITMAPINFO;

*/
void main()
{

	BITMAPFILEHEADER bmfh;
	BITMAPINFO bmi;
	
    
	FILE *fi;
    if((fi = fopen("bupt.bmp","rb+"))==0)
	{printf("cannot open the first file\n");
     exit(0);}//打开图片文件
	
	FILE *fo;
	if((fo = fopen("个人信息.txt","rb+"))==0)
	{printf("cannot open the second file\n");
	exit(0);}//打开信息文本
	

	
	//读取文件头
	fread(&bmfh,sizeof( bmfh ),1,fi);
    printf("文件头信息:\n");
	printf("文件类型:%c%c\n",bmfh.bfType%256 ,bmfh.bfType/256);
	printf("文件大小:%d\n",bmfh.bfSize);
	printf("图像数据偏移量:%d\n",bmfh.bfOffBits);
	

	//读BMP信息头--------读彩色表
    fread(&bmi,sizeof(BITMAPINFO),1,fi);
	printf("\n图像信息:\n");
	printf("位图宽度:%d\n",bmi.bmiHeader.biWidth);
	printf("位图高度:%d\n",bmi.bmiHeader.biHeight);
	printf("每个像素的位数:%d\n",bmi.bmiHeader.biBitCount);
	printf("位图数据的大小:%d\n",bmi.bmiHeader.biSizeImage);
	printf("用像素/米表示的水平分辨率:%d\n",bmi.bmiHeader.biXPelsPerMeter);
	printf("用像素/米表示的垂直分辨率:%d\n",bmi.bmiHeader.biYPelsPerMeter);
	printf("每个像素的位数:%d\n",bmi.bmiHeader.biBitCount);
	printf("位图使用的颜色数:%d\n",bmi.bmiHeader.biClrUsed);
	
    
	//隐藏信息
	long i=0,j,m;
	byte q,c,p,s,t;
	
	//判断载体是否足够
	
	while(!feof(fo))
	{
	    i++;	
		fread(&c,1,1,fo);
	}
	i=i-1;
	printf("\nThe size of 个人信息.txt is %u bytes.\n",i);
    q=0x40;
	q=(q>>6);
	c=0;
    fseek(fi,bmfh.bfOffBits,0);
	fseek(fo,-i,1);//将两文件指针指在初始位置
	printf("\nOriginal txt information is:\n");
	for(m=0;m<i;m++)//按隐藏信息的大小做循环
	{
		fread(&c,1,1,fo);
        printf("%c",c);
		for(j=0;j<8;j++)//将c指向的1byte分别写到p指向的8byte的最后一位
		{  
			fread(&p,1,1,fi);
	        p=(p>>1);
			p=(p<<1);//最低位清零
			s=q;
			s=(s<<j);
			t=(c&s);
			t=(t>>j);
			p=(p+t);
		    fseek(fi,-1,1);
		    fwrite(&p,1,1,fi);
		}
	}
    printf("\n");
    printf("\n");

    //提取隐藏信息
    FILE *f;
    if((f = fopen("file.txt","wb"))==0)
	{printf("cannot open the third file\n");
     exit(0);}//打开新文件
	
    q=0x40;
	q=q>>6;
	fseek(fi,bmfh.bfOffBits,0);	
	printf("The information picks up from the graph is:\n");
	for(m=0;m<i;m++)//提取所隐藏的信息
	{
		c=NULL;
		for(j=0;j<8;j++)
		{
			fread(&p,1,1,fi);
		    p=(p&q);
			p=(p<<j);
			c=(c+p);
		}
		fwrite(&c,1,1,f);//将信息写入新文件
		printf("%c",c);//并打印在屏幕上
	}
    printf("\n");
	fclose(f);
    fclose(fo);
	fclose(fi);//关闭文件
}
              

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -