描述:將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