图片保密传输.docx
《图片保密传输.docx》由会员分享,可在线阅读,更多相关《图片保密传输.docx(16页珍藏版)》请在冰豆网上搜索。
图片保密传输
图片保密传输的数学模型
摘要:
在当前信息量如此膨胀的通信时代,如何保证信息传输的安全已经越来越重要,而密码学也逐渐从单纯的数学问题慢慢渗透进了其他各个行业,变为了一门具有特色性的学科。
密码在图片保密传输中已经有很多的应用,本文通过Matlab软件应用LSB算法对图片进行加密,并以另一张图片作为载体进行传输,并再次利用LSB算法对图片进行解密并提取出原图,整个过程较为简单,且具有较大的负载量,但是由于负载量的增大也导致安全性的降低,本文最后给出了提高安全性的随机算法,来加强保密性。
关键字:
图片保密传输、LSB、数学建模、Matlab
一、问题重述
下面是两幅图片:
为了保密,需要将图片
(1)隐藏在图片
(2)中进行传输,并且要求在信息传输过程中信息被破译的概率小于5%。
(1)试建立信息加密的数学模型与方法;
(2)试建立信息解密的数学模型与方法;
(3)对上面二幅图片完成加密-传送-接收-解密的全过程,并进一步设计程序,给出良好的界面;
(4)试对加密图和解密图进行比较和检测,给出检测效率的定量估计方法。
二、模型假设
1.假设图片的变动在人眼无法辨别的情况下视为安全。
2.假设传输过程中只有指定对象得到密钥。
三、符号说明
LSB:
LeastSignificantBit最低有效位
cj:
载体像素
mi:
密文0、1信息量
A:
安全性
K:
还原效率
dt:
灰度像素数值总差值
total:
像素数值和
四、模型的分析及建立
为了将一张图片隐藏到另一张图片中,首先需要了解图像在matlab中的工作原理。
一个彩色图像就是一个三维矩阵,如果使用matlab的话,可以使用imread来读取一副图像,在workspace中就可以看到矩阵了,但是三维矩阵不能直接显示。
三维数组有三个面,依次对应于红(Red)、绿(Green)、蓝(Blue)三种颜色,而面中的数据则分别是这三种颜色的强度值。
设所得矩阵为X三维矩阵(256,256,3),X(:
:
1)代表红颜色的2维矩阵X(:
:
2)代表绿颜色的2维矩阵,X(:
:
3)代表蓝颜色的2维矩阵,第一第二维取值在0-255(2^81byte),第三维是1-3。
欲将图面进行隐藏即是将图片的矩阵信息进行隐藏,一般隐藏信息的技术分为:
1.空间域隐秘技术
LSB方法
拼凑方法
文档结构微调方法
2.变换域隐秘技术
DCT变换,小波变换,傅立叶变换,Fourier-Mellin变换或其它变换
通过观察图片可以看出图像信息量较大,所以比较适合采用LSB方法,LSB替换:
嵌入过程包括选择一个载体元素的子集{cj1,…,cjl(m)},然后在子集上执行替换操作cji←→mi,即把cji的LSB与mi进行交换(mi可以是1或0)。
这是一种典型的空间域数据隐藏算法,L.F.Tumer与R.G.VanSchyadel等先后利用此方法将特定的标记隐藏于数字音频和数字图像,该方法是利用原始数据的最低几位来隐藏信息(具体取多少位,以人的听觉或视觉系统无法察觉为原则),LSB方法的优点是有较大的信息隐藏量,但采用此方法实现的数字水印是很脆弱的,无法经受一些无损和有损的信息处理,而且如果确切地知道水印隐藏在几位LSB中,数字水印很容易被擦除或绕过【1】。
因为只是要求在信息传输过程中信息被破译的概率小于5%,所以LSB方法还是基本可以满足的。
我们通过程序可以进一步判断此方法的合理性,首先将需要加密的图片保存为1.jpg,将载体图片保存为2.jpg,运行程序W=imread('1.jpg');size(W)Z=imread('2.jpg');size(Z),可以得到ans=3044043ans=4362923,计算可得需要加密的图像像素点有122816个,而载体图像像素点有127312个。
如此之大的隐藏信息量,又为了确保安全性,可见必须舍弃精密度来保证信息量和保密性,从而LSB方法是较为合理的选择。
五、模型的求解
1.图片的信息化
由于LSB算法适合将数字信息进行插入保密,所以我们需要将需要被隐藏的图片数字信息话,并保存到文件中,这里可以利用Matlab中的imread函数迅速的将图片信息转化为数字信息,但是为了保证载体的安全性,又能保证密文的可加密和可解读性,imread函数显然不能独立完成信息化。
考虑到图片的载体一般为像素点,所以可以通过改变其像素点的值来进行加密,为了使其变化不被人眼所示,所以可以将变动限制为0和1。
这里利用文件将图片信息转化为0、1可读的文本文件,从而将图片加密转化为密文加密,降低了加密的难度。
但是通过计算,如果将隐藏图片转化为0、1的二进制信号,则数据量暴增为11790336,远远超过了载体的像素点127312,为解决此问题,则要么增大载体,要么缩减数据量,这里由于密文实为图像,而图像具有可缩放的性质,于是采用缩减数据量的方法,具体实现函数见附录的%information.m。
2.信息的加密和解密
要将图片信息进行加密,首先要能够将一个数字信息量加密,对于用LSB的方法来加密,主要是在较小量的情况下改变图片的像素点,从而来判断其隐含信息。
这里利用Matlab程序ste_cover(f1,f2,f3)=ste_cover(f1,f2,f3)-mod(ste_cover(f1,f2,f3),2)+msg(p,1);来建立顺序的奇偶关系。
我们都知道任意的数字信息都可以转化成0、1,那么要想加密数字信息,即是要加密0、1。
用上述办法可以将需要加密的信息量转化为0、1并保存于顺序的像素点中,同时这样还不会明显的破坏图片信息,使人视觉上无法察觉。
在解密信息时同样用Matlab程序判断其加密像素点的奇偶,从而判断其原值是0还是1。
具体实现如下:
ifmod(ste_cover(f1,f2,f3),2)==1
result(p,1)=1;fwrite(frr,result(p,1),'bit1');
else
result(p,1)=0;fwrite(frr,result(p,1),'bit1');
end
通过将数字5转化为0、1并存储在miwen.txt下,进行加密并解密的实验,得到结果为ans=
1010000000000000000000000000000
转化为十进制为5,证明了算法的可靠性。
3.图片的加密和解密
通过程序information.m将图片信息化并载入文件miwen.txt,并利用信息的加密和解密的方法便可以实现图片的加密和解密,具体的程序见附录的%LSBhide.m和%LSBget.m,下图为原始图像和隐藏信息的图片对比,通过肉眼无法辨别,我们可以认定其安全性是可以保证的。
我们假设传输过程中只有指定对象得到密钥
,这里的密钥即是信息长度len_total=122016,在指定对象没有的到密钥的时候,即使其得到了隐藏信息的图像,他也无法还原出加密的信息量,当得到len_total时,则可用程序LSBget.m将被加密的信息还原到mima.txt,并通过mima.txt的数组重建,来还原图片,效果如右图所示,具体图像重建的程序见附录%rebuilt.m。
通过观察可以看出为了提高安全性,却大大的缩减了图像还原的效率。
通过程序compare.m,具体实现见附录%compare.m,可以得到先后两张图像的灰度差值图,通过以下两幅灰度差值图可以大体判断出安全性和还原效率。
于是可以定义原图像和新图像的像素灰度差与原图像像素值的比例为图像安全性A和还原效率K。
通过程序:
W=imread('1.jpg');
E=imread('4.bmp');
W=double(W);
E=double(E);
total=0;
dt=0;
forz=1:
3
fory=1:
404
forx=1:
304
total=total+W(x,y,z);
dt=dt+abs(W(x,y,z)-E(x,y,z));
end
end
end
可算出K=1-dt/total=0.9021,A=1-dt/total=0.9986。
同样可以通过放大载体图片比例来进行加密,这样将增大K值,相反会缩小A值,过程类似,结果如下:
其中K=1,A=0.86,可以看出当安全性减小到0.86时,图片的还原效率可以达到100%。
但同时也导致载体图片放大了10倍。
六、模型的评估
通过此模型,可以很好的控制安全度和还原率,使用者可以根据需要进行相应的调节。
并且此模型最大的好处在于负载信息量大,还原度高,并且可以变型应用与多个方面的加密传输,不仅适用于密文加密传输,图片加密传输,甚至可以适用于音频等多媒体加密传输,应用前景广泛,但是由于算法本身的顺序性,所以导致相对安全性不高,为了加强安全性,这里提出改进方法。
原本信息量是按顺序加密的,为提高安全性可改为利用随机序列进行间隔控制,选择消息隐藏位,其中matrix为载体矩阵,row为伪随机输出的像素行标,col为伪随机输出的像素列标,key为密钥,count为要嵌入的信息数量,具体函数见附录%randinterval.m。
不过相应的要改变LSBhide.m和LSBget.m中的算法,增加伪随机数排序,这里LSBget.m为了和LSBhide.m中得到相同的序列,则必须有相同的密钥key和len_total,从而加强了算法的安全性。
具体算法改变如下:
%lsbhid.m函数中的改变
[row,col]=randinterval(ste_cover,len_total,key);%进行伪随机信息隐藏位的调取
fori=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);
ifp==len_total
break;
end
p=p+1;
end
%lsbget.m函数中的改变
[row,col]=randinterval(ste_cover,len_total,key);%进行伪随机信息隐藏位的调取,fori=1:
len_total
ifbitand(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
ifp==len_total
break;
end
p=p+1;
参考文献
【1】石红芹,谢昕.数字水印及其发展研究.[A]2004.02-63.
程序附录
%information.m
%本函数用于建立图片矩阵
J=imread('1.jpg');
%这里由于采取第一种方案,所以对信息量进行了缩减,即缩小10倍,当然也可以对负载量放大10倍,或进行优化处理,同时缩小信息量并放大负载量。
W=imresize(J,0.1);
fid=fopen('miwen.txt','w');
fwrite(fid,W,'int');
fclose(fid);
%LSBhide.m
%本函数将完成在LSB上的顺序信息隐秘
%input是信息隐蔽载体图像,为灰度BMP图
%file是秘密消息文件
%output是信息隐秘后生成的图像
%ste_cover是信息隐秘后图像矩阵
%len_total是秘密消息的长度,即容量
function[ste_cover,len_total]=Isbhide(input,file,output)
cover=imread('2.jpg');
ste_cover=cover;
ste_cover=double(ste_cover);
fid=fopen('miwen.txt','r');
[msg,len_total]=fread(fid,'ubit1');
[m,n,z]=size(ste_cover);
%判断信息量是否过大,如果过大则要调整负载图片,或信息图片
iflen_total>m*n
error('嵌入消息量过大,请更换图像');
end
p=1;
forf3=1:
z
forf2=1:
n
forf1=1:
m
ste_cover(f1,f2,f3)=ste_cover(f1,f2,f3)-mod(ste_cover(f1,f2,f3),2)+msg(p,1);
ifp==len_total
break;
end
p=p+1;
end
ifp==len_total
break;
end
end
ifp==len_total
break;
end
end
ste_cover=uint8(ste_cover);
imwrite(ste_cover,'3.bmp');
subplot(1,2,1);imshow(cover);title('原始图像');
subplot(1,2,2);imshow('3.bmp');title('隐藏信息的图像');
%LSBget.m
%本函数将完成提取隐秘于LSB上的秘密消息
%output是信息隐秘后的图像
%len_total是秘密消息的长度
%goalfile是提取出的秘密消息文件
%result是提取的消息
%
functionresult=Isbget(output,len_total,goalfile)
ste_cover=imread('3.bmp');
ste_cover=double(ste_cover);
[m,n,z]=size(ste_cover);
frr=fopen('mima.txt','w');
len_total=122016;
p=1;
forf3=1:
z
forf2=1:
n
forf1=1:
m
ifmod(ste_cover(f1,f2,f3),2)==1
result(p,1)=1;
else
result(p,1)=0;
end
ifp==len_total
break;
end
p=p+1;
end
ifp==len_total
break;
end
end
ifp==len_total
break;
end
end
fwrite(frr,result,'ubit1');
fclose(frr);
%rebuilt.m
%将解密的信息重新构建图片
fid=fopen('mima.txt','r');
W=fread(fid,'ubit32');
W=reshape(W,31,41,3)
%由于构建前对信息量缩小了10倍,这里要还原回去
W=imresize(W,10);
W=uint8(W);
imwrite(W,'4.bmp');
imshow('4.bmp');
%compare.m
%本函数完成显示隐秘前后两幅图像的区别
%original是原始载体图像
%hided是隐秘后的图像
%F是差值矩阵
functionF=compare(original,hided)
W=imread('2.jpg');
W=double(W)/255;
E=imread('3.bmp');
E=double(E)/255;
F=E-W;
imshow(mat2gray(F));
%randinterval.m
%本函数将利用随机序列进行间隔控制,选择消息隐藏位
%matrix为载体矩阵
%row为伪随机输出的像素行标
%col为伪随机输出的像素列标
%key为密钥
%count为要嵌入的信息数量(要选择的像素数量)
%
function[row,col]=randinterval(matrix,count,key)
[m,n]=size(matrix);
interval1=floor(m*n/count)+1;
interval2=interval1-2;
ifinterval2==0
error('载体太小不能将秘密信息隐藏进去');
end
rand('seed',key);
a=rand(1,count);
row=zeros([1count]);
col=zeros([1count]);
r=1;
c=1;
row(1,1)=r;
col(1,1)=c;
fori=2:
count
ifa(i)>=0.5
c=c+interval1;
else
c=c+interval2;
end
ifc>n
r=r+1;
ifr>m
error('载体太小不能将秘密信息隐藏进去');
end
c=mod(c,n);
ifc==0
c=1;
end
end
row(1,i)=r;
col(1,i)=c;
end