matlab 基于奇偶校验的LSB隐藏水印 三种改进

基于奇偶校验的脆弱水印算法受到奇偶校验的局限,检验不出更改偶数次的攻击(有一半检测不出来)。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

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值