目录
实验目的
1、了解隐写技术的分类
2、了解隐写技术的基本原理
3、学会在图像中隐藏数据
二、实验环境
Windows Server 2008
相关文件地址:C:\Users\Administrator\Desktop\hidden\隐写技术
实验内容
- 通过学习“图像元数据”的实验指导,了解在图像里隐藏信息的方法和软件的使用,实现在图片属性上的隐写和在图片内容上的隐写。
2、通过学习“隐写技术”的实验指导,了解在图像中插入隐藏数据的方法。学习LSB方法的原理。
实验步骤
- 结合实验指导内容,尝试通过软件实现在图像里隐藏数据,给出实验过程和截图,并加以解释说明隐藏了什么数据,隐藏的数据在图像的位置。
过程截图:
打开图片1:

最底部:

打开图片2:

最底部:

隐藏:

解释说明:
隐藏了文字I'm simple,隐藏在批注区
- 尝试运行“桌面-信息隐藏技术-BMP图像信息隐藏”文件夹下的代码,给出运行结果的截图,并说明每个代码的作用。
1)运行截图:

2)代码解释
clc;: 清除MATLAB命令窗口中的所有输出。
clear all;: 清除工作区的所有变量,确保没有旧数据会影响当前的脚本执行。
wm=randsrc(1,300,[0 1]);: 生成一个1行300列的随机二进制数组,其中的元素值为0或1,用作水印。但请注意,这里的代码有一个语法错误:分号应该用英文字符,且数字与符号间不需要加空格。
fid = fopen('test.bmp','r');: 打开一个名为test.bmp的位图文件以供读取。fid是一个文件标识符,用于后续的文件操作。
[a,length]= fread(fid,inf,'uint8');: 读取整个test.bmp文件内容到数组a中,每个元素都被读取为一个8位无符号整数(即字节)。length将返回读取的元素总数。
fclose(fid);: 关闭打开的图像文件,释放资源。
msgfid = fopen('hidden.txt','r');: 打开一个名为hidden.txt的文件,准备从中读取要隐藏的信息。
[msg,count]= fread(msgfid);: 读取hidden.txt文件的内容到msg数组,count返回读取的元素数量。这里的代码应该是[msg,count]= fread(msgfid);(末尾的冒号应该是分号)。
fclose(msgfid);: 关闭打开的文本文件。
wa = a;: 创建数组a的副本,名为wa,用于后续操作,以避免直接修改原始图像数据。
j = 1;: 初始化索引变量j,用于遍历秘密信息的每个字节。
k = 54 + count;: 计算要修改的数组元素的结束索引。因为位图文件的前54字节是文件头,所以实际隐藏信息的开始位置是从第55个字节开始。
wa(11) = wa(11) + count + 1;: 修改位图文件头中某个特定位置(第11个字节)的值,这可能是为了调整图像的某个属性以适应额外嵌入的数据。但实际上,这行代码的目的可能被误解了,因为通常不直接修改这部分。
wa(3) = wa(3) + count + 1;: 同上,修改第3个字节,这通常是文件大小字段,但实际中我们不应随意更改这一部分。
循环开始 for i=55:k:从第55个字节开始到k(隐藏信息的长度加上起始点),遍历这些位置。
wa(i) = uint8(msg(j,1));: 将秘密信息中的当前字节替换到图像的当前位置。
j = j + 1;: 移动到秘密信息的下一个字节。
循环结束。
循环开始 for i=55:length: 从第55个字节遍历到图像数据的末尾。
wa(i + 10) = a(i);: 这行代码似乎试图在图像某部分插入额外的数据,但这实际上可能会导致错误,应该是拷贝原数据的意图,但实现上可能有误。
循环结束。
figure;: 创建一个新的图形窗口。
wa = uint8(wa);: 确保wa数组中的所有值都是8位无符号整数类型。
fid = fopen('watermarked.bmp','wb');: 打开或创建一个名为watermarked.bmp的文件以供写入,准备将修改后的图像数据保存到这个新文件。
fwrite(fid,wa);: 将修改后的图像数据写入到watermarked.bmp文件中。
fclose(fid);: 关闭文件,结束写操作。
imshow('watermarked.bmp');: 显示新生成的带有隐藏信息的位图图片。
2.
1) 运行截图


2)代码解释:
clc;: 清除MATLAB命令窗口中的所有输出。
clear all;: 清除工作区的所有变量,以防旧数据影响脚本的执行。
fid = fopen('test.bmp','r');: 打开一个名为test.bmp的位图文件,用于读取。fid是文件标识符,用于后续的文件操作。
[a,length] = fread(fid, inf, 'uint8');: 以8位无符号整数的形式读取test.bmp文件的全部内容,并存储在数组a中。length变量将包含读取的总字节数。
fclose(fid);: 关闭已打开的文件,释放系统资源。
3。
1)运行截图:

2)代码解释:
clc;: 清除MATLAB命令窗口中的所有输出。
clear all;: 清除工作区的所有变量,以防旧数据影响脚本执行。
fid = fopen('test.bmp','r');: 打开名为test.bmp的图像文件,用于读取。'r'表示以只读方式打开文件。fid是一个文件标识符,用于后续的文件操作。
[a,length] = fread(fid,inf,'uint8');: 以8位无符号整数的格式读取文件test.bmp的全部内容到数组a中,length变量存储读取的总字节数。
fclose(fid);: 关闭文件test.bmp,释放由fopen占用的资源。
fid = fopen('test.bmp','r');: 再次打开文件test.bmp,为了执行不同的文件操作。
status = fseek(fid,2,'bof');: 将文件的位置指示器移动到文件开始处后的第2个字节。'bof'表示基于文件的开头,此操作用于跳过BMP文件头的前两个字节。
fileb = fread(fid,4,'uint8');: 从当前位置(即文件的第3个字节)开始读取4个字节。这些字节包含了文件的大小信息。
filelength = fileb(1)*1 + fileb(2)*256 + fileb(3)*256^2 + fileb(4)*256^3;: 计算文件头中记录的文件长度。由于BMP文件的大小信息是以小端模式存储的,这行代码正确地将这4个字节转换为文件长度。
diff = length-filelength;: 计算文件的实际长度和文件头中记录的长度之间的差值。如果有差异,这可能表明在文件中隐藏了额外的信息。
fclose(fid);: 关闭文件。
diff: 显示变量diff的值,即隐藏信息的长度。
回答问题
- 什么是Exif?
可交换图像文件格式,是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。
Exif最初由日本电子工业发展协会在1996年制定,版本为1.0。1998年,升级到2.1,增加了对音频文件的支持。2002年3月,发表了2.2版。
Exif可以附加于JPEG、TIFF、RIFF等文件之中,为其增加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本信息。
Windows 7操作系统具备对Exif的原生支持,通过鼠标右键点击图片打开菜单,点击属性并切换到详细信息标签下即可直接查看Exif信息。
Exif信息是可以被任意编辑的,因此只有参考的功能。Exif信息以0xFFE1作为开头标记,后两个字节表示Exif信息的长度。所以Exif信息最大为64 kb,而内部采用TIFF格式。
- 什么是LSB?
最低有效位,英文全称是:the least significant bit,缩写为:lsb,是指一个二进制数字中的第0位(即最低位),具有权值为2^0,可以用它来检测数的奇偶性。与之相反的称之为最高有效位。在大端序中,lsb指最右边的位。
1万+



被折叠的 条评论
为什么被折叠?



