有谁知道在bmp中夹带txt的算法

MrYoucheng 2002-03-01 11:59:49
最好用delphi或者java说明
一定给分
还有谁知道bmp的格式(用中文)
...全文
73 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
山卜居士 2002-03-08
  • 打赏
  • 举报
回复
标题 信息隐藏与数字水印技术 TurboChen(转贴)

关键字 水印 密码 信息隐藏

出处 http://www-900.ibm.com/developerWorks/security/l-info/index.shtml



内容:

信息隐藏
数字水印
结 论
参考资料
关于作者




戴元军 ( dyj1999@263.net)
北京邮电大学信息安全中心博士
2002 年 1 月

多媒体数据的数字化为多媒体信息的存取提供了极大的便利,同时也极大地提高了信息表达的效率和准确性。随着因特网的日益普及,多媒体信息的交流已达到了前所未有的深度和广度,其发布形式也愈加丰富了。人们如今也可以通过因特网发布自己的作品、重要信息和进行网络贸易等 ,但是随之而出现的问题也十分严重:如作品侵权更加容易,篡改也更加方便。因此如何既充分利用因特网的便利 ,又能有效地保护知识产权,已受到人们的高度重视。这标志着一门新兴的交叉学科--信息隐藏学的正式诞生。如今信息隐藏学作为隐蔽通信和知识产权保护等的主要手段,正得到广泛的研究与应用。
1 信息隐藏

1. 1 信息隐藏模型
信息隐藏 (Information Hiding)不同于传统的密码学技术。密码技术主要是研究如何将机密信息进行特殊的编码,以形成不可识别的密码形式 (密文 )进行传递;而信息隐藏则主要研究如何将某一机密信息秘密隐藏于另一公开的信息中,然后通过公开信息的传输来传递机密信息。对加密通信而言,可能的监测者或非法拦截者可通过截取密文,并对其进行破译,或将密文进行破坏后再发送,从而影响机密信息的安全;但对信息隐藏而言,可能的监测者或非法拦截者则难以从公开信息中判断机密信息是否存在,难以截获机密信息,从而能保证机密信息的安全。多媒体技术的广泛应用,为信息隐藏技术的发展提供了更加广阔的领域。

我们称待隐藏的信息为秘密信息 (secret message),它可以是版权信息或秘密数据,也可以是一个序列号;而公开信息则称为载体信息 (cover message),如视频、音频片段。这种信息隐藏过程一般由密钥 (Key)来控制,即通过嵌入算法(Embedding algorithm)将秘密信息隐藏于公开信息中,而隐蔽载体 (隐藏有秘密信息的公开信息 )则通过信道 (Communication channel)传递 ,然后检测器 (Detector)利用密钥从隐蔽载体中恢复 /检测出秘密信息 。

信息隐藏技术主要由下述两部分组成 :(1 )信息嵌入算法 ,它利用密钥来实现秘密信息的隐藏 。 (2 )隐蔽信息检测 /提取算法 (检测器 ) ,它利用密钥从隐蔽载体中检测 /恢复出秘密信息 。在密钥未知的前提下 ,第三者很难从隐秘载体中得到或删除 ,甚至发现秘密信息 。

1. 2 信息隐藏特点
信息隐藏不同于传统的加密 ,因为其目的不在于限制正常的资料存取 ,而在于保证隐藏数据不被侵犯和发现 。因此 ,信息隐藏技术必须考虑正常的信息操作所造成的威胁 ,即要使机密资料对正常的数据操作技术具有免疫能力 。这种免疫力的关键是要使隐藏信息部分不易被正常的数据操作 (如通常的信号变换操作或数据压缩 )所破坏 。根据信息隐藏的目的和技术要求 ,该技术存在以下特性:

鲁棒性 (robustness) 指不因图象文件的某种改动而导致隐藏信息丢失的能力 。这里所谓"改动"包括传输过程中的信道噪音、滤波操作、重采样、有损编码压缩、D/ A或 A/ D转换等 。
不可检测性 (undetectability) 指隐蔽载体与原始载体具有一致的特性 。如具有一致的统计噪声分布等 ,以便使非法拦截者无法判断是否有隐蔽信息 。
透明性 (invisibility) 利用人类视觉系统或人类听觉系统属性 ,经过一系列隐藏处理 ,使目标数据没有明显的降质现象 ,而隐藏的数据却无法人为地看见或听见 。
安全性 (security) 指隐藏算法有较强的抗攻击能力 ,即它必须能够承受一定程度的人为攻击 ,而使隐藏信息不会被破坏 。
自恢复性 由于经过一些操作或变换后 ,可能会使原图产生较大的破坏 ,如果只从留下的片段数据 ,仍能恢复隐藏信号 ,而且恢复过程不需要宿主信号 ,这就是所谓的自恢复性 。信息隐藏学是一门新兴的交叉学科 ,在计算机、通讯、保密学等领域有着广阔的应用前景 。数字水印技术作为其在多媒体领域的重要应用 ,已受到人们越来越多的重视 。

2 数字水印

2 .1 背景
随着数字技术和因特网的发展 ,各种形式的多媒体数字作品 (图象、视频、音频等 )纷纷以网络形式发表 ,其版权保护成为一个迫切需要解决的问题 。由于数字水印 (digital watermarking)是实现版权保护的有效办法 ,因此如今已成为多媒体信息安全研究领域的一个热点 ,也是信息隐藏技术研究领域的重要分支 。该技术即是通过在原始数据中嵌入秘密信息--水印 (watermark)来证实该数据的所有权 。这种被嵌入的水印可以是一段文字、标识、序列号等 ,而且这种水印通常是不可见或不可察的 ,它与原始数据 (如图象、音频、视频数据 )紧密结合并隐藏其中,并可以经历一些不破坏源数据使用价值或商用价值的操作而能保存下来 。数字水印技术除了应具备信息隐藏技术的一般特点外 ,还有着其固有的特点和研究方法 。在数字水印系统中 ,隐藏信息的丢失 ,即意味着版权信息的丢失 ,从而也就失去了版权保护的功能 ,也就是说 ,这一系统就是失败的 。由此可见 ,数字水印技术必须具有较强的鲁棒性、安全性和透明性 。

2. 2 典型数字水印系统模型
图 1为水印信号嵌入模型 ,其功能是完成将水印信号加入原始数据中;图 2为水印信号检测模型,用以判断某一数据中是否含有指定的水印信号 。


2.3 数字水印主要应用领域


版权保护 即数字作品的所有者可用密钥产生一个水印,并将其嵌入原始数据,然后公开发布他的水印版本作品。当该作品被盗版或出现版权纠纷时,所有者即可利用图3或图4的方法从盗版作品或水印版作品中获取水印信号作为依据,从而保护所有者的权益。
加指纹 为避免未经授权的拷贝制作和发行,出品人可以将不同用户的ID或序列号作为不同的水印(指纹)嵌入作品的合法拷贝中。一旦发现未经授权的拷贝,就可以根据此拷贝所恢复出的指纹来确定它的来源。
标题与注释 即将作品的标题、注释等内容(如,一幅照片的拍摄时间和地点等)以水印形式嵌入该作品中,这种隐式注释不需要额外的带宽,且不易丢失。
篡改提示 当数字作品被用于法庭、医学、新闻及商业时,常需确定它们的内容是否被修改、伪造或特殊处理过。为实现该目的,通常可将原始图象分成多个独立块,再将每个块加入不同的水印。同时可通过检测每个数据块中的水印信号,来确定作品的完整性。与其他水印不同的是,这类水印必须是脆弱的,并且检测水印信号时,不需要原始数据。
使用控制 这种应用的一个典型的例子是DVD防拷贝系统,即将水印信息加入DVD数据中,这样DVD播放机即可通过检测DVD数据中的水印信息而判断其合法性和可拷贝性。从而保护制造商的商业利益。

2.4 典型数字水印算法
近年来,数字水印技术研究取得了很大的进步,下面对一些典型的算法进行了分析,除特别指明外,这些算法主要针对图象数据(某些算法也适合视频和音频数据)。

空域算法。该类算法中典型的水印算法是将信息嵌入到随机选择的图像点中最不重要的像素位 (LSB:least significant bits)上 ,这可保证嵌入的水印是不可见的。但是由于使用了图像不重要的像素位 ,算法的鲁棒性差 ,水印信息很容易为滤波、图像量化、几何变形的操作破坏。另外一个常用方法是利用像素的统计特征将信息嵌入像素的亮度值中。Patchwork算法方法是随机选择N对像素点 (ai,bi) ,然后将每个ai点的亮度值加 1 ,每个bi点的亮度值减 1,这样整个图像的平均亮度保持不变。适当地调整参数,Patchwork方法对JPEG压缩、FIR滤波以及图像裁剪有一定的抵抗力,但该方法嵌入的信息量有限。为了嵌入更多的水印信息,可以将图像分块,然后对每一个图像块进行嵌入操作。
变换域算法。该类算法中,大部分水印算法采用了扩展频谱通信 (spread spectrum communication)技术。算法实现过程为:先计算图像的离散余弦变换 (DCT),然后将水印叠加到DCT域中幅值最大的前k系数上(不包括直流分量),通常为图像的低频分量。若DCT系数的前k个最大分量表示为D={ di },i=1 ,… ,k,水印是服从高斯分布的随机实数序列W ={ wi },i=1 ,… ,k,那么水印的嵌入算法为di = di(1 + awi),其中常数a为尺度因子 ,控制水印添加的强度。然后用新的系数做反变换得到水印图像I。解码函数则分别计算原始图像I和水印图像I*的离散余弦变换 ,并提取嵌入的水印W*,再做相关检验 以确定水印的存在与否。该方法即使当水印图像经过一些通用的几何变形和信号处理操作而产生比较明显的变形后仍然能够提取出一个可信赖的水印拷贝。一个简单改进是不将水印嵌入到DCT域的低频分量上,而是嵌入到中频分量上以调节水印的顽健性与不可见性之间的矛盾。另外,还可以将数字图象的空间域数据通过离散傅里叶变换(DFT)或离散小波变换(DWT)转化为相应的频域系数;其次,根据待隐藏的信息类型,对其进行适当编码或变形;再次,根据隐藏信息量的大小和其相应的安全目标,选择某些类型的频域系数序列(如高频或中频或低频);再次,确定某种规则或算法,用待隐藏的信息的相应数据去修改前面选定的频域系数序列;最后,将数字图象的频域系数经相应的反变换转化为空间域数据。该类算法的隐藏和提取信息操作复杂,隐藏信息量不能很大,但抗攻击能力强,很适合于数字作品版权保护的数字水印技术中。
压缩域算法 基于JPEG、MPEG标准的压缩域数字水印系统不仅节省了大量的完全解码和重新编码过程,而且在数字电视广播及VOD(Video on Demand)中有很大的实用价值。相应地,水印检测与提取也可直接在压缩域数据中进行。下面介绍一种针对MPEG-2压缩视频数据流的数字水印方案。虽然MPEG-2数据流语法允许把用户数据加到数据流中,但是这种方案并不适合数字水印技术,因为用户数据可以简单地从数据流中去掉,同时,在MPEG-2编码视频数据流中增加用户数
hhoking 2002-03-08
  • 打赏
  • 举报
回复
再大也不会大过RGB24转RGB16吧?那就先分析颜色的成分,得一个直方图,然后将使用几率小于20%(你可以自己控制)的颜色值用来存储Txt,存储方法同上,这样失真会少一点的。这个算法有些复杂,在这一时也写不出来。思想就是那样了,你应该明白的。
MrYoucheng 2002-03-07
  • 打赏
  • 举报
回复
我试过这个算法 可是图象失真较大 大家有没有实验过啊?
hhoking 2002-03-06
  • 打赏
  • 举报
回复
unsigned char TxtBuffer[];
unsigned char BmpBuffer[];

unsigned char *pTxt = TxtBuffe;// 指向Txt数据的指针
unsigned char *pBmp = BmpBuffer;// 指向Bmp数据的指针

unsigned char Txt;
unsigned char Bmp;

Txt = *pTxt;
Txt <<= 5;Txt >>= 5; // 得到Txt的低5位
*pBmp++ = Bmp|Txt; // 将Txt低5位写入BMP的B元素
Txt = *pTxt;
Txt << 2;Txt >> 7;// 得到Txt的中1位
*pBmp++ = Bmp|Txt;// 将Txt中1位写入BMP的G元素
Txt = *pTxt;
Txt >> 6;// 得到Txt的高2位
*pBmp++ = Bmp|Txt;// 将Txt高2位写入BMP的R元素

//循环上述过程,就将Txt写入Bmp中了。
hhoking 2002-03-06
  • 打赏
  • 举报
回复
不过借鉴RGB555到RGB24位的转换过程和上面leojay(leojay) 的思想,确实可以利用RGB的低位来存TXT数据,并且失真程度是可以控制的。我可以用C++给你写段代码,delphi或者java就不会了。
hhoking 2002-03-06
  • 打赏
  • 举报
回复
我知道啊,我说过了,如果没有保密的要求的话,可以这样做。如果还要求文件大小没变化,就没有考虑过了。
MrYoucheng 2002-03-06
  • 打赏
  • 举报
回复
hhoking(妙手仁心) 你只不知道?这样文件大小回有变化的
hhoking 2002-03-06
  • 打赏
  • 举报
回复
所以根据位图的文件格式,如果不需要特别的加密的话,将Txt文件直接加到Bmp文件的尾部就可以。(有一些处理过程),当然这样得到的Bmp,ACDSee读不读得出,我没试过,不知道,但你自己完全可以读出来的。
hhoking 2002-03-06
  • 打赏
  • 举报
回复
BMP文件的格式:
BITMAPFILEHEADER结构体:(14字节)
typedef struct tagBITMAPFILEHEADER{
WORD bfType; // 位图文件的类型,必须为BM
DWORD bfSize; // 位图文件的大小,以字节为单位
WORD bfReserved1; // 位图文件保留字,必须为0
WORD bfReserved2; // 位图文件保留字,必须为0
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示
} BITMAPFILEHEADER;

BITMAPINFOHEADER结构体:(40字节)
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; // 本结构所占用字节数
LONG biWidth; // 位图的宽度,以像素为单位
LONG biHeight; // 位图的高度,以像素为单位
WORD biPlanes; // 目标设备的级别,必须为1
WORD biBitCount // 每个像素所需的位数,必须是1(双色),
// 4(16色),8(256色)或24(真彩色)之一
DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),
// 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
DWORD biSizeImage; // 位图的大小,以字节为单位
LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数
LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数
DWORD biClrUsed; // 位图实际使用的颜色表中的颜色数
DWORD biClrImportant; // 位图显示过程中重要的颜色数
} BITMAPINFOHEADER;

RGBQUAD结构体:(4字节)
typedef struct tagRGBQUAD {
BYTE rgbBlue; // 蓝色的亮度(值范围为0-255)
BYTE rgbGreen; // 绿色的亮度(值范围为0-255)
BYTE rgbRed; // 红色的亮度(值范围为0-255)
BYTE rgbReserved; // 保留,必须为0
} RGBQUAD;

BITMAPINFO结构体:
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader; //位图信息头
RGBQUAD bmiColors[1]; //颜色表
} BITMAPINFO;

位图数据
位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:
当biBitCount=1时,8个像素占1个字节;
当biBitCount=4时,2个像素占1个字节;
当biBitCount=8时,1个像素占1个字节;
当biBitCount=24时,1个像素占3个字节;
Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充。
king_koo 2002-03-06
  • 打赏
  • 举报
回复
不好!会引起图象质量下降。
leojay 2002-03-05
  • 打赏
  • 举报
回复
那里面还有程序例子呢.
leojay 2002-03-05
  • 打赏
  • 举报
回复
程序说明:

根据亮度公式: I = 0.3R + 0.59G + 0.11B 以及人眼视觉对绿色最敏感,对蓝色最不敏感,如果绿色分量改变1不影响人的感觉,蓝色分量相应改变5也不会影响人的感觉,红色分量改变2亦不会影响人的感觉,所以可对R G B 相应改变低2,1,3位。相当于位图内容的1/4。(以上引至电脑爱好者2000年10期)

先将位图陈例的前6字节写入文件长度,以后再加入被隐藏文件的文件名前8位(如不足则用*表示)扩展名3位(同上),然后将被隐藏文件写入位图,在最后加上文件CRC校验。增加文件冗余能力。



具体内容去http://www.vchelp.net/source/submit/hideinbmp.htm
看看吧

23,405

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧