Java实现任意文件在bmp中的隐藏与导出

本文介绍如何使用Java将任意文件隐藏到BMP图像中以及从BMP图像中提取隐藏的文件。通过分析BMP图像文件结构,作者提供了尾部附加法和内部嵌入法两种隐藏模型。代码包括BitmapInput、BitmapOutput和BitmapExecute三个类,实现了文件的隐藏和导出功能。
摘要由CSDN通过智能技术生成
               

下载:http://download.csdn.net/source/493823

其实这个功能在C/C++上有N多实现方式,可惜一直没见人用Java写,上星期日看见有人在百度问,现在写一个发上来,偶就是手慢……

在实际帖代码前,我也先来点理论,因为很多人抗议我光写代码,没有理论基础……

BMP图像文件,即所谓的位图文件。在位图中,其表示方式是将一幅图像分割成栅格,栅格的每一点称为像素,每一个像素具有自己的RGB值,

以此构成图形。所以从本质上讲,一幅位图不过是由一系列像素点构成的点阵罢了。

位图文件支持4RLE(行程长度编码)以及8位和24位编码。本人在此类中只处理了24位格式。

24 BMP图像文件的结构特点为:(1)每个文件只能非压缩地存放一幅彩色图像;(2)文件头由54个字节的数据段组成,其中包含有该位图

文件的类型、大小、图像尺寸及打印格式等;(3)从第55个字节开始,是该文件的图像数据部分,数据的排列顺序以图像的左下角为起点,从

左到右、从下到上,每连续3个字节便描述图像一个像素点的颜色信息,这三个字节分别代表蓝、绿、红三基色在此像素中的亮度,若某连续三

个字节为:00H00HFFH,则表示该像素的颜色为纯红色。

 

要将文件隐藏在图片中,有两种模型方法可供参考:一是将文件附在载体图片之后,利用BMP文件的特殊性质(系统在读取 BMP文件的时候,是

读取它的第36个字节为文件长度,对超出这个长度的部分会忽略),将目标图片的二进制文件直接附着在载体之后,来实现文件的隐藏,此

方法简单易行,不会破坏载体与目标图片的任何信息,且对隐藏文件的大小没有限制,但隐蔽性有待加强。二是采用LSB算法,将所得目标文件

化整为零分别隐藏在载体的位图信息的每个字节的最低位,使得文件的隐蔽性大大提高,但可能因为载体的容量有限导致目标文件无法装入且

对隐藏文件的长度且有严格限制,此时一是用无损压缩的办法使隐藏文件变小,二是放大载体图像,三是增加在载体文件每字节存放的位数。

 

但这两种模型的优缺点在一定程度上可以互补,对于实际问题,可根据特定情况将以上两种想法结合起来,得到更理想的模型,即当载体图片

大小满足做法二的要求时,则按位加入,否则将剩余的二进制位按照第一种做法直接加在载体图片后。

 

1)模型1 ——尾部附加法。通过对BMP图像文件的数据结构的分析在BMP图像的头文件中有指示文件大小的数值bfSIZE。它指定了一般的图片

浏览器所能读取的范围。若不改变该数值的大小,则一般的图片浏览器只能够读取原文件。即便在该文件的尾部接上其他的文件,图片浏览器

所显示的仍然只是原文件。这就相当于把后续文件给屏蔽掉了,可以达到隐藏信息的目的。一旦图片被截获者截获,一般的图片浏览器对图片

的读取也只能进行到载体部分,目标图片不会被暴露出来,达到隐藏的效果。

 

2)模型2 ——内部嵌入法。对第一种模型的不足,即截获者可以用一些特殊方式发觉载体图片隐藏着一些信息,那么隐蔽性就大打折扣。通

过研究发现,对一幅用多比特值表示其灰度的图像来说,其中每个比特可看作表示了一个二值平面,也称作“位面”。“1幅灰度级用8bit表示

的图像有8个位面,一般用0代表最低位面,位面 7代表最高位面。基本上5个最高面含有视觉可见的有意义的信息,在其余的位面中几乎没有任

何视觉信息,这些位面所显示的只是图像中很细小的局部,在很多情况下,它们可看作噪声”正因为图像具有位面这种性质,因此信息往往隐

藏在不为人视觉所察觉的位置,这样位面就为信息隐藏提供了一种很好的实施方案。将信息隐藏在这些看似噪声的位置,其对图像的破坏就不

会太大,当然,在嵌入信息之前,首先要选择好信息具体加入的位面位置,不能将信息加入在存在图像视觉信息的位面上,因此,一般的LSB

法中,信息一般加在图像的后4位。

 

 

1)嵌入秘密信息的具体步骤:

 

第一步:读入载体文件,并显示它;

 

第二步:决定载体的LSB及嵌入的位数,本文采用嵌入图像中所有象素的最后一位,即第8位;

 

第三步:对载体图像做预处理,置其LSB0

 

第四步:将秘密信息以ACILL码的形式读入,并存储;

 

第五步:在每一个象素的第LSB位上,存储秘密信息的一个bit;

 

第六步:显示嵌入秘密文件的图像;

 

2)读取秘密信息的具体步骤:

 

第一步:读入含有秘密文件的图像;

 

第二步:得到每一个象素点的LSB位;

 

第三步:由每8LSB位组成一个ASILL还原秘密信息。

 

实现起来其实很简单,无论使用哪种理论模型,大体都是利用数据偏移罢了,偶用的内部嵌入法,大家可以根据自己的需要变更偶的代码,也

欢迎大家创造的隐藏方法,那位大侠有时间更改的话给偶也寄一份,我的Email:ceponline@yahoo.com.cn

 

本类从功能上讲,可以把任意文件(不能超过bmp文件大小)隐藏到BMP图片中,图片大小基本不变,浏览图片也看不出变化。当然,也可以把隐

藏在图片中的文件提取出来。

 

代码如下,由3个类构成:

 

BitmapInput.java

 

package org.loon.framework.test.encode;

 

import java.awt.image.BufferedImage;

 

/** *//**

 * <p>

 * Title: LoonFramework

 * </p>

 * <p>

 * Description:

 * </p>

 * <p>

 * Copyright: Copyright (c) 2007

 * </p>

 * <p>

 * Company: LoonFramework

 * </p>

 *

 * @author chenpeng

 * @emailceponline@yahoo.com.cn

 * @version 0.1

 */

public class BitmapInput ...{

 

    private BufferedImage _bmp;

 

    private int curX, curY, iRGB;

 

    private int bitsLeft;

 

    public BitmapInput(BufferedImage bmp) ...{

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值