描述:将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平面分布情况
2、嵌入消息message.txt和提取消息secret.txt