描述:將message.txt中的明文消息隨機(jī)嵌入到載體圖像中古沥,得到載密圖像。從載密圖像中將消息提取出來(lái)址晕,放至文件secret.txt中致讥。
一:代碼
%LSB隨機(jī)替換的嵌入與提取實(shí)現(xiàn)--2016年6月28日
%輸入:載體圖像C仅仆、秘密消息M,密鑰k
%顯示:載體圖像C、載密圖像C_M垢袱、LSB位平面C_C
%使用的子函數(shù)有:lsbRhide和lsbRget
C='Lena.bmp';
M='message.txt';
k=100;
%讀取載體圖像
C1=imread(C);
%嵌入消息蝇恶,使用函數(shù)lsbRhide
[C_M,C_C,L]=lsbRhide(C,M,k);
%將載密圖像保存到Lena_R.bmp中
imwrite(C_M,'Lena_R.bmp','bmp');
%提取消息,使用函數(shù)lsbRget
lsbRget('Lena_R.bmp',L,k);
%結(jié)果展示
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);
隨機(jī)間隔子函數(shù):randinterval.m
%隨機(jī)間隔法--2016年6月25日
%算法描述:
%輸入:載體圖像C惶桐、嵌入信息長(zhǎng)度L撮弧、密鑰k
%輸出:嵌入位置的行向量row、列向量col姚糊;
%步驟:
%1贿衍、讀取圖像矩陣C,并且讀出圖像C的大小m*n救恨,計(jì)算總體像素個(gè)數(shù)N
%2贸辈、計(jì)算間隔k1和k2,k1=floor(N/L),k2=k1-2;
%3肠槽、用密鑰k產(chǎn)生一個(gè)長(zhǎng)度為L(zhǎng)的隨機(jī)序列a;
%4擎淤、設(shè)置長(zhǎng)度均為L(zhǎng)的行向量row和列向量col,用來(lái)保存嵌入位置秸仙,第一個(gè)位置都為1
%5嘴拢、設(shè)置兩個(gè)變量r、c存放當(dāng)前嵌入位置寂纪,并初始化值都為1
%6席吴、循環(huán)從2到L,若隨機(jī)數(shù)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(最后一個(gè)位置)搬设,將展示的r和賦給向量row和col中保存
%----------------------------------------------------------------------------------
%函數(shù)說(shuō)明:
%輸入:載體C穴店,嵌入長(zhǎng)度L,密鑰k
%輸出:嵌入位置對(duì)應(yīng)的行向量和列向量row焕梅、col
%函數(shù)功能介紹:隨機(jī)間隔法找出嵌入位置
function [row,col]=randinterval(C,L,k)
%讀取圖像矩陣迹鹅,并計(jì)算矩陣大小和像素個(gè)數(shù)
C=imread(C);
[m,n]=size(C);
N=m*n;
%計(jì)算隨機(jī)間隔k1和k2
k1=floor(N/L);
k2=k1-2;
%產(chǎn)生一個(gè)長(zhǎng)度為L(zhǎng)的隨機(jī)序列
rand('seed',k);
a=rand(1,L);
%設(shè)置row和col、r和c
row=zeros(1,L);
col=zeros(1,L);
r=1;
c=1;
row(1,1)=r;
col(1,1)=c;
%設(shè)置嵌入位置
for i=2:L
if a(i)>0.5
c=c+k1;
else
c=c+k2;
end
if c>n
r=r+1;%行數(shù)加1
if r>m
error('載體圖像太小不能將秘密信息隱藏進(jìn)去贞言!')
end
c=mod(c,n);
if c==0
c=1;%進(jìn)入下一行的第一列
end
end
row(1,i)=r;
col(1,i)=c;
end
消息嵌入子函數(shù):lsbRhide.m
%LSB隨機(jī)替換嵌入算法-2016年6月26
%輸入:載體圖像C斜棚、密鑰k、秘密消息M
%輸出:載密圖像C_M、C_C
%輸入輸出格式: [C_M,C_C,L]=lsbRhide('Lena.bmp','message.txt',100)
%步驟
%1弟蚀、讀取圖像蚤霞、并且對(duì)載密圖形賦空間C_M
%2、讀取秘密消息文本并轉(zhuǎn)化為二進(jìn)制义钉,并保存到向量M中昧绣,記錄二進(jìn)制長(zhǎng)度L
%3、利用randinterval函數(shù)找到嵌入位置[row col]=randinterval(C,L,K)
%4捶闸、將二進(jìn)制嵌入到相應(yīng)指定的嵌入位置
% 具體方法為 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、畫(huà)圖展示結(jié)果
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函數(shù)找到嵌入位置
[row,col]=randinterval(C,L,k);
%將二進(jìn)制嵌入到相應(yīng)指定的嵌入位置
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');
% %畫(huà)圖展示結(jié)果
% subplot(1,2,1);imshow(C_M);title('載密圖像','FontSize',20);
% subplot(1,2,2);imshow(mat2gray(C_C));title('LSB平面分布情況','FontSize',20);
%
消息嵌入子函數(shù):lsbRget.m
%LSB隨機(jī)替換提取--2016年6月27日
%輸入:載密圖像C_M删壮、密鑰k贪绘、嵌入消息長(zhǎng)度L
%輸出:秘密消息S
%輸入輸出格式: S=lsbRget('Lena_R.bmp',L,100)
%步驟:
%1、讀取圖像內(nèi)容
%2央碟、獲取嵌入位置 row税灌、col
%3、將嵌入位置消息存放到S中
%4亿虽、將二進(jìn)制化為ASCII碼
%5菱涤、打開(kāi)文件,將消息S寫(xiě)入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
%將二進(jìn)制化為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
%打開(kāi)文件粘秆,將消息寫(xiě)入secret.txt文件中
fileID=fopen('secret.txt','w');
for i=1:a
fwrite(fileID,SC(1,i),'char');
end
fclose(fileID);
二、實(shí)驗(yàn)結(jié)果展示
1坯认、載體圖像翻擒、載密圖像氓涣、LSB平面分布情況
2牛哺、嵌入消息message.txt和提取消息secret.txt