搜索
您的当前位置:首页正文

实验三 基于LSB的信息隐藏算法

来源:品趣旅游知识分享网


实验三 基于LSB的信息隐藏算法

一、 实验目的

该实验为验证性实验。目的是通过实验使学生掌握经典信息隐藏算法,在Matlab环境下,编写基于图像的LSB信息隐藏算法程序。用Matlab函数实现LSB信息隐藏及提取,并进行分析。

二、 实验要求

1、实验前要做好充分准备,包括:复习实验所涉及的知识点,掌握Matlab编程语言和调试环境。

2、实验时注意记录实验过程中产生的数据、出现的问题及解决问题的方法。

3、理论联系实际,认真分析实验结果,回答思考题。

4、实验后完成实验报告,并附相关截图。

三、 实验环境

计算机(安装Visual C++ 6.0和Matlab 6.5以上版本)

四、 实验原理

隐秘算法核心是将我们选取的像素点的最不重要位依次替换成秘密信息,以达到信息

隐秘的目的。嵌入过程包括选择一个图像载体像素点的子集{j1,…,jl(m)},然后在子集上执行替换操作像素cji←→mi,即把cji的LSB与秘密信息mi进行交换(mi可以是1或0)。一个替换系统也可以修改载体图像像素点的多个比特,例如,在一个载体元素的两个最低比特位隐藏两比特、三比特信息,可以使得信息嵌入量大大增加但同时将破坏载体图像的质量。在提取过程中,找出被选择载体图像的像素序列,将LSB(最不重要位)排列起来重构秘密信息,算法描述如下:

嵌入过程:for(i=1;i<=像素序列个数;i++)

si←ci

for(i=1;i<=秘密消息长度;i++)

//将选取的像素点的最不重要位依次替换成秘密信息

sji←cji←→mi

提取过程:for(i=1;i<=秘密消息长度;i++)

{ i←→ji //序选取

mi←LSB(cji)

}

五、 实验内容与步骤

1、 随机选取图像载体像素,实现隐秘消息的嵌入与提取

(1)隐秘消息的嵌入

%文件名:randlsbhide.m

%函数功能:本函数将完成随机选择LSB的信息隐秘,载体选用灰度BMP图

%输入格式举例:[ste_cover,len_total]=randlsbhide(′glenna.bmp′,′message.txt′,′scover.bmp′,2001)

%参数说明:

%input是信息隐蔽载体图像%file是秘密消息文件

%output是信息隐秘后的生成图像

%key是随机间隔函数的密钥

function[ste_cover,len_total]=randlsbhide(input,file,output,key)

%读入图像矩阵

cover=imread('lena.bmp');

ste_cover=cover;ste_cover=double(ste_cover);

%将文本文件转换为二进制序列

f_id=fopen('1.txt','r');

[msg,len_total]=fread(f_id,'ubit1');

%判断嵌入消息量是否过大

[m,n]=size(ste_cover);

if len_total>m*n

error('嵌入消息量过大,请更换图像');

end

%p作为消息嵌入位数计数

p=1;

%调用随机间隔函数选取像素点

[row,col]=randinterval(ste_cover,len_total,2001);

%在LSB隐秘消息

for i=1:len_total

ste_cover(row(i),col(i))=ste_cover(row(i),col(i))-mod(ste_cover(row(i),col(i)),2)+msg(p,1);

if p==len_total

break;

end

p=p+1;

end

ste_cover=uint8(ste_cover);

imwrite(ste_cover,'lena2.bmp');

%显示实验结果

subplot(1,2,1);imshow(cover);title('原始图像');

subplot(1,2,2);imshow('lena2.bmp');title('隐藏信息的图像');

(2)编写函数比较两幅图像区别

%文件名:compare.m

%函数功能:本函数完成显示隐秘前后两幅图像的区别

%输入格式举例:F=compare(′blenna.bmp′,′scover.bmp′)

%参数说明:

%original是原始载体图像

%hided是隐秘后的图像

%F是差值矩阵

function F=compare(original,hided)

%读取原始载体图像矩阵

W=imread('lena.bmp');

W=double(W)/255;

%读取隐秘后图像矩阵

E=imread('lena2.bmp');

E=double(E)/255;

%将两图像矩阵相减,显示效果

F=E-W;

%注意,MATLAB中矩阵相减只支持double型

imshow(mat2gray(F))

(3)隐秘消息的提取

%文件名:randlsbget.m

%函数功能:本函数将完成提取隐秘于LSB上的秘密消息

%输入格式举例:result=randlsbget(′scover.jpg′,56,′secret.txt′,2001)

%参数说明:

%output是信息隐秘后的图像

%len_total是秘密消息的长度

%goalfile是提取出的秘密消息文件

%key是随机间隔函数的密钥

%result是提取的消息

function result=randlsbget(output,len_total,goalfile,key)

ste_cover=imread('lena2.bmp');

ste_cover=double(ste_cover);

%判断嵌入消息量是否过大

[m,n]=size(ste_cover);

frr=fopen('2.txt','a');

%p作为消息嵌入位数计数器,将消息序列写回文本文件

p=1;

%调用随机间隔函数选取像素点

[row,col]=randinterval(ste_cover,128,2001);

for i=1:128

if bitand(ste_cover(row(i),col(i)),1)==1

fwrite(frr,1,'bit1');

result(p,1)=1;

else

fwrite(frr,0,'bit1');

result(p,1)=0;

end

if p==128

break;

end

p=p+1;

end

fclose(frr);

2、 顺序选取图像载体像素,实现隐秘消息的嵌入与提取

(1)隐秘消息的嵌入

%文件名:lsbhide.m

%函数功能:本函数将完成在LSB上的顺序信息隐秘,载体选用灰度BMP图

%输入格式举例:

[ste_cover,len_total]=lsbhide(′glenna.bmp′,′message.txt′,′scover.bmp′)

%参数说明:

%input是信息隐蔽载体图像,为灰度BMP图

%file是秘密消息文件

%output是信息隐秘后生成图像

%ste_cover是信息隐秘后图像矩阵

%len_total是秘密消息的长度,即容量

function[ste_cover,len_total]=lsbhide(input,file,output,key)

%读入图像矩阵

cover=imread('lena.bmp');

ste_cover=cover;ste_cover=double(ste_cover);

%将文本文件转换为二进制序列

f_id=fopen('1.txt','r');

[msg,len_total]=fread(f_id,'ubit1');

%判断嵌入消息量是否过大

[m,n]=size(ste_cover);

if len_total>m*n

error('嵌入消息量过大,请更换图像');

end

%p作为消息嵌入位数计数

p=1;

%调用随机间隔函数选取像素点

%[row,col]=interval(ste_cover,len_total,2001);

%在LSB隐秘消息

for f1=1:m

for f2=1:n

ste_cover(f1,f2)=ste_cover(f1,f2)-mod(ste_cover(f1,f2),2)+msg(p,1);

if p==len_total

break;

end

p=p+1;

end

if p==len_total

break;

end

p=p+1;

end

ste_cover=uint8(ste_cover);

imwrite(ste_cover,'lena2.bmp');

%显示实验结果

subplot(1,2,1);imshow(cover);title('原始图像');

subplot(1,2,2);imshow('lena2.bmp');title('隐藏信息的图像');

(2)调用函数compare.m比较两幅图像区别

%文件名:compare.m

%函数功能:本函数完成显示隐秘前后两幅图像的区别

%输入格式举例:F=compare(′blenna.bmp′,′scover.bmp′)

%参数说明:

%original是原始载体图像

%hided是隐秘后的图像

%F是差值矩阵

function F=compare(original,hided)

%读取原始载体图像矩阵

W=imread('lena.bmp');

W=double(W)/255;

%读取隐秘后图像矩阵

E=imread('lena2.bmp');

E=double(E)/255;

%将两图像矩阵相减,显示效果

F=E-W;

%注意,MATLAB中矩阵相减只支持double型

imshow(mat2gray(F))

(3)隐秘消息的提取

%文件名:lsbget.m

%函数功能:本函数将完成提取隐秘于LSB上的秘密消息

%输入格式举例:result=lsbget(′scover.bmp′,56,′secret.txt′)

%参数说明:

%output是信息隐秘后的图像

%len_total是秘密消息的长度

%goalfile是提取出的秘密消息文件

%result是提取的消息

function result=lsbget(output,len_total,goalfile,key)

ste_cover=imread('lena2.bmp');

ste_cover=double(ste_cover);

%判断嵌入消息量是否过大

[m,n]=size(ste_cover);

frr=fopen('2.txt','a');

%p作为消息嵌入位数计数器,将消息序列写回文本文件

p=1;

%调用随机间隔函数选取像素点

[row,col]=interval(ste_cover,128,2001);

for f1=1:128

for f2=1:128

if bitand(ste_cover(f1,f2),1)==1

fwrite(frr,1,'bit1');

result(p,1)=1;

else

fwrite(frr,0,'bit1');

result(p,1)=0;

end

if p==128

break;

end

p=p+1;

end

if p==128

break;

end

p=p+1;

end

fclose(frr);

实验小结:

通过实验使我们掌握经典信息隐藏算法,在Matlab环境下,编写基于图像的LSB信息隐藏算法程序。用Matlab函数实现LSB信息隐藏及提取,并进行分析,对顺序嵌入隐秘消息和随机嵌入隐秘消息两种方法的实现结果进行比较。通过比较可得,顺序嵌入隐秘消息比随机嵌入隐秘消息更有序,代码更复杂,要求更严格,同时隐秘性也更好。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top