数字水印技术涉及多个学科知识,其中主要包括图像存储处理原理,密码学。
数字图像在计算机里的储存,从结构上讲,分为位图和矢量图。在位图中,图像由许多的屏幕小点组成,这些小点对应显存中的“位”,“位”决定了像素的图形属性,如像素的颜色、灰度、明暗对比度等。当一个像素所占的位数多时,它所能表现的颜色就更多、更丰富,图像的色彩就更艳丽,分辨率就更高。
密码学是研究编制密码和破译密码的技术科学。它包括密码编码学和密码分析学。数字水印中经常会用到一些经典的算法,最著名也是最成熟的公钥密码算法,基础是数论的互素数、指数模和模逆元计算。
粗略来看,数字水印系统包含嵌入器和检测器两大部分。嵌入器至少具有两个输入量:一个是原始信息,它通过适当变换后作为待嵌入水印信号;另一个就是要在其中嵌入水印的载体作品。水印嵌入器输出结果为含水印的载体作品,通常用于传输和转录。之后这件作品或另一件未经过这个嵌入器的作品可以作为水印检测器的输入量。
公钥密码算法RSA
这种算法出现于1978 年,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。RSA 的安全性依赖于大数分解。公钥和私钥都是两个大素数(大于100个十进制位)的函数。据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积。
为了计算两个密钥,给定两个大素数,p和q,并计算。
计算: n=p*q、 r=(p-1)*(q-1)。然后随机选择加密密钥e,要求e和r互质,即互素数。再然后,利用欧几里得(Euclid)扩展算法计算解密密钥d,它满足e*d=1(modr)。其中,e即为公钥,d即为私钥。e和n是公开的,p和q在加解密过程中不再需要,但绝不能泄露,应该丢弃。给定加密信息(明文) m (二进制表示)时,首先把m分成等长数据块m1,m2,…,mi,块长s, 其中s应小于n的位数,对应的加密密文是:ci =mi^e(modn)。得到相应的密文块,加密后的密文m由相同长度的密文块ci组成。解密时作如下计算:mi=ci^d(modn)。
破译者要解密,就要根据已知的e和n,计算d。而要计算d,应如道1,因而必须知道p和q。但是,如果n是一个60位的大整数,如何能在有生之年将它分解为两个索数因子呢,据研究,目前最快的计算机也无法做到。这就是RSA的安全性所依赖的。
目前,RSA 的一些变种算法已被证明等价于大数分解。不管怎样,分解是最显然的攻击方法。现在,人们已能分解140多个十进制位的大素数。因此,模数n必须选大-一些, 因应就具体适用情况而定。
数字图像置乱技术
数字图像置乱即是一种加密方法,合法使用者可以自由控制算法的选择,参数的选择以及使用随机数技术,达到非法使用者无法破译图像内容的目的。对于数字化的图像,置乱过程不仅可以在数字图像的空域(色彩空间、位置空间)上进行,还可以在数字图像的频域上进行。数字图像置乱即是对数字图像的一种加密方法,它使得合法使用者可以自由控制算法的选择、参数的选择以及使用随机数技术,这就给攻击者带来非法破译的难度,主要表现在统计分析各种可能的组合的巨大计算量。
数字图像的置乱变换就是一种可逆变换,通过对数字图像的位置或灰度级等做变换,来扰乱图像,以达到在一定程度上迷感第三者的目的。如果不知道所使用的置乱变换算法,很难恢复出原始图像。
size=512;N=32;K=8; D=zeros(size);E=0.01;%原图像512*512,8位灰度图像,水印嵌入个数:32
I=imread('C:\1.bmp');%原始图像路径
subplot(2,2,1);%函数用于绘制多个图形,两行两列,放到第一个格的位置
imshow(I);%显示图像,i=1时是白色,i=0时黑色
title('原始图像');
I=double(I)/512;
%读入水印
J=imread('C:\40.bmp'); %水印图像路径
subplot(2,2,2);%放到第二个格
imshow(J); %显示图像
title('水印图像');
%对水印缩放
J=double(imresize(J,[64,64])%将水印图片缩放为64*64像素
subplot(2,2,3);%放到第三个格
imshow(J); %显示图像
title('缩放水印图像');
%嵌入水印
for p=1:size/K %p从1到512循环
for q=1:size/K %q从1到512循环
x=(p-1)*K+1; y=(q-1)*K+1;
I_dct=I(x:x+K-1,y:y+K-1);
I_dct1=dct2(I_dct);%对每个块进行二维离散余弦变换取相应元素保存到块中
if J(p,q)==0 alfa=-1;
else alfa=1;%向坐标中的对象添加透明度
end
I_dct2=I_dct1+alfa*E;
I_dct=idct2(I_dct2);
D(x:x+K-1,y:y+K-1)=I_dct;
end
end
subplot(1,3,3);
imshow(D,[]);
title('含水印的图象');
%%%%%%对加入水印的图像进行低通滤波攻击
hh=fspecial('gaussian',3,0.2);
%hh=fspecial('gaussian',3,0.4);%创建预定义的滤波算子,高斯低通滤波器,模板尺寸3*3,标准差0.4(像素)
QQ=filter2(hh,D);
% 提取水印
for p=1:size/K %p从1到512循环
for q=1:size/K %q从1到512循环
x=(p-1)*K+1;
y=(q-1)*K+1;
I1=I(x:x+K-1,y:y+K-1);
I2=QQ(x:x+K-1,y:y+K-1);
I_dct1=dct2(I1);
I_dct2=dct2(I2); %对其本身进行反二维离散余弦变换
if I_dct2>I_dct1 W(p,q)=1;
else W(p,q)=0;
end
end
end
figure,subplot(1,2,1);imshow(R,[]);title('低通滤波攻击');
subplot(1,2,2);imshow(W,[]);title('图像中提取的水印')