美文网首页
LSB随机替换嵌入与提取实现

LSB随机替换嵌入与提取实现

作者: Virony_ne | 来源:发表于2016-06-28 09:40 被阅读1061次

    描述:将message.txt中的明文消息随机嵌入到载体图像中,得到载密图像。从载密图像中将消息提取出来,放至文件secret.txt中。

    一:代码

    %LSB随机替换的嵌入与提取实现--2016年6月28日
    %输入:载体图像C、秘密消息M,密钥k
    %显示:载体图像C、载密图像C_M、LSB位平面C_C
    %使用的子函数有:lsbRhide和lsbRget
    
    C='Lena.bmp';
    M='message.txt';
    k=100;
    %读取载体图像
    C1=imread(C);
    
    %嵌入消息,使用函数lsbRhide
    [C_M,C_C,L]=lsbRhide(C,M,k);
    
    %将载密图像保存到Lena_R.bmp中
    imwrite(C_M,'Lena_R.bmp','bmp');
    
    %提取消息,使用函数lsbRget
    lsbRget('Lena_R.bmp',L,k);
    
    %结果展示
    subplot(1,3,1);imshow(C1);title('载体图像','FontSize',20);
    subplot(1,3,2);imshow(C_M);title('载密图像','FontSize',20);
    subplot(1,3,3);imshow(mat2gray(C_C));title('LSB平面分布情况','FontSize',20);
    

    随机间隔子函数:randinterval.m

    %随机间隔法--2016年6月25日
    %算法描述:
    %输入:载体图像C、嵌入信息长度L、密钥k
    %输出:嵌入位置的行向量row、列向量col;
    %步骤:
    %1、读取图像矩阵C,并且读出图像C的大小m*n,计算总体像素个数N
    %2、计算间隔k1和k2,k1=floor(N/L),k2=k1-2;
    %3、用密钥k产生一个长度为L的随机序列a;
    %4、设置长度均为L的行向量row和列向量col,用来保存嵌入位置,第一个位置都为1
    %5、设置两个变量r、c存放当前嵌入位置,并初始化值都为1
    %6、循环从2到L,若随机数a(i)>0.5,则c=c+k1;否则c=c+k2;
    %    判断c>n?,若大于,则r=r+1(换行)若r>m?,则输出载体图像太小;
    %    c=mod(c,n);若c==0,则c=n(最后一个位置),将展示的r和赋给向量row和col中保存
    %----------------------------------------------------------------------------------
    %函数说明:
    %输入:载体C,嵌入长度L,密钥k
    %输出:嵌入位置对应的行向量和列向量row、col
    %函数功能介绍:随机间隔法找出嵌入位置
    
    
    function [row,col]=randinterval(C,L,k)
    
    %读取图像矩阵,并计算矩阵大小和像素个数
    C=imread(C);
    [m,n]=size(C);
    N=m*n;
    
    %计算随机间隔k1和k2
    k1=floor(N/L);
    k2=k1-2;
    
    %产生一个长度为L的随机序列
    rand('seed',k);
    a=rand(1,L);
    
    %设置row和col、r和c
    row=zeros(1,L);
    col=zeros(1,L);
    r=1;
    c=1;
    row(1,1)=r;
    col(1,1)=c;
    
    %设置嵌入位置
    for i=2:L
        if a(i)>0.5 
            c=c+k1;
       else
        c=c+k2;
       end
      if c>n
           r=r+1;%行数加1
           if r>m
                 error('载体图像太小不能将秘密信息隐藏进去!')
           end
           c=mod(c,n);
           if c==0
                c=1;%进入下一行的第一列
           end
       end
    row(1,i)=r;
    col(1,i)=c;
    end
    

    消息嵌入子函数:lsbRhide.m

    %LSB随机替换嵌入算法-2016年6月26
    %输入:载体图像C、密钥k、秘密消息M
    %输出:载密图像C_M、C_C
    %输入输出格式:   [C_M,C_C,L]=lsbRhide('Lena.bmp','message.txt',100)
    %步骤
    %1、读取图像、并且对载密图形赋空间C_M
    %2、读取秘密消息文本并转化为二进制,并保存到向量M中,记录二进制长度L
    %3、利用randinterval函数找到嵌入位置[row col]=randinterval(C,L,K)
    %4、将二进制嵌入到相应指定的嵌入位置
    %      具体方法为 i=1:L
    %      C_M(row(i),col(i))=C1(row(i),col(i))-mod(C1(row(i),col(i)),2)+M1(i,1)
    %5、查看LSB平面分布情况
    %6、画图展示结果
    
    function [C_M,C_C,L]=lsbRhide(C,M,k)
    C1=imread(C);
    C_M=C1;
    C_C=C1;
    
    %读取秘密消息文件
    fileID=fopen(M,'r');
    [M1,L]=fread(fileID,'ubit1');
    
    %利用randinterval函数找到嵌入位置
    [row,col]=randinterval(C,L,k);
    
    %将二进制嵌入到相应指定的嵌入位置
    for i=1:L
        C_M(row(i),col(i))=C1(row(i),col(i))-mod(C1(row(i),col(i)),2)+M1(i,1);
    end
    
    %查看LSB平面分布情况
    [m,n]=size(C1);
    for i=1:m
        for j=1:n
            C_C(i,j)=C_M(i,j)-C1(i,j);
       end
    end
    
    % %保存载密图像
    % imwrite(C_M,'Lena_R.bmp','bmp');
    
    % %画图展示结果
      % subplot(1,2,1);imshow(C_M);title('载密图像','FontSize',20);
      % subplot(1,2,2);imshow(mat2gray(C_C));title('LSB平面分布情况','FontSize',20);
    % 
    

    消息嵌入子函数:lsbRget.m

    %LSB随机替换提取--2016年6月27日
    %输入:载密图像C_M、密钥k、嵌入消息长度L
    %输出:秘密消息S
    %输入输出格式: S=lsbRget('Lena_R.bmp',L,100)
    %步骤:
    %1、读取图像内容
    %2、获取嵌入位置 row、col
    %3、将嵌入位置消息存放到S中
    %4、将二进制化为ASCII码
    %5、打开文件,将消息S写入secret文件中
    %---------------------------------
    % C_M='Lena_R.bmp';
    % L=12288;
    % k=100;
    %------------------------------------
    
    function S=lsbRget(C_M,L,k)
    %读取图像矩阵
    C_M1=imread(C_M);
    
    %获取嵌入位置row、col
    [row,col]=randinterval(C_M,L,k);
    
    %将嵌入位置消息存放到S中
    S=zeros(1,L);
    for i=1:L
         S(1,i)=mod(C_M1(row(i),col(i)),2);
    end
    
    %将二进制化为ASCII码值
    SC=zeros(1,L);
    a=L/8;
    for i=1:a
         for j=1:8
              SC(1,i)=SC(1,i)+S(1,(i-1)*8+j)*power(2,(j-1));
        end
    end
    
     %打开文件,将消息写入secret.txt文件中
    fileID=fopen('secret.txt','w');
    for i=1:a
         fwrite(fileID,SC(1,i),'char');
    end
    fclose(fileID);
    

    二、实验结果展示
    1、载体图像、载密图像、LSB平面分布情况

    Paste_Image.png

    2、嵌入消息message.txt和提取消息secret.txt

    Paste_Image.png

    相关文章

      网友评论

          本文标题:LSB随机替换嵌入与提取实现

          本文链接:https://www.haomeiwen.com/subject/sdhtjttx.html