优秀的毕业设计论文网
计算机 JAVA 电子信息 单片机 机械机电 模具 土木工程 建筑结构 论文
热门搜索词:网络 ASP.NET 汽车 电气 数控 PLC

049_一阶贝塞尔曲线的信息隐藏软件

以下是资料介绍,如需要完整的请充值下载.
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
  
资料介绍:

4.2 嵌入算法
组帧完毕后,可按t=0.035、L=3时的算法进行信息流的融合处理。由于是用8比特的图像信息来隐藏3比特的秘密文件信息,因此取其最小公倍数24比特(3字节)为一个循环周期。比特流的划分可用位与和移位操作来实现,对于秘密文件的三个字节位与掩码依次为[224,28,3],[128,112,14,1],[192,56,7],取得掩码之后应作相应的移位操作。下面这段代码是文件隐藏的核心代码,直接体现了算法的中心思想:
for(DWORD i=54;i<BaseFileLen;i++) //对于位图文件,图像点阵从第54字节开始
{
Temp=((HideData[j]&224)>>5)<<5; //第一个“3比特”构成图像的第一字节
BaseData[i]=HideCalculate(BaseData[i],Temp); //进行两文件融合计算
i++; //修正宿主信息当前指针(字节为单位) 【www.think58.com计算机毕业论文网】
Temp=((HideData[j]&28)>>2)<<5; //第二个“3比特”构成图像的第二字节
BaseData[i]=HideCalculate(BaseData[i],Temp);
i++;
Temp=(HideData[j]&3)<<1; //第三个“3比特”
j++; //修正隐藏信息当前指针(字节为单位)
Temp|=(HideData[j]&128)>>7; think58.com [来源:http://think58.com]
Temp*=32;
BaseData[i]=HideCalculate(BaseData[i],Temp);
i++;
Temp=((HideData[j]&112)>>4)<<5; //第四个“3比特”
BaseData[i]=HideCalculate(BaseData[i],Temp);
i++;
Temp=((HideData[j]&14)>>1)<<5; //第五个“3比特”
BaseData[i]=HideCalculate(BaseData[i],Temp);
i++;
Temp=(HideData[j]&1)<<2; //第六个“3比特”
j++;
Temp|=(HideData[j]&192)>>6;
Temp*=32;
BaseData[i]=HideCalculate(BaseData[i],Temp);
i++;
Temp=((HideData[j]&56)>>3)<<5; //第七个“3比特”
BaseData[i]=HideCalculate(BaseData[i],Temp);
i++;
Temp=(HideData[j]&7)<<5; //第八个“3比特”
BaseData[i]=HideCalculate(BaseData[i],Temp);
j++;
}
其中,图像融合计算是在unsigned char HideCalculate(unsigned char B, unsigned char H);函数中完成的。参数B为宿主信息的内容, H为隐藏信息的内容。计算完成后将融合后的信息返回,该函数的实现编码如下: copyright think58

[资料来源:http://www.THINK58.com]

unsigned char CDataHiderView::HideCalculate(unsigned char B, unsigned char H)
{
// f2=round(f0*(1-t))+round(f1*t)
unsigned char R=(int)((1-t)*B+0.5f)+(int)(t*H+0.5f);
return R;
}
4.3 恢复算法
文件从位图中提取的过程实际是文件隐藏的逆过程。将含有隐含文件的位图和原始位图读入缓存后,先通过信息提取从宿主信息的每个字节恢复出3个比特,然后将这些比特流按次序以8bit/byte的格式组成字节流,从而完成对隐藏信息的恢复:
for(DWORD i=54;i<CarrierFileLen;i++)
{
Temp=(ShowCalculate(CarrierData[i],BaseData[i])&7)<<5;//提取出第一个“3比特”
i++; //宿主信息指针修正(字节为单位)
Temp|=(ShowCalculate(CarrierData[i],BaseData[i])&7)<<2; //提取出第二个“3比特”
i++;
Temp|=(ShowCalculate(CarrierData[i],BaseData[i])&6)>>1; //提取出第三个“3比特”
CarrierData[j]=Temp; //恢复出第一个隐藏字节
j++; //隐藏信息指针修正(字节为单位)
Temp=(ShowCalculate(CarrierData[i],BaseData[i])&1)<<7;

本文来自think58 [来源:http://think58.com]


i++;
Temp|=(ShowCalculate(CarrierData[i],BaseData[i])&7)<<4; //提取出第四个“3比特”
i++;
Temp|=(ShowCalculate(CarrierData[i],BaseData[i])&7)<<1; //提取出第五个“3比特”
i++;
Temp|=(ShowCalculate(CarrierData[i],BaseData[i])&4)>>2; //提取出第六个“3比特”
CarrierData[j]=Temp; //恢复出第二个隐藏字节
j++;
Temp=(ShowCalculate(CarrierData[i],BaseData[i])&3)<<6;
i++;
Temp|=(ShowCalculate(CarrierData[i],BaseData[i])&7)<<3; //提取出第七个“3比特”
i++;
Temp|=ShowCalculate(CarrierData[i],BaseData[i])&7; //提取出第八个“3比特”
CarrierData[j]=Temp; //恢复出第三个隐藏字节
j++;
}
这里进行信息恢复和误差修正的主要工作是在unsigned char ShowCalculate(unsigned char C, unsigned char B);函数里完成的。参数C为宿主信息内容,参数B为原始信息内容,返回值为隐藏信息的3个比特(未经移位处理):
unsigned char CDataHiderView::ShowCalculate(unsigned char C, unsigned char B) 内容来自think58 [资料来源:http://www.THINK58.com]
{
// rf1=round((f2-round((1-t)*f0))/t)
unsigned char R=(int)((C- (int)((1-t)*B+0.5f))/t+0.5f);
if(R%32>15) //误差修正(自动纠错)
R+=15;
R=(int)(R/32.0f+0.5f);
return R;
}
经过上述处理,可以将隐藏文件的文件信息和内容从宿主位图恢复到内存,余下的工作只需根据文件头格式将文件有关信息提取出来并据此将文件内容保存到磁盘即可完成任意二进制文件的恢复。
5 基于一阶贝塞尔曲线的信息隐藏软件的实现
5.1 基本步骤

图5-1 软件实现步骤
对照需求分析,软件的实现主要为宿主文件的正确选取,待隐藏文件的正确选取,融合过程的成功进行,融合后文件的正确选取,恢复过程的成功进行五部分。实现步骤如图5-1,而其间各种程序的实现也同步进行。首先选择非空BMP位图文件作为宿主文件,因为此软件所选定的宿主文件类型仅为24位BMP位图文件,而大小为0kb的文件不能作为宿主文件使用,同时软件也会提示宿主文件选取错误;当选取待隐藏文件时,各种文件类型均可选取,如.txt文本文件类型、.exe执行文件类型以及各种图像文件类型。若选取的文件过大,超过宿主文件大小的3/8,软件在融合步骤将会提示待隐藏文件大小过大。因此本软件更适合隐藏容量较小的图像文件和文本文件;融合过程的成功进行取决于融合系数的选择,组帧部分的实现如图5-2所示,组帧完毕后将按照参数t=0.035、L=3对组帧后的信息进行融合。一般情况下,融合系数和串长参数在软件原有程序中已确定。融合时,软件提示融合后文件的储存地址,在此要注意为融合后的文件作标记,并确定路径;恢复文件时,必须正确选取融合后的文件,否则软件会提示选取文件有误。恢复过程是融合过程的逆过程,按照组帧信息,确保机密文件的完整性和正确性。同时软件会提示机密文件的储存位置。 think58.com [版权所有:http://think58.com]

图5-2 组帧原理
5.2 辅助程序段
除信息隐藏、信息恢复以及其他主要程序模块外,相关辅助程序段起到了完善软件的作用,如对话框程序段,文件选择框程序段等。在此介绍的是本实例软件常用到的文件存储路径选择对话框程序和提示框程序,存储选择框图示如图5-3。

图5-3 对话框程序实现效果
void CDataHiderView::OnHidefile()
{
CFileDialog dlg(TRUE,"*","*.*",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"需隐藏文件(*.*)|*.*||",NULL);
if(dlg.DoModal()==IDOK)
{
m_bCanConv2=true;
m_sHideFile=dlg.GetPathName();
m_sHideFileName=dlg.GetFileName();
}
else
m_bCanConv2=false;
}

think58好,好think58

[资料来源:http://think58.com]

[资料来源:http://THINK58.com]