图片保密传输
摘要:当今时代,随着通信工具的普及,网络传输变得越来越普及,人们可以非常方便的将所需要的文字、音频、图像等在全球互联网的环境下进行传输,那么保证信息传输过程的安全也显得越来越重要,可以说密码学也逐渐从单纯的数学问题慢慢渗透进了其他各个行业,逐渐变成了一门具有综合性、特色性的科学技术学科。密码学的现实研究成果,特别是各国政府现用的密码编制及破译手段都具有高度的机密性。密码在图片保密传输中已经有很多的应用。本文在研究过程中借助Matlab软件应用LSB算法对图片进行加密,并以另一张图片作为载体进行传输,以及再次利用LSB算法对图片进行解密并提取出原图,尽管整个过程显得比较简单,但是本题中运输过程中较大的负载量导致运输过程中的安全性降低,本题就此安全性的问题提出了能够提高其安全性的随机算法来实现目标亦即加强保密性来针对现有问题。
关键字: LSB 图片保密传输 数学建模 矩阵密码 Hénon混沌序列
图一
- 问题重述
对于上述两幅图片,安全起见,需要将图片(1)隐藏在图片(2)中进行传输,并且要求在信息传输过程中信息被破译的概率小于5%。
(1)试建立信息加密的数学模型与方法;
(2)试建立信息解密的数学模型与方法;
(3)对上面二幅图片完成加密-传送-接收-解密的全过程,并进一步设计程序,给出良好的界面;
(4)试对加密图和解密图进行比较和检测,给出检测效率的定量估计方法。
二、模型假设
1.假设图片的变动在人眼无法辨别的情况下视为安全。
2.假设传输过程中只有指定对象得到密钥。
3.假设图片在正常情况下不失真而进行图片缩放。
三、符号说明
LSB | Least Significant Bit最低有效位 |
cj | 载体像素 |
mi | 密文0、1信息量 |
A | 安全性 |
K | 还原效率 |
dt | 灰度像素数值总差值 |
total | 像素数值和 |
四、模型的分析及建立
本文根据题目中要求,借助Matlab 的工作原理将一张图片隐藏到另外一张图片之中,将图像转化成数据,并借助该软件来读取数据。比如说一个彩色图像就是一个三维矩阵,通过imread命令来读取一副图像,那么其对应的矩阵就会在workspace中得到体现,尽管如此,三维数组却不能如此操作。传统意义上将三维数组分成了三个面,依次对应于RGB三原色,那么面中的数据就对应了这三种颜色的强度值。本文根据实际情况假设所得矩阵
为三维矩阵
代表红颜色的2维矩阵,
代表绿颜色的2维矩阵,
代表蓝颜色的2维矩阵,第一第二维取值在0-255(2^8 1byte),第三维是1-3。[1]
隐藏信息的主要分类为以下两种:
其一,空间域隐秘技术包括:LSB方法、拼凑方法、文档结构微调方法
其二,变换域隐秘技术包括:DCT变换,小波变换,傅立叶变换,Fourier-Mellin变换或其它变换
上述图片显示出图像信息量较大则相对而言选择比较LSB方法,采用LSB替换 :嵌入过程包括选择一个载体元素的子集{cj1,…,cjl(m)},然后在子集上执行替换操作 cji←→mi,即把cji的LSB与mi进行交换(mi可以是1或0)。
这是一种典型的空间域数据隐藏算法,L. F. Tumer 与R. G. Van Schyadel等先后利用此方法将特定的标记隐藏于数字音频和数字图像,该方法是利用原始数据的最低几位来隐藏信息,采用LSB方法尽管能够隐藏大量的信息,但是采用此方法实现的数字水印不能够承受住一些无损和有损的信息处理,要是能够非常清楚地知道水印隐藏在几位LSB 中,就可以很轻易的擦除或绕过【1】中的数字水印。
题目中要求在信息传输过程中信息被破译的概率小于5%,那么采用LSB方法是可以满足该条件的。
本文通过程序来判断该方法的是否合理:
首先将需要加密的图片保存为1.jpg,将载体图片保存为2.jpg,运行程序
W = imread('1.jpg');size(W) Z=imread('2.jpg');size(Z),
可以得到ans =304 404 3 ans =436 292 3,
根据计算可得需要加密的图像像素点有122816个,但是载体图像像素点有127312个。对于如此大的信息量,而要需要考虑精密度,处于安全的角度只能够舍弃精密度而选择信息量和保密性,综上所述选择LSB方法是比较明智的选择。
- 模型的求解
1.图片的信息化
LSB算法是将数字信息通过插入从而进行保密,那么本文中将需要隐藏的图片信息数字信息化并保存到文件中,即可达成目的。本文中借助Matlab中的imread函数可以很快地把图片信息转化为需要的数字信息,出于载体的安全性考虑,以及密文的操作难度考虑,使用imread函数不能独立完成信息化任务,将不会再考虑。[2]
本文中,图片的载体一般都是像素点,那么采取的办法就是通过改变其像素点的值来对文件进行加密,出于隐蔽性考虑,将所有的像素点的值的变动限制为0和1。采取这样的方法能够利用文件将图片信息转化为0、1轻易可读的文本文件,那么就可以将图片加密转化成为新的密文从而进行加密,就可以降低了加密过程中的难度。
上述过程中的方法显示,一旦将隐藏图片转化为0、1的二进制信号,数据量就会暴增为11790336,从而极大地超过了载体的像素点127312,而面对这样的问题只有两种方法,其一增大载体、其二缩减数据量,而本文中的密文为实际意义上的图像,针对图像的可缩放的性质,采用缩减数据量的方法解决问题,具体实现函数在附录中在此就不一一叙述。
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并保存于顺序的像素点中,而且这种方法不会图像本身造成破坏,极大程度上保存了图片的真实性,以下证明该种方法的真实可行性。[3]
在解密信息时借助Matlab代码运行程序来判断照片中的加密像素点的奇偶,进而能够判断出照片中加密的原值是0还是1。
具体方法如下所示:
if mod(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 =
1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
上述代码转化为十进制,就可以证明了上述用法是真实可靠且易于实施的。
3.图片的加密和解密
借助Matlab 软件来编写程序information.m可以将图片信息化并载入文件miwen.txt,同时利用信息的加密和解密的方法能够实现图片的加密和解密操作,具体的程序见附录,如下图所示的是原始图像和隐藏信息的图片对比,对于一般人来说无法通过肉眼来对其中的图像进行辨别,那么就可以认定其安全性是能够得到保证的。
|
本文中假设传输过程中是只有指定对象得到密钥,而上述代码中的密钥是信息长度len_total=122016,一旦指定的对象没有的到密钥,就算该代码可以得到隐藏信息的图像,得到这段代码的用户也不能够还原出加密的信息量,要想得到原始图像,只有当得到len_total时,才可以可用程序LSBget.m将被加密的信息还原到mima.txt,接着通过mima.txt的数组来重建,这样还原出的图片中显示的效果如右图所示,具体图像重建的程序在此就不一一介绍了,在附录中表述的非常详细。[4]
上述代码显示了如上操作可以提高隐藏量,但是在很大意义上jiangdi图像还原的效率。 本文中再次通过程序compare.m,来得到先后两张图像的灰度差值图,如下图所示就是大体上的安全性和还原效率差别。
那么很久上述代码能够定义出原图像和新图像的像素灰度差与原图像像素值的比例为图像安全性A和还原效率K。
编写Matlab程序如下所示:
W = imread('1.jpg');
E = imread('4.bmp');
W=double(W);
E=double(E);
total=0;
dt=0;
for z=1:3
for y=1:404
for x=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。
同理可得,经过上述Matlab 程序编写代码来放大载体图片比例来进行加密,就可以将增大K值,而缩小A值,过程类似,结果如下:
其中K=1,A=0.74,也就是,将安全性数值减小到0.86时,还可以完全复原图片但与此同时是的导致载体图片被放大了10倍。在一定意义上是可以考虑该操作,基于合理范围的考虑。
六、模型的评估
上述模型能够精准的控制好安全度以及还原率,用户可以根据实际情况来对上述模型进行对应的调节。
1.模型优点:
该模型的负载信息量较大,还原度高,而且能够适应变型应用与多个方面的加密传输,传输的内容的范围广泛且应用前景广泛。
2.模型缺点:
由于算法本身的顺序性导致相对安全性不高出于安全考虑依稀提出改进安全的改进措施。
因为原本信息量是按照顺序加密的,那么为了提高安全性可改为利用随机序列来对其进行间隔控制,选择消息隐藏位,其中的符号有matrix表示载体矩阵,row 表示伪随机输出的像素行标,col表示伪随机输出的像素列标,key表示密钥,count 表示即将嵌入的信息数量,具体应用的函数代码较为复杂故将其放在附录文件中。
基于上述模型的使用,再次改进LSBhide.m和LSBget.m中的算法,就可以增加伪随机数排序,在LSBget.m文件中为了能够得到和LSBhide.m中完全一样的序列,就需要具有相同的密钥key和len_total,在经过上述步骤的实施就可以增加算法的安全性。
改进算法代码如下所示:
%lsbhid.m函数中的改变
[row, col] = randinterval(ste_cover, len_total, key);%进行伪随机信息隐藏位的调取
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
%lsbget.m函数中的改变
[row, col] = randinterval(ste_cover, len_total, key); %进行伪随机信息隐藏位的调取, for i = 1:len_total
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 == len_total
break;
end
p = p + 1;
七、参考文献
[1] 宋来忠等,数学建模常用方法与实验,北京:科学出版社,2015年6月;
[2] 黄仿元.基于LSB的数字水印算法及MATLAB实现[J]. 现代机械, 2008(2):67-69.
[3]王春淋,武相军.基于分块置乱与扩散的分数阶混沌彩色图像加密算法[J].河南大学学报(自然科学版),2014,44(06):715-724.
[4]罗贤哲. 基于分数傅里叶变换和分数余弦变换的多图像及彩色图像加密算法[D].南昌大学,2012.
[5] 邹娟, 贾世杰. 基于LSB图像隐藏系统的设计与实现[J]. 计算机技术与发展, 2007, 17(5):114-116.
八、程序附录
%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);
%判断信息量是否过大,如果过大则要调整负载图片,或信息图片
if len_total > m*n
error('嵌入消息量过大,请更换图像');
end
p = 1;
for f3=1:z
for f2 = 1:n
for f1 = 1:m
ste_cover(f1, f2,f3) = ste_cover(f1, f2,f3) - mod(ste_cover(f1, f2,f3),2) + msg(p, 1);
if p == len_total
break;
end
p = p + 1;
end
if p == len_total
break;
end
end
if p == 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 是提取的消息
%
function result = 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;
for f3=1:z
for f2 = 1:n
for f1 = 1:m
if mod(ste_cover(f1, f2,f3), 2) == 1
result(p, 1) = 1;
else
result(p, 1) = 0;
end
if p == len_total
break;
end
p = p + 1;
end
if p == len_total
break;
end
end
if p == 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 是差值矩阵
function F = 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;
if interval2 == 0
error('载体太小不能将秘密信息隐藏进去');
end
rand('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:count
if a(i) >= 0.5
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;
end