基于奇偶校验的脆弱水印算法受到奇偶校验的局限,检验不出更改偶数次的攻击(有一半检测不出来)。LSB有三个改进方向分别是:对嵌入过程中嵌入的方式进行更改;对嵌入水印的内容进行更改以及对水印嵌入前对水印进行预处理。
嵌入程序fragile.m在原有fragile的基础上增加返回了补余载体。fragile.m在读入原始水印和原始载体在后,先生成与原始载体同尺寸的全黑的初始补余载体。补余载体的矩阵值为原始载体高七位和对三取余的结果,返回两个载体完成嵌入。
提取程序infragile.m则先判断是否符合奇偶校验,然后再判断攻击后的图像高七位和对三取余的结果和补余载体的矩阵值是否相等,不等则存在篡改。
该改进方案利用补余水印存储了载体本身的部分特征(对三取余的结果)。对灰度图像偶数次篡改攻击(2,4,6,8次攻击,其中不可能出现八次攻击(全白到全黑),六次攻击的可能性也较小)后每个坐标对3取余的结果都将会发生变化。所有将对三取余的结果作为补充判断攻击发生的标准,能够大幅解决奇偶校验检测疏漏的问题。
可以看到嵌入水印与原始载体基本一致,补余载体中包含部分水印信息、提取载体完整。(原始载体为lena)
对比改进前后,改进后检测更为准确。(由于水印本身没有变化,这里使用之前的攻击篡改)
`
fragile.m
function [piccover,piccover2] = fragile1( piccover,M,N ) %piccover1载体,pic2ray水印,piccover2补余载体,M,N封面行列,m,n二值图行列
piccover2=zeros(M,N);%初始化补余载体
for i=1:M
for j=1:N
tmp = 0;
for k=2:8
tmp = tmp+bitget(piccover(i,j),k);
end
piccover2(i,j) = mod(tmp,3);
if mod(tmp,2) == 0
if mod(piccover(i,j),2) == 0
piccover(i,j) = piccover(i,j)+1;
end
else
if mod(piccover(i,j),2) == 1
piccover(i,j) = piccover(i,j)-1;
end
end
end
end
end
infragile.m
function pichidenew = infragile1(pichide1,pichide2,m,n)
pichidenew = ones(m,n);
for i=1:m
for j=1:n
tmp = 0;
for k=2:8
tmp = tmp+bitget(pichide1(i,j),k);
end
tmp1 = mod(tmp,3);
tmp = mod(tmp,2);
if bitget(pichide1(i,j),1)==tmp
pichidenew(i,j)=0;
else
pichidenew(i,j)=1;
end
if pichide2(i,j)~=tmp1
pichidenew(i,j)=0;
end
end
end
end
嵌入程序fragile.m在原有fragile的基础上增加了第二位作为345位与678位汉明距离的标记位。fragile.m在读入原始水印和原始载体在后,计算345与678位的汉明距离,先奇偶校验嵌入,后汉明校验嵌入。若汉明距离为0或1,则更改第二位为0,若第二位原本非0,则还需改变第三位使奇偶校验和不变。同理,若汉明距离为2或3,则更改第二位为1,若第二位原本非1,则还需改变第三位使奇偶校验和不变。完成嵌入。
提取程序infragile.m则先判断是否符合奇偶校验,然后再判断水印第二位是否对应目前图像的345与678位汉明距离(汉明距离为0或1,第二位等于0,反之等于1),不等则存在篡改。
该改进方案计算345与678位的汉明距离,结果有0123四种情况。由于需要排除奇偶校验中偶次改变不能被检测出的情况,只用将汉明距离0或1和汉明距离2或3两两分组(汉明距离变化奇数次的情况原本奇偶校验就能检测出),若汉明距离为0或1,则更改第二位为0,若第二位原本非0,则还需改变第三位使奇偶校验和不变。同理,若汉明距离为2或3,则更改第二位为1,若第二位原本非1,则还需改变第三位使奇偶校验和不变。检测过程中需要在奇偶校验检测的基础上,判断水印第二位是否对应目前图像的345与678位汉明距离,若不能对应,则说明出现偶数次篡改攻击,将不满足判别的位置标记出。
在新生成的水印上进行篡改,可以看到改进后的提取信息效果更好
fragile.m
function piccover = fragile2(piccover,M,N ) %piccover封面,pic2ray二值图,M,N封面行列,m,n二值图行列
for i=1:M
for j=1:N
tmp = 0;
hm = 0;
for k=2:8
tmp = tmp+bitget(piccover(i,j),k);
end
if (bitget(piccover(i,j),3)~=bitget(piccover(i,j),6))
hm = hm+1;
end
if (bitget(piccover(i,j),4)~=bitget(piccover(i,j),7))
hm = hm+1;
end
if (bitget(piccover(i,j),5)~=bitget(piccover(i,j),8))
hm = hm+1;
end
if mod(tmp,2) == 0
if mod(piccover(i,j),2) == 0
piccover(i,j) = piccover(i,j)+1;
end
else
if mod(piccover(i,j),2) == 1
piccover(i,j) = piccover(i,j)-1;
end
end
if (hm==0||hm==1)
hm2 = 0;%第二位改为0,更改第三位保持奇偶校验不变
if (bitget(piccover(i,j),2)~=0)
piccover(i,j) = piccover(i,j)+6;
end
else
hm2 = 1;
if (bitget(piccover(i,j),2)~=1)
piccover(i,j) = piccover(i,j)+6;
end
end
end
end
end
infragile.m
function pichidenew = infragile2(pichide,m,n)
pichidenew = ones(m,n);
for i=1:m
for j=1:n
tmp = 0;
hm = 0;
if (bitget(pichide(i,j),3)~=bitget(pichide(i,j),6))
hm = hm+1;
end
if (bitget(pichide(i,j),4)~=bitget(pichide(i,j),7))
hm = hm+1;
end
if (bitget(pichide(i,j),5)~=bitget(pichide(i,j),8))
hm = hm+1;
end
for k=2:8
tmp = tmp+bitget(pichide(i,j),k);
end
tmp = mod(tmp,2);
if bitget(pichide(i,j),1)==tmp
pichidenew(i,j)=0;
else
pichidenew(i,j)=1;
end
if (hm==0||hm==1)
if bitget(pichide(i,j),2)~=0
pichidenew(i,j)=0;
end
else
if bitget(pichide(i,j),2)~=1
pichidenew(i,j)=0;
end
end
end
end
end
嵌入程序fragile.m使用双奇偶校验位,第二位作为高六位的奇偶校验位,第一位则用于高7位的奇偶校验位。第一位作为第二位的辅助判断为,只有在第二位发生变化时(ifchange==1)才做修改。
提取程序infragile.m则先判断是分别判断第二第一位是否满足奇偶校验。
该改进方案用第二位作为高六位的奇偶校验为,且存在高七位有偶数次更改无法判别的情况,再通过最低位进行补充判断是否符合奇偶校验,进一步提升了奇偶校验的准确性。
在新生成的水印上进行篡改,可以看到改进后的提取信息效果更好
Fragile.m
function piccover = fragile( piccover,M,N ) %piccover封面,pic2ray二值图,M,N封面行列,m,n二值图行列
for i=1:M
for j=1:N
tmp = 0;
ifchange = 0;
for k=3:8
tmp = tmp+bitget(piccover(i,j),k);
end
if mod(tmp,2) == 0
if mod(piccover(i,j),4) == 0||mod(piccover(i,j),4) == 2
piccover(i,j) = piccover(i,j)+2;
ifchange = ifchange+1;
end
else
if mod(piccover(i,j),4) == 1||mod(piccover(i,j),4) == 3
piccover(i,j) = piccover(i,j)-2;
ifchange = ifchange+1;
end
end
for k=2:8
tmp1 = tmp1+bitget(piccover(i,j),k);
end
if mod(tmp1,2) == 0
if mod(piccover(i,j),2) == 1 && ifchange==1
piccover(i,j) = piccover(i,j)-1;
end
else
if mod(piccover(i,j),4) == 0 && ifchange==1
piccover(i,j) = piccover(i,j)+1;
end
end
end
end
end
Infragile.m
function pichidenew = infragile(pichide,m,n)
pichidenew = ones(m,n);
for i=1:m
for j=1:n
tmp = 0;
for k=3:8
tmp = tmp+bitget(pichide(i,j),k);
end
tmp = mod(tmp,2);
if bitget(pichide(i,j),2)==tmp
pichidenew(i,j)=0;
else
pichidenew(i,j)=1;
end
for k=2:8
tmp1 = tmp1+bitget(pichide(i,j),k);
end
tmp1 = mod(tmp1,2);
if bitget(pichide(i,j),1)==tmp1
pichidenew(i,j)=0;
else
pichidenew(i,j)=1;
end
end
end
end