📄 20070707-165713.txt
字号:
标题:LSB信息隐藏算法
出处:soriq blog
时间:Tue, 01 May 2007 20:05:49 +0000
作者:admin
地址:http://www.gacia.cn/blog/read.php/118.htm
内容:
点击在新窗口中浏览此图片
http://www.gacia.cn/blog/a...
LSB信息隐藏算法,就是通常把信息隐藏在图像像素的最后一位,这时信息通常是文本。把文本化成二进制代码,然后把它嵌入到图像像素的最后一位。这样做的好处是对图片的损耗很小,肉眼几乎无法分辨。但是一旦图片改变,如大小、格式等发生变化,隐藏的信息也会随之丢失。这必须通过重传操作来解决。
基本算法概述:
a. 在rand('state',key) 由key初始化随机序列,并由randno=randperm(256*256)得到一个值小于等于256*256的非重复随机序列,由这个序列随机各个值选取信息隐藏的象素点。
b. 因为随机序列是不重复的,且顺序由key决定,故只要保证key不丢失,即使图像被截取,对方仍然无法破解隐藏的信息。
c. 由隐藏者向目标者提供key和隐藏信息的长度,目标者再用同样的算法破解和key解析图片,即可还原出信息。
本实验中载体为256×256的灰度图像。
function lsb_hide(info,foutain,output,key)
%foutain是载体
%info_file是待隐藏信息所在的文件
%output输出隐藏后的混合文件
%key是生成随即序列的关键字
cover=imread(foutain);
fid=fopen(info);
[m,n]=fread(fid,'ubit1');
%判断载体是否足够
if (n/8*9)>(256*256)
fclose(fid);
error('嵌入信息量过大.');
end
cover=imread(foutain);
%用key初始化并生成随即序列
rand('state',key);
randno=randperm(256*256);
%隐藏算法
for i=1:(n/8)
correct=0;
for j=1:8
%获取随即序列中的某一个值
value=randno((i-1)*8+j);
row=floor(value/256+1);
col=mod(value,256)+1;
cover(row,col)=bitset(cover(row,col),1,m((i-1)*8+j));
correct=m((i-1)*8+j)+correct;
end
correct=mod(correct,2);
row=floor(randno(256*256-i+1)/256+1);
col=mod(randno(256*256-i+1),256)+1;
cover(row,col)=bitset(cover(row,col),1,correct);
end
%写入文件
imwrite(cover,output);
fclose(fid);
function lsb_get(pfile,output,length,key)
%pfile是还原后的文件
%output隐藏信息的文件
%length是待提取信息的长度,即隐藏信息的位数=字节数*8
%key是密钥
n=length;
cover=imread(output);
rand('state',key);
randno=randperm(256*256);
fid=fopen(pfile,'w');
for i=1:(n/8)
correct=0;
for j=1:8
value=randno((i-1)*8+j);
row=floor(value/256+1);
col=mod(value,256)+1;
fwrite(fid,bitget(cover(row,col),1),'bit1');
correct=bitget(cover(row,col),1)+correct;
end
correct=mod(correct,2);
row=floor(randno(256*256-i+1)/256+1);
col=mod(randno(256*256-i+1),256)+1;
if correct~=bitget(cover(row,col),1)
fclose(fid);
error('校验出错,提取失败.');
end
end
fclose(fid);
Generated by Bo-blog 2.0.3 sp1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -