信息隐藏

F5算法:

一、下载F5工具:

F5算法

F5是由德国著名学者Pfitzmann和Westfeld在2001年提出的一种隐写分析方法,是一种针对JPEG图像,可以提供较大的嵌入容量、抗卡方分析检测的隐写算法。

算法描述如下:

1、由用户输入的密码产生一组随机序列,利用该随机序列来随机选择量化DCT系数的非零交流系数。

2、对选中的DCT系数进行分组,每组包含2k-1个DCT系数,用以嵌入k比特秘密信息。

3、利用矩阵编码来嵌入信息。

二、进入dos界面

切换到F5安装路径下

 三、运行 e.bat 命令嵌入秘密信息,生成携密信息JPEG图片,如下图所示。

 

 五、运行 d.bat 命令提取秘密信息到 output.txt,如下图所示。

 六、根据路径C: oolsAHCJ269f5可以找到生成的output.txt文件,如下图所示。

 MP3信息隐藏:

MP3Stego是剑桥大学计算机实验室安全组开发的一个公开源代码的免费程序,它是在MP3上进行水印嵌入研究的最具有代表性的软件。MP3Stego是在将WAV 文件压缩成MP3的过程中,将水印嵌入到MP3文件中,嵌入数据先被压缩、加密,然后隐藏在MP3比特流中,默认输出的MP3格式是128bit,单声道的。 数字音频的频域信号在量化和编码时,存在量化误差。这个量化误差是一个不确定值,例如采用不同的心理声学模型可以导致不同的量化误差,并且这个量化误差如何取值可以在量化编码程序中进行调整设定。采用不同的量化误差可以导致不同的量化结果,并在一定程度上影响最后的音质。MP3Stego通过调节量化误差的大小,将量化和编码后的长度作为信息隐藏的方法,即长度为奇数代表信息1,长度为偶数代表信息0,从而将信息隐藏到最后的 MP3比特流中。因此,MP3Stego 可以说是一种量化编码信息隐藏方法

一、 下载MP3Stego:

进入dos界面,切换到MP3Stego

 二、把要隐藏的数据文件和要压缩的wav文件这两个文件放入与Encode.exe和Decode.exe同一个文件夹下。比如说载体文件的名称为s1.wav;秘密信息为hidden_text.txt文件(内容为"Hello world!”),加密后的MP3文件名为slout.mp3

进入Dos界面,编码同时嵌入秘密信息命令格式为:Encode -E 密文名称 载体名称 携密文件名称

例如:Encode.exe  -E  hidden_text.txt  sl.wav  slout.mp3

嵌入过程中需要输入密钥,密钥用于加密秘密信息。

 

注:加密后的slout.mp3的试听效果与s1.wav没有差别。

三、解密音频文件

打开DOS界面;命令格式为:Decode.exe  -X  携密文件名称

Decode.exe  -X s1out.mp3

提取工程中需要输入密钥,密钥用于解密秘密信息(此处的密钥必须与加密信息的相同)

 解码完成之后,生成slout.mp3.pcm文件以及slout.mp3.txt文件, 打开文件slout.mp3.txt,里面还是“Hello world!" 字样,和hidden_text.txt文件字样字样相同。得到的密码信息和隐藏的秘密信息完全相同。

 

二值图像信息隐藏:

二值图像又称为单色图像或黑白图像,一般用1或者0表示黑色或白色像素点,利用二值图像信息隐藏的方法主要是根据二值图像中黑白像素的数量的比较来隐藏信息。方法是把一个二值图像分成一系列矩形图像区域B,某个图像区域B中黑色像素的个数大于一半,则表示嵌入0;如果白色像素的个数大于一半,则表示嵌入1,但是当需要嵌入的比特与所选区域的黑白象素的比例不一致时,为了达到希望的像素关系,则需要修改一些像素的颜色。
该方法存在一定的缺陷,没有明确界定哪些像素可以修改以便于隐藏秘密信息,二值图像中某些像素的修改可能会引起二值图像视觉效果上的较大变化,相应的水印嵌入算法可能在较大程度破坏图像的质量。
为达到较好的隐藏效果,可以采用游程编码方法在二值图像中隐藏信息。游程编码的概念在图像压缩的过程中经常使用,0表示白色像素点,1表示黑色像素点。
秘密信息嵌入的时候修改二值图像的游程长度,如果秘密信息位是0,则修改该游程长度为偶数;如果为1,则修改游程长度为奇数;如果秘密信息的取值与游程长度的奇偶性相匹配,则不改变游程长度。提取的时候根据游程长度奇偶性提取出秘密信息。在隐藏信息的时候,改变游程的奇偶性是通过对下一个游程的第一个像素的像素值进行修改,因此当下一个游程的值为1的时候不能修改。修改后的游程长度不能隐藏信息,因此隐藏信息的位置是选取游程长度数组的偶数位来隐藏。

打开VMware虚拟机,进入windows xp系统:

嵌入秘密信息

源代码
binhiding.m  如下:
clc;
clear all;
msgfid=fopen('hidden.txt','r');%打开秘密文件
[msg,count]=fread(msgfid);
fclose(msgfid);
msg = str2bit(msg);
msg = msg';
count=count*8;
io=imread('hunter.bmp');%读入载体图像
watermarklen=count;%嵌入水印信息长度,也就是载体图像分块的数量值
[row col]=size(io);
l1=floor(row/watermarklen);%载体图像分块后的长度
l2=floor(col/watermarklen);%载体图像分块后的宽度
pixelcount=l1*l2;%每个分块总像素的数量值
percent=ceil(pixelcount/2);
iw=io;
ioblack(1,watermarklen)=0;%某一个分块中黑色像素的个数
iowhite(1,watermarklen)=0;%某一个分块中白色像素的个数
n=1;
while n<=watermarklen
for i=l1*(n1)+1:l1*n
for j=l2*(n1)+1:l2*n
if io(i,j)==0
ioblack(1,n)=ioblack(1,n)+1;%计算每个分块中的黑色像素的个数
else
iowhite(1,n)=iowhite(1,n)+1;%计算每个分块中的白色像素的个数
end
 
end
end
n=n+1;
end
n=1;
while n<=watermarklen
if msg(n,1)==1%需要嵌入1
if ioblack(1,n)>=percent; %嵌入1的时候,黑色像素比白色像素多,需要修改一些像素的颜色
modcount(1,n)=ioblack(1,n)
percent+1;
k=1;
for i=l1*(n1)+1:l1*n
for j=l2*(n1)+1:l2*n
if (iw(i,j)==0&&k<=modcount(1,n))
iw(i,j)=1;k=k+1;
end
end
end
end
else
if iowhite(1,n)>=percent; %嵌入0的时候,白色像素比黑色像素多,需要修改一些像素的颜色
modcount(1,n)=iowhite(1,n)
percent+1;
k=1;
for i=l1*(n1)+1:l1*n
for j=l2*(n1)+1:l2*n
if (iw(i,j)==1&&k<=modcount(1,n))
iw(i,j)=0;k=k+1;
end
end
end

 
end
end
n=n+1;
end
n=1;
iwblack(1,watermarklen)=0;%某一个分块中黑色像素的个数
iwwhite(1,watermarklen)=0;%某一个分块中白色像素的个数
while n<=watermarklen
for i=l1*(n1)+1:l1*n
for j=l2*(n1)+1:l2*n
if iw(i,j)==0
iwblack(1,n)=iwblack(1,n)+1;%计算每个分块中的黑色像素的个数
else
iwwhite(1,n)=iwwhite(1,n)+1;%计算每个分块中的白色像素的个数
end
end
end
n=n+1;
end
figure;
imshow('hunter.bmp');
imwrite(iw,'huntermarked.bmp');
figure;
imshow('huntermarked.bmp');

 2、提取秘密信息

提取秘密信息时,提取方需要知道隐藏的秘密信息的数量,使用隐藏隐藏的秘密信息的数量值来对载体图形进行分块。

源代码binextract.m 如下:
clc;
clear all;
wi=imread('huntermarked.bmp');%读入载体图像
[row col]=size(wi);
watermarklen=24;%嵌入的水印信息的长度
l1=floor(row/watermarklen);%载体图像分块后的长度
l2=floor(col/watermarklen);%载体图像分块后的宽度
pixelblack(1,watermarklen)=0;%某一个分块中黑色像素的个数
pixelwhite(1,watermarklen)=0;%某一个分块中白色像素的个数
n=1;
while n<=watermarklen
for i=l1*(n1)+1:l1*n
for j=l2*(n1)+1:l2*n
if wi(i,j)==0
pixelblack(1,n)=
pixelblack(1,n)+1;%计算每个分块中的黑色像素的个数
else
pixelwhite(1,n)=pixelwhite(1,n)+1;%计算每个分块中的白色像素的个数
end
end
end
n=n+1;
end
n=1;
while n<=watermarklen
if pixelwhite(1,n)>pixelblack(1,n) %如果白色像素块多于黑色像素块,秘密信息为
1
message(n,1)=1
else
message(n,1)=0 %如果黑色像素块多于白色像素块,秘密信息为
0
end
n=n+1;
end
%将提取的秘密信息转换成字符串
out=bit2str(message);
fid=fopen('message.txt', 'wt');

 
fwrite(fid, out)
fclose(fid);
从上图运行的结果来看,携秘载体在视觉效果上和原始载体有很大变化,通过不断修改
hidden.txt
文本的值来增加隐藏的信息容量。隐藏的信息越多,图像的分块就越细,隐藏
的效果就越好。
但是上述方案中修改像素的位置非常固定,都是修改每个图像块的
所有行前面的像素,这
样隐藏信息后的图像在视觉效果上和原始图像存在较大差别,违背了信息隐藏不改变视觉
效果这条最重要的原则。为改变上述算法,可以采用游程编码方法在二值图像中隐藏信息。
隐藏算法源代码
RLEhiding.m如下:
clc;
clear all;
oi=imread('hunter.bmp'); %打开载体图像
[row col]=size(oi);
oi=oi(:);
len=size(oi);
i=1;
i=1;
j=1;
%统计游程长度
while i<len(1)
or=oi(i,1);
c
ount=1;
while (i<len(1)&&oi(i+1,1)==or)
i=i+1;
count=count+1;
end
RLE(j)=count;
j=j+1;
i=i+1;
end
if i==len(1)

 
RLE(j)=1;
end
RLE=RLE';
msgfid=fopen('hidden.txt','r');%打开秘密文件
[msg,msgcount]=fread(msgfid);
fclose(msgfid);
msg = str2bit(msg);
msg = msg';
msgc
ount=msgcount*8;
for l=1:msgcount
modpoint=0;
for x=1:2*l
modpoint=modpoint+RLE(x,1);
end
if msg(l,1)==0
if ((mod(RLE(2*l,1),2)~=0)&&(RLE(2*1+1,1)~=1))
oi(modpoint+1,1)=mod((oi(modpoint+1,1)+1),2);
end
else
if ((mod(RLE(2*l,1),2)==0)&&(RLE(2*1+1,1)~=1))
oi
(modpoint+1,1)=mod((oi(modpoint+1,1)+1),2);
end
end
end
%统计修改后的游程长度
len=size(oi);
i=1;
j=1;
while i<len(1)
or=oi(i,1);
count=1;

 
while (i<len(1)&&oi(i+1,1)==or)
i=i+1;
count=count+1;
end
RLE1(j)=count;
j=j+1;
i=i+1;
end
if i==len(1)
RLE1(j)=1;
end
RLE1=RLE1';
m1=Vector2Matrix(oi,row);%将数组转换成为二位矩阵
imwrite(m1,'watermarked.bmp');
figure;
imshow('hunter.bmp');
figure;
imshow('watermarked.bmp');
3、提取算法源代码
RLEextract.m 如下:
clc;
clear all;
oi=imread('watermarked.bmp'); %打开携密图像
[row col]=size(oi);
oi=oi(:);
len=size(oi);
i=1;
i=1;
j=1;
while i<len(1)
or=oi(i,1);

 
count=1;
while (i<len(1)&&oi(i+1,1)==or)
i=i+1;
count=count+1;
end
RLE(j)=count;
j=j+1;
i=i+1;
end
if i==len(1)
RLE(j)=1;
end
RLE=RLE';
msgcount=80;
for i=1:msgcount
msg(i,1)=0;
end
for l=1:msgcount
if mod(RLE((2*l),1),2)==0
msg(l,1)=0 %如果游程的值为偶数,表示隐藏的信息为
0
else
msg(l,1)=1 %如果游程的值为奇数,表示隐藏的信息为
1
end
end
out=bit2str(msg);
fid=fopen('message.txt', 'wt');
fwrite(fid, out)
fclose(fid);
4、代码执行过程如下:

 

 6、运行RLEhiding.m文件,如下图所示:

采用游程编码方式隐藏的信息量较大,而且隐写后的载体图像和原始载体图像从视觉效果上看差别不大,是较好的一种二值图像信息隐藏方法。

DCT图像信息隐藏算法:

DCT算法,基于DCT域水印技术的图像信息隐藏方法研究。数字水印是将特定的数字信息(水印)隐藏于数字化的多媒体数据(如图像、声音、视频和文本等)中,而不影响原数据的效果,并且可以从这些数据信息中部分地或全部地恢复出来,以达到版权保护的目的。作为一门新兴的学科,数字水印有许多理论与实际技术问题善待解决。本文主要是改进目前许多图像隐形水印算法在嵌入强度和含水印图像的质量评价等方面存在的问题,设计了一个较完整的基于DCT域的图像隐形水印算法,使该算法较好地兼顾不可感知性、稳健性和安全性。本算法在充分考虑人类视觉系统掩蔽特性的基础上,首先把原图像各8×8块按Hilbert扫描顺序排列, 然后在原图像分块的Hilbert序列中选取一块图像的DCT域的三个中频分量之间嵌入水印。嵌入水印具有很好的透明性,水印嵌入强度是与原图像特征相自适应的。同时,水印的提取无须求助于原图像。此外,实验结果也证明,该方法对图像调整、JPEG压缩和锐化图像等攻击具有较高的鲁棒性,是一种行之有效的水印嵌入方法。

注:要隐藏的图片大小要尽可能的比载体图片小。

下载DCT工具

双击DCT图像信息隐藏工具,运行的操作界面如下图:

2、点击”DCT加密“菜单,做DCT图像信息隐藏工具。

(1)打开”加载JPG或者BMP载体图像“对话框。选择载体图像文件test,并点击打开,如图:

(2)选择要被隐藏的图像文件bupt,点击打开,如图:

(3)选择合成之后的图像文件名称为save,点击保存,如图:

3个步骤正确选择之后,完成图像的DCT信息隐藏。

 5、点击DCT解密菜单,做DCT图像信息隐藏提取实验。选择需要提取的目标图像文件。

 6、完成选择之后,即做提取,提取的结果为mm_jpg.jpg文件,在当前目录下,可见与加载前的图片无很大差别。如图:

MIDI信息隐藏:

一个标准MIDI文件基本上是由两部分组成:头块和音轨块。头块用来描述整个MIDI文件基本信息。音轨块则包含一系列由MIDI消息构成的MIDI数据流。原则上,可为某种声音、某种乐谱或某种乐器等分配一个音轨块。

MIDI文件中前四个字节是ASCII字符“MThd”,用来判断该文件是否为Midi文件,而随后的四个字节指明文件头描述部分的字节数,它总是6,所以一定是“00 00 00 06”。 随后的ffff nn nn dd dd中的nn nn表示指定轨道数,也就是实际音轨数加上一个全局音轨。头块之后剩下的文件部分是一个或多个音轨块,每一个音轨块如表所示:

标识符串(4字节):“MTrk”

音轨块数据区长度(4字节):单位为字节

音轨块数据区:由多个MIDI事件构成

表 MIDI音轨块格式

每一个MIDI事件的构成:

MIDI事件=<delta time><MIDI消息>

<delta time>采用可变长编码,它决定了其后的MIDI消息被执行的时间。一个MIDI消息是由一个状态字节及多个数据字节构成。MIDI消息根据性质可分为通道消息(Channel Message)和系统消息(System Message)两大类。

通道消息是对单一的MIDI Channel起作用,其Channel是利用状态字节的低4位来表示,可从0到15共有16个channel。通道消息又分为声音消息和模式消息。声音消息用于控制合成器的声音产生。模式消息则为最多达16条通道分配声音关系,包括设定单音模式或复音模式等。MIDI文件的声音消息有7种,如表所示。

声音消息 功能描述 数字字节描述

80-8F 声音关闭 1字节:音符号; 2字节:音速

90-9F 声音开启 1字节:音符号; 2字节:音速

A0-AF 音键压力 1字节:音符号; 2字节:键压力

B0-BF 控制变化 1字节:控制器号(0-121);2字节:控制值

C0-CF 改变乐器 1字节:乐器编号

D0-DF 通道触动压力 1字节:压力

E0-EF 音调轮变化 1字节:弯音轮变换值的低字节

2字节:弯音轮变换值的高字节

表 MIDI文件声音消息

改变MIDI音乐文件的部分声音消息并不影响MIDI文件的听觉效果,通过实验,改变声音开启的最低位比特、乐器编号的最低位比特和通道触动压力的低4比特位,都不会引起听觉差异,因此可在这三种声音消息中嵌入水印信息。

打开matlab,打开编写代码,进行水印实验。

以下为水印代码(注意打开文件的路径)

(1)水印嵌入

若(s[i]&0xf0)=0x90,者在第4个字节s[i+2]中嵌入1比特水印信息,表示修改声音开启的最低位。若(s[i]&0xf0)=0xc0,则在第4字节s[i+1]中嵌入1比特水印信息,表示修改乐器编号的最低位比特。若则在第4个字节s[i+1]中嵌入4比特水印信息,表示修改通道触动压力的低4

网页信息隐藏:

原文地址:https://www.cnblogs.com/gufengchen/p/12317724.html