基于格式的信息隐藏方法通常在文件头与图像数据之间或图像数据末尾添加保密信息,具有实现简单、透明、隐藏容量大等诸多优点; LSB图像信息隐藏算法是一种在图像像素数据的低位隐藏秘密信息隐藏信息的方法,具有实现简单、隐藏容量大等优点。 这次实验需要基于以上两种方法,完成以下内容。 从网络随机下载或拍摄图像,图像分辨率超过80*80,保存格式可选; 用上述两种方法分别在此图像中隐藏约100到200字左右的文本; 设计并编制信息嵌入程序和信息抽取程序; 给出实验结果,提出符合规范的实验报告。
基于格式的图像信息隐藏
1、信息嵌入步骤
1 )在DOS命令行中输入copy logo.jpg/b hidden.txt/alog oout.jpg命令;
2、信息提取步骤
1 )加载并打开预嵌入徽标. jpg,hidden.txt;
2 )加载并打开嵌入的logoout.jpg
3 )提取文件
信息提取代码
clc; 清除全部关闭
FID=fopen (徽标. jpg ),r ); 读取并打开logo.jpg
[ori,length1]=fread(FID,inf,' uint8' );
fclose(FID;
FID=fopen('logoout.jpg ',' r ' ); 读取并打开logoout.jpg
[hid,length2]=fread(FID,inf,' uint8' );
fclose(FID;
FID=fopen(hidden.txt )、(r ); 读取并打开hidden.txt
[hidtxt,length3]=fread(FID,inf,' uint8' );
fclose(FID;
FID=fopen(extract.txt )、(w ); 以读取方式打开extract.txt
write(FID,hid ) Length11:Length2-1)、' uint8' );
fclose(FID;
Ernum=Biterr(hidtxt,hid ) Length11:Length2-1);
基于LSB图像信息的隐藏方法
1、信息嵌入步骤
1 )将文本文件转换为二进制流
2 )读取图像标识;
3 )以二进制格式读取嵌入图像的消息。 读取消息的长度。 (嵌入的消息长度不能超过图像的位数);
4 )生成与消息长度一致的随机数序列(不能相同)。 为生成伪随机数而定制random函数生成的伪随机数表示消息要隐藏的像素的位置(行和列信息)
5 )根据所生成的随机数顺序,将图像层的最后一个比特顺序地改变为消息的信息。 用消息替换图像的最后信息
2、信息提取步骤
1 )读取隐藏信息的图像
2 )使用与LSB算法相同的随机数种子生成相同的一系列随机数。 随机数序列的长度用LSB求出。 长度不要大于图像尺寸。
3 )按照生成的随机数序列依次读取图像对应点的最后一位信息。 将其以二进制格式写在文件中;
4 )查看文件,也就是将获取的信息与嵌入的信息进行比较。
源代码(仅供参考) ) )。
嵌入
clc; 清除全部关闭
转换%文本文件和二进制流
FID=fopen(hidden.txt )、(r );
[hidtxt,length]=fread(FID,' ubit8 ' );
保存hidtxt,length值
save save.mat hidtxt length
fclose(FID;
txtb=de2bi(hidtxt,8 ); 从二进制到二进制
txtbm=reshape(txtb,1,length*8); %txtbm是二进制码流
BMtxt=reshape(txtBM,length,8 );
btxt=bi2de(BMtxt ); 从%2进制到10进制
FID=fopen(extracttxt.txt )、(w );
fwrite(FID,btxt,' uint8' );
fclose(FID;
%读取图像
img=imread (徽标. jpg );
img=double(img;
[a,b]=size(img );
t=1;
产生%随机数
[c,d]=random(img,length,1712031005 );
根据%生成的随机数顺序,将图像层的最后一位更改为消息中的信息。 用消息替换图像的最后信息
for i=1:length
img(c ) I,d ) I )=img ) c ) I,d ) I )-mod ) img ) c ) I,d ),2 ) hidtxt(t ) t,1 );
if t==length
break;
end
t=t+1;
end
%还原图像
img=uint8(img);
imwrite(img,'logoout.jpg');
%自定义一个random函数来实现伪随机数的生成
%产生的伪随机数是代表消息要隐藏的像素位置(行和列的信息)
%mat为载体矩阵
%count为嵌入信息的大小
%key为随机数种子
function [R,C]=random(mat,count,key)
%计算间隔的位数
[m,n]=size(mat);
interval1=floor(m*n/count)+1;
interval2=interval1-2;
if interval2==0
error('error');
end
%生成随机序列
rand('seed',key);
a=rand(1,count);
%初始化
R=zeros([1 count]);
C=zeros([1 count]);
%计算row,col
r=1;
c=1;
R(1,1)=r;
C(1,1)=c;
for i=2:count
if a(i)>=0.5
c=c+interval1;
else
c=c+interval2;
end
if c>n
r=r+1;
if r>m
error('error');
end
c=mod(c,n);
if c==0
c=1;
end
end
R(1,i)=r;
C(1,i)=c;
end
end
提取
clc;clear;close all
%读取携密图片
img=imread('logoout.jpg');
img=double(img);
%计算大小
[a,b]=size(img);
load save.mat;
fid=fopen('hidout.txt','w');
p=1;
[row,col]=random(img,length,1712031005); %产生随机数
for i=1:length
if bitand(img(row(i),col(i)),1)==1 %按位与运算
fwrite(fid,1,'ubit1');
result(p,1)=1;
else
fwrite(fid,0,'ubit1');
result(p,1)=0;
end
if p==length
break;
end
p=p+1;
end
fclose(fid);
fid=fopen('hidden.txt','r');
[hidtxt,length]=fread(fid,inf,'uint8');
fclose(fid);
fid=fopen('hidout.txt','r');
[hidout,length1]=fread(fid,inf,'uint8');
fclose(fid);
%errnum=biterr(hidtxt,hidout);
function [R,C]=random(mat,count,key)
%计算间隔的位数
[m,n]=size(mat);
i1=floor(m*n/count)+1;
i2=i1-2;
if i2==0
error('error');
end
%生成随机序列
rand('seed',key);
a=rand(1,count);
%初始化
R=zeros([1 count]);
C=zeros([1 count]);
%计算row,col
r=1;
c=1;
R(1,1)=r;
C(1,1)=c;
for i=2:count
if a(i)>=0.5
c=c+i1;
else
c=c+i2;
end
if c>n
r=r+1;
if r>m
error('error');
end
c=mod(c,n);
if c==0
c=1;
end
end
R(1,i)=r;
C(1,i)=c;
end
end
总结
1、基于格式的信息隐藏:只需在DOS命令行中输入一条命令,无需编码,简单;隐藏信息可以通过现有工具提取,透明性低;隐藏容量大。
2、基于LSB的图像信息隐藏,优点是算法简单,便于实现,计算速度快;在基础算法上能很快的进行改进,并在脆弱水印中广泛应用;由于能在最低有效位进行嵌入,所以对于图像影响很小,几乎无法用肉眼识别。LSB缺点是:嵌入消息较大似乎,耗时长;只能处理简单的流格式的文件;为满足水印的不可见性,允许嵌入的水印强度较低,对于空域的各种操作较敏感;鲁棒性差。