LSB隨機替換嵌入與提取實現

描述:將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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容