图像文件中嵌入隐藏的文字信息
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
总的来说,就是找到解决任务的方法,编写出代码,找出问题,修改问题。
5百度文库发现问题?
程序在V6C++中运行时出现大量的错误,由报错一点一点去找错,并且加以修改。
6、改进的地方?
需要了解更多C语言的运用知识,不能弄混每个语句的作用。
7、有何感想?
在制作中能发现很多自己编程上的不足,能学到很多不一样的东西,一些在书本上没有学过,需要私下自己去探索总结的一些知识,比如信息隐藏技术需要涉及到哪方面的专业知识,需要运用哪些方面的函数,哪些方面的头文件,甚至在很多报错方面有时候也会花很大的功夫,真的知道编程时一项辛苦复杂但是成功后又充满很多快乐的一项任务,实训却在不知不觉中锻炼了我们各个方面的能力。
}
void getout(unsigned char* p){}
//菜单操作函数
int menu_select(){
char s;
int cn;
//显示提示菜单
printf(" |---------------------------------------|\n");
printf(" |操作菜单:|\n");
printf("file can not be found.\n");
exit(0);
}else{
fseek(fp,0,2);L=ftell(fp); //获取文件长度
f=(unsigned char*)malloc(L);
rewind(fp);
fread(f,L,1,fp); //读取文件
fclose(fp);
void readf(int n,unsigned char tu[],int tu_l);
//向图片写入文字信息的函数入口
void writein(){
FILE* fp;
char name[22];
long L;
unsigned char* f;
unsigned char file[202];
printf("请输入文件的路径:\n");
unsigned char a[100]; //由于不知道图片中的文字长度,用于存储文字的数组需要大一点的空间
int j,k;
for(j=0;j<n;j++){
a[j]&=0x00; //数组初始化
for(k=0;k<8;k++){
t=tu[64+j*8+k];
t=t&0x01; //提取文字信息
a[j]|=t;
工程实训任务书
图像文件中的信息隐藏
[任务目标]
用C语言设计一个程序,实现在一个图像文件(.BMP)中嵌入隐藏的文字信息。通过另一个软件,可以将图像中隐藏的信息提取出来。要求嵌入信息后不影响图片的视觉效果。
[性能指标]
1、图片是标准的24位色BMP文件
2、通过键盘输入要嵌入到文字信息,并嵌入到图像文件中
4、具体步骤:
先在代码中写上自己的头文件,自己将会用到哪些关于头文件的函数等,file fp必须写在其文件中,其次向图片写入文字信息的函数入口,此时要用到void written,另外还有unsigned的固定用法和char这个数组函数,然后输出换行,如果使用文件方式打开文件名,则显示file can not be found,相反则使用fseek查询图片bmp的长度。
2,、做什么?
答将密码编码学和信息隐藏技术结合,通过人的视觉冗余来实现对24位位图图片文件的信息隐藏和还原。
3,、准备怎么做?
我们先准备好一幅24位的BMP格式图片,这一点要注意,不要误用了其他格式的图片。然后点击界面工具栏上那个“打开”按钮找到那幅准备好的BMP图片,该BMP图片会被加载到带有菜单和工具栏的程序主界面中,其功能一目了然。因为工具栏集成了该软件的主要功能,所以我们在加、解密文件时,只要使用工具栏就可以了。 如果你想隐藏文件,只需点击工具栏上的“隐藏”按钮。文件加密完成后,就会出现一个“另存为”窗口,让你选择文件保存路径。别忘记将加密后的图片保存在自己指定的文件夹里。
3、编写一个提取程序,提取出隐藏的文字。
软件代码:
#include<stdio.h>
#include<iostream.h>
#include<stdlib.h>
#include<process.h>
void writef(unsigned char a[],unsigned char tu[],int tu_l);
a[j]=a[j]>>1; //逐位获取文字的二进制代码
}
}
if(!(fp=fopen("e:\\abc.bmp","wb"))){
printf("file can't be built.\n");
exit(0);
}else{
fwrite(tu,tu_l,1,fp); //将处理后的文件保存
fclose(fp);
for(j=64;j<(64+i*8);j++) tu[j]=tu[j]&0xFE; //对图片存入文字的区域初始化,将每位颜色的二进制代码最后一位变为零
for(j=0;j<i;j++){
for(k=0;k<8;k++){
t=a[j]&0x01; //将文字转化成二进制信息,并开始隐藏如图片
tu[64+j*8+k] |=t;
printf("您希望进行什么操作?请输入序号:\n");
do{
s=getchar();
cn=(int)s-48;
}while(cn<0||cn>3); //忽略选项以外的字符输入
return cn;
}
void main(){
while(1){ //让程序一直运行,直到用户选择退出
switch(menu_select()){
使用malloc动态分布函数读取出未添加文字的图片,并输入嵌入的文字,保存文件的路径,同样在使用未定义的字符void writef,对图片存入文字的区域初始化,将每位颜色的二进制代码最后一位变为零,在进行一个for循环,对图片存入文字的区域初始化,将每位颜色的二进制代码最后一位变为零,将文字转化成二进制信息,并开始隐藏如图片,并逐位获取文字的二进制代码,查询图片长度,并且由于不知道图片中的文字长度,用于存储文字的数组需要大一点的空间,将/数组初始化。循环右移,逐个插入文字的二进制信息。
}
printf("请输入隐藏的文字长度:\n");
scanf("%d",&n); //该程序无法自动获取图片中隐藏的文字的长度,因此需要用户自己输入
readf(n,f,L);
}
void readf(int n,unsigned char tu[],int tu_l){
FILE* fp;
unsigned char t,c;
}
}
//从图片提取隐藏的文字信息的函数入口
void readout(){
FILE* fp;
char name[22];
long L;
unsigned char* f;
int n;
printf("请输入隐藏着文字信息的图片的路径:\n");
cin.getline(name,20);
if(!(fp=fopen(name,"rb"))){
c=a[j];
a[j]=(c>>1)|(c<<7); //循环右移,逐个插入文字的二进制信息
}
}
a[n]='\0'; //文字提取完毕,在结尾添加结束符
if(!(fp=fopen("e:\\words.dat","wb"))){
printf("file can't be built.\n");
exit(0);
printf(" | |\n");
printf(" | 1.向图片写入文字信息|\n");
printf(" | 2.从bmp图片读出隐藏的文字信息|\n");
printf(" | 3.退出程序。|\n");
printf(" | |\n");
printf(" |---------------------------------------|\n");
rewind(fp);
fread(f,L,1,fp); //读取出未添加文字的图片
fclose(fp);
}
printf("请输入隐藏的信息:");
cin.getline(file,200);
writef(file,f,L); //开始隐藏文字
printf("文件保存完毕!\n路径为e:\\abc.bmp\n");
case 1:
writein(); //文字隐藏
break;
case 2:
readout(); //文字提取
break;
case 3:
cout<<"程序已退出。"<<endl;
exit(0);
}
}
}
运行结果:
1、为什么做?
因为随着信息技术,网络技术,电子商务的发展,网络安全将全方位的威胁社会的经济文化,政治等方面,随着计算机硬件的发展,具有并行计算能力的破解技术日益发展成熟,仅通过增加加密算法的密钥长度来达到增强安全性已不再是唯一的可行办法,但对信息隐藏而言,可能的检测者和非法拦截者则难以从公开信息中判断机密信心是否存在,难以截获机密信息。同时锻炼我们的实训能力,以及对c语言的掌握。
}
void writef(unsigned char a[],unsigned char tu[],int tu_l){
FILE* fp;
unsigned char t;
int i,j,k;
i=0;
while(a[i]!='\0') i++; //获取输入的文字长度
printf("信息的长度为:%d\n",i);
cin.getline(name,20);
if(!(fp=fopen(name,"rb"))){
printf("file can not be found.");
exit(0);
}
else
{
fseek(fp,0,2);L=ftell(fp); //查询图片长度
f=(unsigned char*)malloc(L);
}
else
{
fwrite(a,n,1,fp); //保存文字的二进制信息
fclose(fp);
}
printf("隐藏的文字为:\n");
for(j=0;j<n;j++)cout<<char(a[j]);
cout<<endl;
printf("文字的二进制信息以保存,路径为:e:\\words.dat\n");
5百度文库发现问题?
程序在V6C++中运行时出现大量的错误,由报错一点一点去找错,并且加以修改。
6、改进的地方?
需要了解更多C语言的运用知识,不能弄混每个语句的作用。
7、有何感想?
在制作中能发现很多自己编程上的不足,能学到很多不一样的东西,一些在书本上没有学过,需要私下自己去探索总结的一些知识,比如信息隐藏技术需要涉及到哪方面的专业知识,需要运用哪些方面的函数,哪些方面的头文件,甚至在很多报错方面有时候也会花很大的功夫,真的知道编程时一项辛苦复杂但是成功后又充满很多快乐的一项任务,实训却在不知不觉中锻炼了我们各个方面的能力。
}
void getout(unsigned char* p){}
//菜单操作函数
int menu_select(){
char s;
int cn;
//显示提示菜单
printf(" |---------------------------------------|\n");
printf(" |操作菜单:|\n");
printf("file can not be found.\n");
exit(0);
}else{
fseek(fp,0,2);L=ftell(fp); //获取文件长度
f=(unsigned char*)malloc(L);
rewind(fp);
fread(f,L,1,fp); //读取文件
fclose(fp);
void readf(int n,unsigned char tu[],int tu_l);
//向图片写入文字信息的函数入口
void writein(){
FILE* fp;
char name[22];
long L;
unsigned char* f;
unsigned char file[202];
printf("请输入文件的路径:\n");
unsigned char a[100]; //由于不知道图片中的文字长度,用于存储文字的数组需要大一点的空间
int j,k;
for(j=0;j<n;j++){
a[j]&=0x00; //数组初始化
for(k=0;k<8;k++){
t=tu[64+j*8+k];
t=t&0x01; //提取文字信息
a[j]|=t;
工程实训任务书
图像文件中的信息隐藏
[任务目标]
用C语言设计一个程序,实现在一个图像文件(.BMP)中嵌入隐藏的文字信息。通过另一个软件,可以将图像中隐藏的信息提取出来。要求嵌入信息后不影响图片的视觉效果。
[性能指标]
1、图片是标准的24位色BMP文件
2、通过键盘输入要嵌入到文字信息,并嵌入到图像文件中
4、具体步骤:
先在代码中写上自己的头文件,自己将会用到哪些关于头文件的函数等,file fp必须写在其文件中,其次向图片写入文字信息的函数入口,此时要用到void written,另外还有unsigned的固定用法和char这个数组函数,然后输出换行,如果使用文件方式打开文件名,则显示file can not be found,相反则使用fseek查询图片bmp的长度。
2,、做什么?
答将密码编码学和信息隐藏技术结合,通过人的视觉冗余来实现对24位位图图片文件的信息隐藏和还原。
3,、准备怎么做?
我们先准备好一幅24位的BMP格式图片,这一点要注意,不要误用了其他格式的图片。然后点击界面工具栏上那个“打开”按钮找到那幅准备好的BMP图片,该BMP图片会被加载到带有菜单和工具栏的程序主界面中,其功能一目了然。因为工具栏集成了该软件的主要功能,所以我们在加、解密文件时,只要使用工具栏就可以了。 如果你想隐藏文件,只需点击工具栏上的“隐藏”按钮。文件加密完成后,就会出现一个“另存为”窗口,让你选择文件保存路径。别忘记将加密后的图片保存在自己指定的文件夹里。
3、编写一个提取程序,提取出隐藏的文字。
软件代码:
#include<stdio.h>
#include<iostream.h>
#include<stdlib.h>
#include<process.h>
void writef(unsigned char a[],unsigned char tu[],int tu_l);
a[j]=a[j]>>1; //逐位获取文字的二进制代码
}
}
if(!(fp=fopen("e:\\abc.bmp","wb"))){
printf("file can't be built.\n");
exit(0);
}else{
fwrite(tu,tu_l,1,fp); //将处理后的文件保存
fclose(fp);
for(j=64;j<(64+i*8);j++) tu[j]=tu[j]&0xFE; //对图片存入文字的区域初始化,将每位颜色的二进制代码最后一位变为零
for(j=0;j<i;j++){
for(k=0;k<8;k++){
t=a[j]&0x01; //将文字转化成二进制信息,并开始隐藏如图片
tu[64+j*8+k] |=t;
printf("您希望进行什么操作?请输入序号:\n");
do{
s=getchar();
cn=(int)s-48;
}while(cn<0||cn>3); //忽略选项以外的字符输入
return cn;
}
void main(){
while(1){ //让程序一直运行,直到用户选择退出
switch(menu_select()){
使用malloc动态分布函数读取出未添加文字的图片,并输入嵌入的文字,保存文件的路径,同样在使用未定义的字符void writef,对图片存入文字的区域初始化,将每位颜色的二进制代码最后一位变为零,在进行一个for循环,对图片存入文字的区域初始化,将每位颜色的二进制代码最后一位变为零,将文字转化成二进制信息,并开始隐藏如图片,并逐位获取文字的二进制代码,查询图片长度,并且由于不知道图片中的文字长度,用于存储文字的数组需要大一点的空间,将/数组初始化。循环右移,逐个插入文字的二进制信息。
}
printf("请输入隐藏的文字长度:\n");
scanf("%d",&n); //该程序无法自动获取图片中隐藏的文字的长度,因此需要用户自己输入
readf(n,f,L);
}
void readf(int n,unsigned char tu[],int tu_l){
FILE* fp;
unsigned char t,c;
}
}
//从图片提取隐藏的文字信息的函数入口
void readout(){
FILE* fp;
char name[22];
long L;
unsigned char* f;
int n;
printf("请输入隐藏着文字信息的图片的路径:\n");
cin.getline(name,20);
if(!(fp=fopen(name,"rb"))){
c=a[j];
a[j]=(c>>1)|(c<<7); //循环右移,逐个插入文字的二进制信息
}
}
a[n]='\0'; //文字提取完毕,在结尾添加结束符
if(!(fp=fopen("e:\\words.dat","wb"))){
printf("file can't be built.\n");
exit(0);
printf(" | |\n");
printf(" | 1.向图片写入文字信息|\n");
printf(" | 2.从bmp图片读出隐藏的文字信息|\n");
printf(" | 3.退出程序。|\n");
printf(" | |\n");
printf(" |---------------------------------------|\n");
rewind(fp);
fread(f,L,1,fp); //读取出未添加文字的图片
fclose(fp);
}
printf("请输入隐藏的信息:");
cin.getline(file,200);
writef(file,f,L); //开始隐藏文字
printf("文件保存完毕!\n路径为e:\\abc.bmp\n");
case 1:
writein(); //文字隐藏
break;
case 2:
readout(); //文字提取
break;
case 3:
cout<<"程序已退出。"<<endl;
exit(0);
}
}
}
运行结果:
1、为什么做?
因为随着信息技术,网络技术,电子商务的发展,网络安全将全方位的威胁社会的经济文化,政治等方面,随着计算机硬件的发展,具有并行计算能力的破解技术日益发展成熟,仅通过增加加密算法的密钥长度来达到增强安全性已不再是唯一的可行办法,但对信息隐藏而言,可能的检测者和非法拦截者则难以从公开信息中判断机密信心是否存在,难以截获机密信息。同时锻炼我们的实训能力,以及对c语言的掌握。
}
void writef(unsigned char a[],unsigned char tu[],int tu_l){
FILE* fp;
unsigned char t;
int i,j,k;
i=0;
while(a[i]!='\0') i++; //获取输入的文字长度
printf("信息的长度为:%d\n",i);
cin.getline(name,20);
if(!(fp=fopen(name,"rb"))){
printf("file can not be found.");
exit(0);
}
else
{
fseek(fp,0,2);L=ftell(fp); //查询图片长度
f=(unsigned char*)malloc(L);
}
else
{
fwrite(a,n,1,fp); //保存文字的二进制信息
fclose(fp);
}
printf("隐藏的文字为:\n");
for(j=0;j<n;j++)cout<<char(a[j]);
cout<<endl;
printf("文字的二进制信息以保存,路径为:e:\\words.dat\n");