matlab LSB算法的三种改进

传统的LSB算法由于其变换规律非常明显,很容易被隐写分析检测到,因此需要改进算法提升其隐蔽性。LSB有三个改进方向分别是:对嵌入过程中嵌入的方式进行更改;对嵌入水印的内容进行更改以及对水印嵌入前对水印进行预处理。

利用补余载体更改LSB

方案

嵌入程序LSB.m在原有LSB的基础上增加返回了补余载体。LSB.m在读入原始水印和原始载体在后,生成与原始载体同尺寸的全黑的初始补余载体。水印和载体最低位相同时不变,最低位不同时做更改嵌入(与基础LSB算法相同),嵌入方式改为生成1或-1随机数,若随机数为1则更改原始载体,反之则更改补余载体,返回两个载体完成嵌入。
提取程序inLSB.m则需嵌入载体和补余载体的最低位加和对2取余求解,用改进后两部分载体最低位值的和改进前嵌入后载体水印的最低位值。

分析

该改进方案利用补余水印分散了原本嵌入后载体水印中包含的信息,嵌入水印后载体的水印不可见性进一步提升。同时,仅仅拿到嵌入水印载体的攻击者无法读出全部水印内容,因此抗攻击性也有加强。解密者需要同时拿到嵌入后水印和补余水印方可读出完整水印。

实验结果

可以看到嵌入水印与原始载体基本一致,补余载体中包含部分水印信息、提取载体完整。(原始载体为lena)

在这里插入图片描述

在这里插入图片描述
LSB.m

function  [piccover1,piccover2] = LSB2( piccover1,pic2ray,M,N,m,n ) %piccover1载体,pic2ray水印,piccover2补余载体,M,N封面行列,m,n二值图行列
piccover2=zeros(M,N);%初始化补余载体
if(m<=M&&n<=N)
    for i=1:m
        for j=1:n
            if pic2ray(i,j)==1&&mod(piccover1(i,j),2)==1     
                continue;
            elseif pic2ray(i,j)==0&&mod(piccover1(i,j),2)==0
                continue;
            else                     
                a=randsrc;           %a为1更改原始载体,反之更改补余载体
                if a==1
                    if piccover1(i,j)==0
                        piccover1(i,j)=piccover1(i,j)+1;
                    elseif piccover1(i,j)==255
                        piccover1(i,j)=piccover1(i,j)-1;
                    else
                        piccover1(i,j)=piccover1(i,j)+1;
                    end
                else
                    if piccover2(i,j)==0
                        piccover2(i,j)=piccover2(i,j)+1;
                    elseif piccover2(i,j)==255
                        piccover2(i,j)=piccover2(i,j)-1;
                    else
                        piccover2(i,j)=piccover2(i,j)+1;
                    end      
                end
            end
        end         
    end
else
    fprintf('载体对象大小不够!')
end
end

inLSB.m

function picjie = inLSB2(pichide1,pichide2,m,n)
picjie=zeros(m,n);
    for i=1:m
        for j=1:n
            if mod(mod(pichide1(i,j),2)+mod(pichide2(i,j),2),2)==1
                picjie(i,j)=255;
            else
                picjie(i,j)=0;
            end
        end
    end

end

利用密钥载体更改LSB

方案

嵌入程序LSB.m在原有LSB的基础上增加返回了密钥载体。LSB.m在读入原始水印和原始载体后,生成与原始水印同尺寸的初始密钥载体。按照原始水印大小每位生成随机数,若为1则将水印变换为与1的差值,反之则不变,随机数作为密钥保存在密钥载体中,根据更改后的水印按照原本LSB的方式进行更改,返回两个载体完成嵌入。
提取程序inLSB.m则需嵌入载体和密钥载体,先提取出最低位的加密后水印,再根据密钥载体的更改方式反解出原始水印。

分析

该改进方案利用密钥水印更改了嵌入水印的内容,水印内容的更改方式保存在密钥水印中,这个密钥每次加密都是随机生成的,每次的加密密钥都不相同。由于必须使用独立密钥才能完成水印的加解密,LSB水印的安全性提升。同时,缺少密钥的攻击者无法破解出全部水印,解密者需要同时拿到嵌入后水印和密钥水印方可读出完整水印。

实验结果

直接按照LSB提取结果无法得到水印,改进后提取可以得到水印。
在这里插入图片描述

在这里插入图片描述
LSB.m

function  [piccover,piccover2] = LSB1(piccover,pic2ray,M,N,m,n ) %piccover1载体,pic2ray水印,piccover2密钥载体,M,N封面行列,m,n二值图行列
piccover2=zeros(M,N);%初始化密钥载体
for i=1:m%随机生成密钥,水印内容更改
    for j=1:n
        tmp = randsrc;
        if (tmp==1)
            pic2ray(i,j)=1-pic2ray(i,j);
            piccover2(i,j)=1;
        else
            piccover2(i,j)=0;
        end
    end         
end
if(m<=M&&n<=N)
    for i=1:m
        for j=1:n
            if pic2ray(i,j)==1&&mod(piccover(i,j),2)==1
                continue;
            elseif pic2ray(i,j)==1&&mod(piccover(i,j),2)==0
                piccover(i,j)=piccover(i,j)+1;
            elseif pic2ray(i,j)==0&&mod(piccover(i,j),2)==0
                continue;
            elseif pic2ray(i,j)==0 && mod(piccover(i,j),2)==1
                piccover(i,j)=piccover(i,j)-1;
            end
        end         
    end
else
    fprintf('载体对象大小不够!')
end
end

inLSB.m

function picjie = inLSB1(pichide1,pichide2,m,n)
    for i=1:m
        for j=1:n
            if mod(pichide1(i,j),2)==1
                pichide1(i,j)=255;
            else
                pichide1(i,j)=0;
            end
        end
    end
    for i=1:m%按照密钥载体反解原始水印
        for j=1:n
            if pichide2(i,j)==1
                picjie(i,j)=1-pichide1(i,j);
            else
                picjie(i,j)=pichide1(i,j);
            end
        end
    end 
end

利用混沌序列加密更改LSB

方案

混乱预处理程序mass.m用于原始水印的预处理和提取lsb后的水印解密。
嵌入程序LSB.m读入的是处理后的水印和原始载体后,并按照原本LSB的方式进行最低位嵌入,返回两嵌入载体。提取程序inLSB.m提取出最低位的加密后水印,再通过mass.m中的混沌序列进行解密。

分析

该改进方案利用混沌序列进行了水印预处理,攻击者按照lsb解密后无法得到真实水印内容,水印的安全性提升。同时,缺少密钥的攻击者无法破解出全部水印,解密者需要同时拿到嵌入后水印和密钥水印方可读出完整水印。

实验结果

按照混沌序列解密提取后的水印得到原本水印。
在这里插入图片描述

在这里插入图片描述

mass.m

clear
x(1)=0.5;
for i=1:100*100-1
    x(i+1)=3.7*x(i)*(1-x(i));
end
[y,num]=sort(x);
pic1=double(rgb2gray(imread('data1.jpg')));
pic2=uint8(zeros(100,100));
for i=1:100*100
    pic2(i)=pic1(num(i));
end
imwrite(pic2, 'data2.bmp');%加密后保存供lsb嵌入使用
imshow(pic2);

pic1=double(imread('result2.bmp'));%读入lsb提取后的加密水印
pic3=uint8(zeros(100,100));
for i=1:100*100
    pic3(num(i))=pic2(i);
end
figure
imshow(pic3);

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值