为了弥补传统密码技术的不足,我们依据新型的版权保护技术——数字水印,设计实现了一种基于空域的图像水印算法,提出了一种基于空域LSB算法的数字图像加密算法,该加密算法对不同的值对应的图像点像素进行不同的加密,然后根据给定的随机整数寻找加密结果的存放位置。
一、数字水印的基本理论
1、数字水印技术的定义和基本框架
数字水印(Digital Watermark)技术是将与多媒体内容相关或不相关的一些标示信息直接嵌入多媒体内容当中,但不影响原内容的使用价值,并不容易被人的知觉系统觉察或注意到。通过这些隐藏在多媒体内容中的信息,可以达到确认内容创建者、购买者,或者是否真实完整。数字水印是信息隐藏技术的一个重要研究方向。
图l展示了水印的嵌入过程,该系统的输入是水印信息W、原始载体数据I和一个可选的私钥/公钥K。其中水印信息可以是任何形式的数据,如随机序列或伪随机序列;字符或栅格;二值图像、灰度图像或彩色图像;3D图像等等。水印生成算法G应保证水印的唯一性、有效性、不可逆性等属性。
2、数字水印的分类
随着数字水印技术的发展,水印算法的分类方法繁多。
1)按水印发展来看,可分为第1代水印和第2代水印;
2)按嵌入的水印信号形式来分,可以分为一维水印和多维水印;
3)按嵌入方法可以分为可逆水印和不可逆水印;
4)按水印检测方法,可以分为盲水印和非盲水印;
5)按鲁棒性来分,可分为易脆水印、半易脆水印和鲁棒水印;
6)从外观上分类,可分为可见水印和不可见水印;
7)按载体分类,可分为图像水印、视频水印、音频水印和文档水印;
8)从水印的嵌入域来分,可分为空间域水印和变换域水印。
3、水印的攻击方法和对策
从数字水印的应用中可以看出,数字水印在认证、防盗版方面有重要的应用。然而,水印技术与密码术一样,是在不停的“攻”与“防”中不断发展的,因此,研究数字水印的攻击方法对于数字水印的发展有着重要的作用。按照攻击原理可以将攻击分为4类:简单攻击、同步攻击、削去攻击和混淆攻击。
二、水印嵌入算法
数字水印技术的学科特点在于它横跨图像处理、多媒体技术、模式识别、密码学、数字通信等多学科领域,以这些领域的算法、思想和概念为基础。一个数字水印方案一般总是综合利用这些领域的最新进展,各学科的学者们也提出了不尽相同的算法。针对静态图像压缩标准JPEG,在离散余弦变换基础上植入数字水印的研究成为热点;针对目前流行的视频压缩标准MPEG、H.263,Dittmann等提出了2种适用于空域和频域的算法例;1995年,Cox等在传统通信系统的基础上,提出了扩频水印的概念。这种方法较好地利用了人类视觉系统的特性,水印信息经过一定的调制过程隐藏于数字图像感知比较重要的频谱部分,从而可以抵抗有损压缩和其它数字图像处理操作;Xia,Zeng等做了基于离散小波变换的数字水印技术研究;Zhu等在DWT技术上,从编码角度做了一些研究;Pitas等在统计学和混沌的基础上,提出了一种新颖的算法;Wolfgang,schyndel等在其定义的m-序列基础上,提出了可以有效抵抗线性和非线性滤波以及JPEG有损压缩的数字水印植入算法;QU等以图形着色问题为基础,提出了2种有趣的数字水印技术;Kankanhalli等研究了基于图像内容的数字水印技术H1,这与计算机视觉的发展是密不可分的;在计算机图形学研究领域,1999年的SIGGRAPH大会上,Praun等提出了在造型的三维网格上植人数字水印的方法,Ohbuchi也做了类似的工作;Maes等提出了基于几何变形的方法;Paute等从分形压缩的角度提出了方法。此外,很多学者还提出了一些对数字水印进行攻击的方法,非常有助于鲁棒性要求很高的数字水印技术的研究。
1、空域算法
该类算法中典型的水印算法是将信息嵌入到随机选择的图像点中最不重要的像素(LSB:least significantbits)上,这可保证嵌入的水印是不可见的,但是由于使用了图像不重要的像素位,算法的鲁棒性差,水印信息很容易为滤波、图像量化、几何变形的操作破坏.另外一个常用方法是利用像素的统计特征将信息嵌人像素的亮度值中。
2、变换域算法
基于变换域的数字水印技术往往采用类似于扩频图像的技术来隐藏水印信息。这类技术一般基于常用的图像变换(基于局部或是全局的变换),这些变换包括离散余弦变换(DCT)、离散小波变换(DWT)、傅氏变换(DFT或FFT)、傅立叶一梅林(Fourie-Mellin)变换以及哈达马变换(Hadamard transform)等等。
三、数字图像加密算法之空域LSB
1、LSB算法介绍
采用直接改变图像中像素的最后4位bit值来嵌入秘密文件。由秘密文件的传输过程,可相应地分为3个阶段:嵌入过程、传播过程、抽取过程,就整体设计方案而言,可以用模型来概括。
待检测的载体信号( Signal)提取出的秘密信息提取秘密信息,秘密信息指要传送的要隐藏的信息,像、声音、文字等。
这是一种典型的空间域数据隐藏方法,L.F.Tumer与R.G.Van Schyndel等先后利用此方法将特定的标记隐藏于数字音频和数字图像内。以图像数据而言,一幅图像的每个像素是以多比特的方式构成的,在灰度图像中,每个像素通常为8位;在真彩色图像(RGB方式)中,每个像素为24比特,其中RGB三色各为8位,每一位的取值为0或1。在数字图像中,每个像素的各个位对图像的贡献是不同的。对于8位的灰度图像,每个像素的数字g可用公式表示为:
其中:i代表像素的第几位;幺表示第f位的取值,bi∈{o,l}。
这样,把整个图像分解为8个位平面,从LSB(最低有效位O)到MSB(最高有效位7)。从位平面的分布来看,随着位平面从低位到高位(即从位平面0到位平面7),位平面图像的特征逐渐变得复杂,细节不断增加。到了比较低的位平面时,单纯从一幅位平面上已经逐渐不能看出测试图像的信息了。由于低位所代表的能量很少,改变低位对图像的质量没有太大的影响。LSB方法正是利用这一点在图像低位隐藏入水印信息。
2、加密算法的实现
(1)利用MATLAB语言实现了在一个400x 533大小的灰度图“grayl.bmp”中隐藏了一个文本文件“gray2.bmp”,事实上,在该大小的位图中最大可隐藏的字符数为256x 256/8=8 192个,约汉字4000多个。由此可见,隐藏信息的容量非常大。加密算法具体如下:
1)嵌入秘密信息
第1步:读人载体文件,并显示它。
original_carrier-1 mread(’grayl.bmp‘);
carner=original_carrier;
subplot(2,3,1),imshow(carrier),title(’原始的载体图像’)
第2步:决定载体的LSB及嵌入的位数,采用嵌入图像中所有像素的最后4位;对载体图像做预处理,置其低4位相位为O;
carrierl=bitand(carner,254);
subplot(2,3,2),imshow(carrierl),title(‘载体图像低1位是0‘,见图4)
carrier2=bitand(carner,252);
subplot(2,3,3),imshow(carner/),title(’载体图像低2位是O‘,见图5)
camer3=bitand(carner,248);
subplot(2,3,4),imshow(carrier3),title(’载体图像低3位是O’,见图6)
carrier4=bitand(carrier, 240);
subplot(2,3,5),imshow(carrier4),title(‘载体图像低4位是0‘,见图7)
第3步:将秘密图像读人,并存储;并对秘密图像做预处理。
original_secret=imread(‘gray2.bmp‘);
secret =original_sec ret ;
subplot(2,3,3),imshow(secret),title(’原始的秘密图像’,见图8)
secret=bitand(secret, 240);
subplot(2,3,4),imshow(sec ret),title(’低4位为O的秘密图像‘,见图9)
secret=bitshift(secret,-4);
第4步:将处理后的秘密图像嵌入到载体中,并且显示隐藏后的最终结果。
carrier=bitor(carrier, secret) ;
subplot (2,3,5),imshow (carrier),title(’隐藏后的载体图像’)
imwrite (carrier, 'd: \l_imagehide.bmp') 。
(2)读取秘密信息
第1步:读人含有秘密文件的图像;
carner=imread(’d:\l_imagehide.bmp’);
第2步:输出隐藏后的文件,并提取秘密图像;将秘密图像像位左移4位,显示提取后的秘密图像见图11。
A=bitand(carner,15);
A=bitshift (A,4);
subplot(2,3,6)!imshow (A),title(’提取的隐藏图像’)。
2)实验2利用MATLAB语言实现了在一个400x 533大小的彩色图“rgbl.jpg"中隐藏了一个文本文件“gray2.bmp",将秘密信息隐藏到JPG彩色图像的B层中。并成功提取隐藏的信息,完成信息隐藏。
第1步读入载体文件,并显示它。
original_carrier=imread ( 'rgbl.jpg' )
original_secret-imread 'gray2.bmp')
data=original_carrier;
carrier=original_carrier;
subplot (3,3,1),imshow (carrier),title(‘原始的载体图像’)
secret=originaLsecret;
第2步读取RGB图像的B层,显示B层的载体图像,置载体图像低4位是O,并显示它。
carner=carrier(: , : ,3);
subplot(3,3,2),imshow(carner),title(’B层的载体图像’)
carrier=bitand(carner,240);
subplot(3,3,3),imshow(carrier),title(’置低4位为O的载体图像‘)
第3步显示原始的秘密图像,置秘密图像低4位是O,并显示它,再把秘密图像高4位右移。
subplot(3,3,4),imshow(secret),title(’原始的秘密图像’)
secret=bitand (secret, 240);
subplot(3,3,5),imshow(secret),title(‘置低4位为0的秘密图像‘)
secret=bitshift(secret, -4);
第4步将秘密信息隐藏到载体的B层,并显示隐藏后的图片。
carrier=bitor(carrier,secret);
subplot (3,3,6),imshow(carner),title(‘隐藏在B层的载体图像’)
data(: , : , 3) =carrier;
subplot(3,3,7),imshow(data),title(’隐藏后的载体图像’)
第5步读人隐藏后的图片,并提取秘密信息。
A=imread(’d:\2_imagehide.bmp');
subplot (3,3,8),imshow (A),title(’读人隐藏后的载体图像‘)
row, col, rgbl=size (A);
A=A(:,:,3);
A=bitand (A. 15);
secret=bitshift (A, 4);
subplot (3,3,9),imshow(secret),title(’提取之后的隐藏图像’)
figure, imshow (original_carrier),title(’原始的载体图像’)
figure, imshow (data),title(’隐藏后的载体图像‘)
3、评价
LSB算法,就是通常把信息隐藏在图像像素的最后几位,这时信息通常是文本。把文本化成二进制代码,然后把它嵌人到图像像素的最后几位,这样做的好处是对图片的损耗很小,肉眼几乎无法分辨,该算法实现起来比较简单,且不可见性好,而且抵抗剪切和JPEG压缩的能力较强,算法的时间复杂度较低,加密效果较好,安全性较高;但鲁棒性差,轻微的噪音和压缩就有可能破坏水印,而且算法一旦被发现,敌手就可以轻易改变水印信息。
小知识之LSB加密算法
LSB(LeastSignificant Bits)加密算法:将秘密信息嵌入到载体图像像素值的最低有效位,也称最不显著位,改变这一位置对载体图像的品质影响最小。