您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > 图像文件中嵌入隐藏的文字信息
工程实训任务书图像文件中的信息隐藏[任务目标]用C语言设计一个程序,实现在一个图像文件(.BMP)中嵌入隐藏的文字信息。通过另一个软件,可以将图像中隐藏的信息提取出来。要求嵌入信息后不影响图片的视觉效果。[性能指标]1、图片是标准的24位色BMP文件2、通过键盘输入要嵌入到文字信息,并嵌入到图像文件中3、编写一个提取程序,提取出隐藏的文字。软件代码:#includestdio.h#includeiostream.h#includestdlib.h#includeprocess.hvoidwritef(unsignedchara[],unsignedchartu[],inttu_l);voidreadf(intn,unsignedchartu[],inttu_l);//向图片写入文字信息的函数入口voidwritein(){FILE*fp;charname[22];longL;unsignedchar*f;unsignedcharfile[202];printf(请输入文件的路径:\n);cin.getline(name,20);if(!(fp=fopen(name,rb))){printf(filecannotbefound.);exit(0);}else{fseek(fp,0,2);L=ftell(fp);//查询图片长度f=(unsignedchar*)malloc(L);rewind(fp);fread(f,L,1,fp);//读取出未添加文字的图片fclose(fp);}printf(请输入隐藏的信息:);cin.getline(file,200);writef(file,f,L);//开始隐藏文字printf(文件保存完毕!\n路径为e:\\abc.bmp\n);}voidwritef(unsignedchara[],unsignedchartu[],inttu_l){FILE*fp;unsignedchart;inti,j,k;i=0;while(a[i]!='\0')i++;//获取输入的文字长度printf(信息的长度为:%d\n,i);for(j=64;j(64+i*8);j++)tu[j]=tu[j]&0xFE;//对图片存入文字的区域初始化,将每位颜色的二进制代码最后一位变为零for(j=0;ji;j++){for(k=0;k8;k++){t=a[j]&0x01;//将文字转化成二进制信息,并开始隐藏如图片tu[64+j*8+k]|=t;a[j]=a[j]1;//逐位获取文字的二进制代码}}if(!(fp=fopen(e:\\abc.bmp,wb))){printf(filecan'tbebuilt.\n);exit(0);}else{fwrite(tu,tu_l,1,fp);//将处理后的文件保存fclose(fp);}}//从图片提取隐藏的文字信息的函数入口voidreadout(){FILE*fp;charname[22];longL;unsignedchar*f;intn;printf(请输入隐藏着文字信息的图片的路径:\n);cin.getline(name,20);if(!(fp=fopen(name,rb))){printf(filecannotbefound.\n);exit(0);}else{fseek(fp,0,2);L=ftell(fp);//获取文件长度f=(unsignedchar*)malloc(L);rewind(fp);fread(f,L,1,fp);//读取文件fclose(fp);}printf(请输入隐藏的文字长度:\n);scanf(%d,&n);//该程序无法自动获取图片中隐藏的文字的长度,因此需要用户自己输入readf(n,f,L);}voidreadf(intn,unsignedchartu[],inttu_l){FILE*fp;unsignedchart,c;unsignedchara[100];//由于不知道图片中的文字长度,用于存储文字的数组需要大一点的空间intj,k;for(j=0;jn;j++){a[j]&=0x00;//数组初始化for(k=0;k8;k++){t=tu[64+j*8+k];t=t&0x01;//提取文字信息a[j]|=t;c=a[j];a[j]=(c1)|(c7);//循环右移,逐个插入文字的二进制信息}}a[n]='\0';//文字提取完毕,在结尾添加结束符if(!(fp=fopen(e:\\words.dat,wb))){printf(filecan'tbebuilt.\n);exit(0);}else{fwrite(a,n,1,fp);//保存文字的二进制信息fclose(fp);}printf(隐藏的文字为:\n);for(j=0;jn;j++)coutchar(a[j]);coutendl;printf(文字的二进制信息以保存,路径为:e:\\words.dat\n);}voidgetout(unsignedchar*p){}//菜单操作函数intmenu_select(){chars;intcn;//显示提示菜单printf(|---------------------------------------|\n);printf(|操作菜单:|\n);printf(||\n);printf(|1.向图片写入文字信息|\n);printf(|2.从bmp图片读出隐藏的文字信息|\n);printf(|3.退出程序。|\n);printf(||\n);printf(|---------------------------------------|\n);printf(您希望进行什么操作?请输入序号:\n);do{s=getchar();cn=(int)s-48;}while(cn0||cn3);//忽略选项以外的字符输入returncn;}voidmain(){while(1){//让程序一直运行,直到用户选择退出switch(menu_select()){case1:writein();//文字隐藏break;case2:readout();//文字提取break;case3:cout程序已退出。endl;exit(0);}}}运行结果:1、为什么做?因为随着信息技术,网络技术,电子商务的发展,网络安全将全方位的威胁社会的经济文化,政治等方面,随着计算机硬件的发展,具有并行计算能力的破解技术日益发展成熟,仅通过增加加密算法的密钥长度来达到增强安全性已不再是唯一的可行办法,但对信息隐藏而言,可能的检测者和非法拦截者则难以从公开信息中判断机密信心是否存在,难以截获机密信息。同时锻炼我们的实训能力,以及对c语言的掌握。2,、做什么?答将密码编码学和信息隐藏技术结合,通过人的视觉冗余来实现对24位位图图片文件的信息隐藏和还原。3,、准备怎么做?我们先准备好一幅24位的BMP格式图片,这一点要注意,不要误用了其他格式的图片。然后点击界面工具栏上那个“打开”按钮找到那幅准备好的BMP图片,该BMP图片会被加载到带有菜单和工具栏的程序主界面中,其功能一目了然。因为工具栏集成了该软件的主要功能,所以我们在加、解密文件时,只要使用工具栏就可以了。如果你想隐藏文件,只需点击工具栏上的“隐藏”按钮。文件加密完成后,就会出现一个“另存为”窗口,让你选择文件保存路径。别忘记将加密后的图片保存在自己指定的文件夹里。4、具体步骤:先在代码中写上自己的头文件,自己将会用到哪些关于头文件的函数等,filefp必须写在其文件中,其次向图片写入文字信息的函数入口,此时要用到voidwritten,另外还有unsigned的固定用法和char这个数组函数,然后输出换行,如果使用文件方式打开文件名,则显示filecannotbefound,相反则使用fseek查询图片bmp的长度。使用malloc动态分布函数读取出未添加文字的图片,并输入嵌入的文字,保存文件的路径,同样在使用未定义的字符voidwritef,对图片存入文字的区域初始化,将每位颜色的二进制代码最后一位变为零,在进行一个for循环,对图片存入文字的区域初始化,将每位颜色的二进制代码最后一位变为零,将文字转化成二进制信息,并开始隐藏如图片,并逐位获取文字的二进制代码,查询图片长度,并且由于不知道图片中的文字长度,用于存储文字的数组需要大一点的空间,将/数组初始化。循环右移,逐个插入文字的二进制信息。总的来说,就是找到解决任务的方法,编写出代码,找出问题,修改问题。5、发现问题?程序在V6C++中运行时出现大量的错误,由报错一点一点去找错,并且加以修改。6、改进的地方?需要了解更多C语言的运用知识,不能弄混每个语句的作用。7、有何感想?在制作中能发现很多自己编程上的不足,能学到很多不一样的东西,一些在书本上没有学过,需要私下自己去探索总结的一些知识,比如信息隐藏技术需要涉及到哪方面的专业知识,需要运用哪些方面的函数,哪些方面的头文件,甚至在很多报错方面有时候也会花很大的功夫,真的知道编程时一项辛苦复杂但是成功后又充满很多快乐的一项任务,实训却在不知不觉中锻炼了我们各个方面的能力。
本文标题:图像文件中嵌入隐藏的文字信息
链接地址:https://www.777doc.com/doc-7053517 .html