《LSB图像信息隐藏实验(9页).doc》由会员分享,可在线阅读,更多相关《LSB图像信息隐藏实验(9页).doc(9页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、-LSB图像信息隐藏实验-第 9 页学号:姓名: 专业年级班级: 实验室: 组别: 实验日期 :课程名称保密技术实验实验课时实验项目名称和序号图像信息隐藏实验同组者 姓 名实验目的1. 掌握对图像的基本操作。 2. 能够用 LSB 算法对图像进行信息隐藏 3. 能够用 LSB 提取算法提取隐藏进图像的信息 4. 能够反映 jpeg 压缩率与误码率之间的关系实验环境Windows+matlab实验内容和原理1用 MATLAB 函数实现 LSB 信息隐藏和提取 2分析了 LSB 算法的抗攻击能力 3能随机选择嵌入位(考虑安全性因素)实验步骤方 法关键代码实验算法 1:LSB 嵌入 1. 读取一副
2、256*256 大小的图片,判断是否为 RGB 图像。若为 RGB 图像,则 读取图像的一层信息(如 R 层)。通过读取图像的尺寸大小来判断是否为RGB图像。RGB图像是三维多彩图,size有3个参数,最小参数是3,只要判断读取到的图像大小大于2,就确定读入的是RBG图像2. 以二进制形式读取要嵌入到图片里的消息。并读取消息的长度(嵌入消息的 长度不能超过图像位数)。3. 产生与消息长度一致的一串随机数(不能相同)。自定义一个randinterval函数来实现伪随机数的生成产生的伪随机数是代表消息要隐藏的像素位置(行和列的信息)随机数代码:function row,col=randinterv
3、al(matrix,count,key)%参数说明%matrix是载体矩阵,即要隐藏信息的图层%cout为要嵌入信息的像素数量%key为自定义秘钥,随机种子 m,n = size(matrix);interval1 = floor(m * n/(count+eps) + 1;interval2 = interval1 - 2;if interval2 = 0 error(载体太小不能把秘密信息隐藏进去);endrand(seed,key);a = rand(1, count);row = zeros(1 count);col = zeros(1 count);r = 1;c = 1;row(1
4、,1) = r;col(1,1) = c;for i =2:count if c = c + interval1; else c = c + interval2; end if c n r = r + 1; if r m error(载体太小不能把秘密信息隐藏进去); end c = mod(c, n); if c = 0 c = 1; end end row(1, i) = r; col(1, i) = c;end4. 按照产生的随机数的序列依次将图片层的最后一位改为消息的信息。即用消 息替换图片 的最后一位信息。 5. 嵌入完成后,如果为 RGB 则将该层返回原图像。然后将数据信息写回图像
5、。 LSB 就完成了。image=imread(1.jpg); Hide_image=image; Hide_image=double(Hide_image); mysize=size(image); if numel(mysize)2 the photo is a rgb style photo %是rgb图像输出到命令行窗口 image1=Hide_image(:,:,1); %第三个参数 1代表的读取的是红层,但是没有将2,3层设为0,因为会叠加,所以显示出来的第一层图像还是灰色的message=fopen(Message.txt,r); msg,msg_len=fread(messag
6、e,ubit1) %按位以二进制形式读取文本内容与长度m,n=size(image1) %读取行和列p=1; %p为秘密信息的位计数器 row,col=randinterval(image1,msg_len,1996);for i=1:msg_len image1(row(i),col(i)=image1(row(i),col(i)-mod(image1(row(i),col(i),2)+msg(p,1); if p=msg_len break; end ; p=p+1; end %还原图像Hide_image(:,:,1)=image1; Hide_image=uint8(Hide_imag
7、e); imwrite(Hide_image,Hide_image.tif); %输出隐藏信息的图像 subplot(121);imshow(image);title(未嵌入信息的图片); subplot(122);imshow(Hide_image);title(嵌入信息的图片); else the photo is not a rgb style fclose(all); end实验算法 2:读取 LSB 隐藏的信息1.读取已经隐藏信息的图像。如果为 RGB 图像,则读取图像的一层(该层为嵌入信息的那层)。2.用与 LSB 算法中相同的随机数种子产生相同的一串随机数。随机数串的长度由 LS
8、B 中获得(长度不得大于图像大小)。用同一个伪随机生成算法,相同的种子,来产生像素点位置,可以确保隐藏时和提取时位置顺序是一模一样的,在顺序读取这些位置上的数据(利用与运算,与上1,任何数与上1还是本身的性质),就是隐藏的信息。 3.按照产生的随机数序列依次读取图像的相应点最后一位的信息。并将其以二进制形式写到文件中。Ubit1就代表每次读取1位,写入文件,每8位识别一个ASCII码值。所以可以成功写入26个字母和数字。其他字符由于文本文档识别不了,所以写入文本之后都变成了乱码。4.看文件,即获取的信息,与嵌入的信息进行比较。Message.txt是原始信息文档,txt是提取出来的信息文档,可
9、以发现二者信息内容是一模一样的,说明隐藏信息提取是成功的。%功能:用来提取隐藏信息 Picture=imread(Hide_image.tif); Picture=double(Picture); m,n=size(Picture); if msg_lenm*n error(嵌入信息量过大,请重新选择图像)endfrr=fopen(3.txt,w); %以写入方式打开只写文件 msg_len=8; %这里要改成实验一中自己图片的数据p=1; row,col=randinterval(Picture,msg_len,1996); for i=1:msg_len if bitand(Picture
10、_R(row(i),col(i),1)=1 %按位与运算 fwrite(frr,1,ubit1); result(p,1)=1; else fwrite(frr,0,ubit1); result(p,1)=0; end if p=msg_len break; end p=p+1; end fclose(frr); %fwrite函数的作用是将内存中的二进制数据原样写入文件中 %是ubit后面的数字表示是一次读几位,中间的数据表示读几次。1. 读取已经隐藏信息的图像。 fp=imread(Hide_image.tif);2. 使用 imwrite 函数对图像进行压缩,设定压缩比例。 imwrit
11、e(fp,out.jpg,quality,compressibility)Compressiblity是图像的质量因子,可设置在0-100范围内;3. 如果为 RGB 图像,则读取嵌有信息的一层。按照读取 LSB 隐藏信息算法的步骤,读取信息,不写入文件。 4. 读取原文件,即隐藏的信息,以二进制读取。并取得消息长度。 message=fopen(message.txt,r);msg,msg_len=fread(message,ubit1)%按位以二进制形式读取文本内容与长度5比较取得的信息和原信息的每一位,记录不相等位数的个数。bit_error=find(result=msg); %寻找不
12、相等的位置bit_error_count=size(bit_error,1); %统计不相等的个数 6. 用不相等个数除以总长度即可得到误码率。 ber(compressibility/10)=bit_error_count/msg_len;7. 改变压缩率。得到一组误码率关于压缩率的函数。在开始时,设置9次循环,压缩图片的质量因子compressibility从10开始增加,每次递增10,直到compressibility=100,记录下每次的误码率,用plot函数做出关于以质量因子为横坐标,误码率为纵坐标的图表。 for compressibility=10:10:100 %九次不同压缩率
13、的图片压缩 fp=imread(Hide_image.tif); imwrite(fp,out.jpg,quality,compressibility)% plot参数说明: % 参数1是横坐标自变量,参数2是纵坐标自变量,参数3是指用说明形式描点,参数4和5代表把散点链接起来 compressibility=10:10:100; plot(compressibility,ber,*,compressibility,ber); title(基于图片压缩质量因子的误码率图表); 代码:close all; clc for compressibility=10:10:100 fp=imread(H
14、ide_image.tif);imwrite(fp,out.jpg,quality,compressibility); out=imread(out.jpg);out=double(out);if size(fp)2 outr=out(:,:,1) m,n=size(outr) msg_len=8p=1;%将消息序列写回文本文件 row,col=randinterval(outr,msg_len,1996);for i=1 :msg_lenif bitand(outr(row(i),col(i),1)=1 result(p,1)=1; else result(p,1)=0; end if p
15、=msg_len break; end p=p+1;endmessage=fopen(Message.txt,w); msg,msg_len=fread(message,ubit1);bit_error=find(result=msg_len) bit_error_count=size(bit_error,1); ber(compressibility/10)=bit_error_count/(msg_len+eps); endend compressibility=10:10:100; plot(compressibility,ber,*,compressibility,ber); title(基于图片压缩质量因子的误码率图表 );(接上页)实验步骤方 法关键代码测试记录分 析结 论如果找到的图片的msg_len太小,那么后面输入的数字位数就会很短,否则就会乱码。小 结经过这次实验操作,让我对matlab有了更深的理解。对信息隐藏也有了更深得认识。以下由实验教师填写记 事评 议 成绩评定 平时成绩_ 实验报告成绩_ 综合成绩 _ 指导教师签名:
限制150内