美文网首页
LSB顺序替换嵌入与提取实现

LSB顺序替换嵌入与提取实现

作者: Virony_ne | 来源:发表于2016-06-27 20:01 被阅读1436次

    一:代码

    %LSB顺序替换嵌入和提取
    %输入:载体图像C,秘密消息M
    %显示:载体图像、载密图像、LSB平面分布情况
    %嵌入消息明文message.txt,提取消息为secret.txt
    
    C='Lena.bmp';
    M='message.txt';
    C1=imread(C);
    %调用嵌入函数lsbshide
    [C_M,C_C,L]=lsbshide(C,M);
    %调用提取函数lsbsget
    lsbsget('Lena_S.bmp',L);
    
    %画图展示
    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);
    

    调用的子函数:lsbshide.m

    % LSB顺序替换嵌入算法--2016年6月24日
    % 输入:载体C、秘密消息M。
    % 输出:载密图像C_M、位平面C_C
    % 1、将秘密消息M转化为二进制M1;
    % 2、将转化为二进制的秘密消息M1嵌入到载体图像的LSB平面
    %3、将载密图像C_M减去载体图像C,查看嵌入信息情况
    % ---------------------------------------------------
    % 函数功能介绍:实现LSB顺序替换嵌入
    % 使用示例:function      [C_M,C_C,L]=lsbshide('Lena.bmp','message.txt');
    %输入输入参数介绍:
    %C:载体图像
    %M:秘密消息
    %C_M:载密图像
    %C_C:lsb平面
    
    function [C_M,C_C,L]=lsbshide(C,M)
    C=imread(C);%读取图像并存放到C中
    C_M=C;
    fileID=fopen(M,'r');%打开文件
    [M,L]=fread(fileID,'ubit1');%读取文件的内容,并以二进制方式存放到向量M中
    
    %将二进制的秘密消息M嵌入到载密图像的LSB面
    [m,n]=size(C);
    p=1;%嵌入计数器
    for i=1:m
        for j=1:n
            C_M(i,j)=C(i,j)-mod(C(i,j),2)+M(p,1);%嵌入方法是先将LSB置零,然后加上秘密消息中的对应的0或1
            if L==p   %嵌入终止条件:当嵌入的个数为秘密消息的长度时,跳出循环,不再嵌入
             break;
            end
           p=p+1;
     end
     if L==p    %嵌入终止条件:当嵌入的个数为秘密消息的长度时,跳出循环,不再嵌入
        break;
     end
    end
    
    imwrite(C_M,'Lena_S.bmp','bmp');
    
     %查看嵌入信息情况:将载密图像减去载体图像
    for i=1:m
        for j=1:n
            C_C(i,j)=C_M(i,j)-C(i,j);
       end
     end
    

    调用子函数:lsbsget.m

    %LSB顺序替换提取--2016年6月27
    %输入:载密图像C_M,嵌入长度L
    %输出:秘密消息向量S
    %输入输出格式:S=lsbsget('Lena_S.bmp',L)
    %步骤:
    %1、读取载密图像C_M
    %2、读出LSB平面中0、1存入S中
    %3、将二进制向量S转化为ASCII码并存放到文本文件secret.txt中
    
    function S=lsbsget(C_M,L)
    %读取载密图像矩阵
    C_M1=imread(C_M);
    [m,n]=size(C_M1);
    S=zeros(1,L);
    %读出LSB平面中0、1存入S中
    for i=1:m
        for j=1:n
            if (i-1)*m+j>L%判断嵌入长度是否大于L,若大于L,则终止循环
                break;
            end
            S(1,(i-1)*m+j)=mod(C_M1(i,j),2);
        end
        if (i-1)*m+j>L%判断嵌入长度是否大于L,若大于L,则终止循环
             break;
        end
    end
    
    %将二进制向量S转化为ASCII码并存放到文本文件secret中
    fileID=fopen('secret.txt','w');
    a=L/8;%计算字符个数
    SC=zeros(1,a);
    for i=1:a
        b=0;
        for j=1:8
            b=b+S(1,(i-1)*8+j)*power(2,j-1);
        end
        SC(1,i)=b;
        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/tygzdttx.html