学号:姓名:专业年级班级:实验室:组别:实验日期:课程名称保密技术实验实验课时实验项目名称和序号1.LSB图像信息隐藏实验同组者姓名实验目的1. 掌握对图像的基本操作。
2. 能够用LSB 算法对图像进行信息隐藏3. 能够用LSB 提取算法提取隐藏进图像的信息4. 能够反映jpeg 压缩率与误码率之间的关系实验环境Windows+matlab实验内容和原理1.用MA TLAB 函数实现LSB 信息隐藏和提取2.分析了LSB 算法的抗攻击能力3.能随机选择嵌入位(考虑安全性因素)实验步骤方法关键代码实验算法1:LSB 嵌入1.读取一副256*256 大小的图片,判断是否为RGB 图像。
若为RGB 图像,则读取图像的一层信息(如R 层)。
通过读取图像的尺寸大小来判断是否为RGB图像。
RGB图像是三维多彩图,size有3个参数,最小参数是3,只要判断读取到的图像大小大于2,就确定读入的是RBG 图像2.以二进制形式读取要嵌入到图片里的消息。
并读取消息的长度(嵌入消息的长度不能超过图像位数)。
3.产生与消息长度一致的一串随机数(不能相同)。
自定义一个randinterval函数来实现伪随机数的生成产生的伪随机数是代表消息要隐藏的像素位置(行和列的信息)随机数代码:function [row,col]=randinterval(matrix,count,key)%randinterval.m%参数说明%matrix是载体矩阵,即要隐藏信息的图层%cout为要嵌入信息的像素数量%key为自定义秘钥,随机种子[m,n] = size(matrix);interval1 = floor(m * n/(count+eps)) + 1;interval2 = interval1 - 2;if interval2 == 0error('载体太小不能把秘密信息隐藏进去');endrand('seed',key);a = rand(1, count);row = zeros([1 count]);col = zeros([1 count]);r = 1;c = 1;row(1,1) = r;col(1,1) = c;for i =2:countif a(i) >= 0.5c = c + interval1;elsec = c + interval2;endif c > nr = r + 1;if r > merror('载体太小不能把秘密信息隐藏进去');endc = mod(c, n);if c == 0c = 1;endendrow(1, i) = r;col(1, i) = c;end4.按照产生的随机数的序列依次将图片层的最后一位改为消息的信息。
即用消息替换图片的最后一位信息。
5.嵌入完成后,如果为RGB 则将该层返回原图像。
然后将数据信息写回图像。
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(message,'ubit1') %按位以二进制形式读取文本内容与长度[m,n]=size(image1) %读取行和列p=1; %p为秘密信息的位计数器[row,col]=randinterval(image1,msg_len,1996);for i=1:msg_lenimage1(row(i),col(i))=image1(row(i),col(i))-mod(image1(row(i),co l(i)),2)+msg(p,1);if p==msg_lenbreak;end ;p=p+1;end%还原图像Hide_image(:,:,1)=image1;Hide_image=uint8(Hide_image);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 算法中相同的随机数种子产生相同的一串随机数。
随机数串的长度由LSB 中获得(长度不得大于图像大小)。
用同一个伪随机生成算法,相同的种子,来产生像素点位置,可以确保隐藏时和提取时位置顺序是一模一样的,在顺序读取这些位置上的数据(利用与运算,与上1,任何数与上1还是本身的性质),就是隐藏的信息。
3.按照产生的随机数序列依次读取图像的相应点最后一位的信息。
并将其以二进制形式写到文件中。
Ubit1就代表每次读取1位,写入文件,每8位识别一个ASCII码值。
所以可以成功写入26个字母和数字。
其他字符由于文本文档识别不了,所以写入文本之后都变成了乱码。
4.看文件,即获取的信息,与嵌入的信息进行比较。
Message.txt是原始信息文档,txt是提取出来的信息文档,可以发现二者信息内容是一模一样的,说明隐藏信息提取是成功的。
%功能:用来提取隐藏信息Picture=imread(‘Hide_image.tif’);Picture=double(Picture);[m,n]=size(Picture);if msg_len>m*nerror('嵌入信息量过大,请重新选择图像')endfrr=fopen(‘3.txt’,’w’); %以写入方式打开只写文件msg_len=8; %这里要改成实验一中自己图片的数据p=1;[row,col]=randinterval(Picture,msg_len,1996);for i=1:msg_lenif bitand(Picture_R(row(i),col(i)),1)==1 %按位与运算fwrite(frr,1,’ubit1’);result(p,1)=1;elsefwrite(frr,0,’ubit1’);result(p,1)=0;endif p==msg_lenbreak;endp=p+1;endfclose(frr);%fwrite函数的作用是将内存中的二进制数据原样写入文件中%是ubit后面的数字表示是一次读几位,中间的数据表示读几次。
1.读取已经隐藏信息的图像。
fp=imread(‘Hide_image.tif’);2. 使用imwrite 函数对图像进行压缩,设定压缩比例。
imwrite(fp,’out.jpg’,’quality’,compressibility)Compressiblity是图像的质量因子,可设置在0-100范围内;3. 如果为RGB 图像,则读取嵌有信息的一层。
按照读取LSB 隐藏信息算法的步骤,读取信息,不写入文件。
4. 读取原文件,即隐藏的信息,以二进制读取。
并取得消息长度。
message=fopen(‘message.txt’,’r’);[ms g,msg_len]=fread(message,’ubit1’)%按位以二进制形式读取文本内容与长度5比较取得的信息和原信息的每一位,记录不相等位数的个数。
bit_error=find(result~=msg); %寻找不相等的位置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 %九次不同压缩率的图片压缩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;clcfor compressibility=10:10:100fp=imread('Hide_image.tif');imwrite(fp,'out.jpg','quality',compressibility);out=imread('out.jpg');out=double(out);if size(fp)>2outr=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)==1result(p,1)=1;elseresult(p,1)=0;endif p ==msg_lenbreak;endp=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); endendcompressibility=10:10:100;plot(compressibility,ber,'*',compressibility,ber);title('基于图片压缩质量因子的误码率图表 ');(接上页)实验步骤方法关键代码测试记录如果找到的图片的msg_len太小,那么后面输入的数字位数就会很短,否则就会乱码。