最新信息安全实验报告五Word格式.docx
- 文档编号:22343394
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:11
- 大小:632.01KB
最新信息安全实验报告五Word格式.docx
《最新信息安全实验报告五Word格式.docx》由会员分享,可在线阅读,更多相关《最新信息安全实验报告五Word格式.docx(11页珍藏版)》请在冰豆网上搜索。
具体操作如下图示:
图3.1嵌入水印信息设置
Step2:
关闭显示“水印信息嵌入成功”的提示窗口,嵌入水印信息前后的图像对比如图3.2所示,可以看出两者在视觉上并无明显差异。
图3.2嵌入水印信息前后的图像对比
Step3:
在程序主界面的“模式选择”域中选择“检测水印”,然后单击“打开”按钮,选择要检测是否嵌入水印信息的原始图像。
“提取的水印信息”栏中显示提取到的水印信息“信息安全ISCC”,如下图所示:
水印信息提取成功
4、将编写好的源代码输入计算机并进行调试分析,发现错误,再修改完善,最终实现实验所要求的功能。
1)给图像添加水印的函数
voidCPrj_watermarkDlg:
:
OnBtnImbed()
{
//打开并读取未嵌入水印的源BMP文件
CFiledibFile(m_strFileImgSrc,CFile:
modeRead);
DWORDnJPG_Len=0;
nJPG_Len=(DWORD)dibFile.GetLength();
dibFile.Read(pJPG_Buf,nJPG_Len);
//调用DLL中的_ADDWATERMARK函数,实现水印嵌入
intret1;
memset(WmCoef,0,sizeof(WmCoef));
ret1=_ADDWATERMARK(pJPG_Buf,nJPG_Len,pBMP_Buf,WmCoef);
if(ret1==1)//水印嵌入成功,分别用文件保存嵌入水印后的图片和源DCT系数,以备水印检测使用
{
AfxMessageBox("
水印嵌入成功"
);
CFiledibFile2(m_strFileImgWater,CFile:
modeCreate|CFile:
modeWrite);
dibFile2.Write(pBMP_Buf,nJPG_Len);
dibFile2.Close();
CFilefCoef("
CoefDCT.dat"
CFile:
fCoef.Write(WmCoef,strlen((char*)WmCoef));
fCoef.Close();
}
elseif(ret1==0)
水印嵌入失败"
dibFile.Close();
}
2)从图像中提取水印的函数核心实现
//WaterMarkDlg.cpp:
implementationfile
#include"
stdafx.h"
WaterMark.h"
WaterMarkDlg.h"
Dib.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
……
BOOLCWaterMarkDlg:
OnInitDialog()
CDialog:
OnInitDialog();
ASSERT((IDM_ABOUTBOX&
0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<
0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->
AppendMenu(MF_SEPARATOR);
AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}}
SetIcon(m_hIcon,TRUE);
//Setbigicon
SetIcon(m_hIcon,FALSE);
//Setsmallicon
//TODO:
Addextrainitializationhere
returnTRUE;
//returnTRUEunlessyousetthefocustoacontrol
voidCWaterMarkDlg:
OnOpenFile()
Addyourcontrolnotificationhandlercodehere
CFileDialogdlg(TRUE,"
"
NULL,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,
"
(*.bmp)|*.bmp|所有文件(*.*)|*.*||"
AfxGetMainWnd());
//读取图象的文件名CStringfilename;
if(dlg.DoModal()==IDOK)
{//Bitmap2Data()将图象的转换为数据保存在二维数组m_tOriPixelArray
POSITIONpos=dlg.GetStartPosition();
filename=dlg.GetNextPathName(pos);
Bitmap2Data();
if(hwnd[0]!
=NULL)
hwnd[0]=NULL;
if(hSrcDC[0]!
hSrcDC[0]=NULL;
if(hDesDC[0]!
hDesDC[0]=NULL;
hwnd[0]=GetDlgItem(IDC_STATIC0);
hDesDC[0]=hwnd[0]->
GetDC()->
m_hDC;
hSrcDC[0]=CreateCompatibleDC(hDesDC[0]);
filename=dlg.GetPathName();
hBitmap[0]=(HBITMAP)LoadImage(AfxGetInstanceHandle(),filename,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
GetObject(hBitmap[0],sizeofBITMAP,&
bm[0]);
SelectObject(hSrcDC[0],hBitmap[0]);
hwnd[0]->
GetClientRect(&
rect[0]);
:
SetStretchBltMode(hDesDC[0],COLORONCOLOR);
StretchBlt(hDesDC[0],rect[0].left,rect[0].top,rect[0].right,rect[0].bottom,hSrcDC[0],0,0,bm[0].bmWidth,bm[0].bmHeight,+SRCCOPY);
show[0]=TRUE;
SetTimer(NULL,50,0);
GetDlgItem(IDC_BUTTON2)->
EnableWindow(TRUE);
}
else{TRACE("
错误"
CStrings,s0,s1,s2;
s.Format("
%2d"
bm[0].bmHeight);
s1.Format("
bm[0].bmWidth);
s0.Format("
%d"
m_dib->
GetBiBitCount());
s2="
宿主图象"
+s0+"
位H×
W:
+s+"
X"
+s1;
if(pEdit!
=NULL)pEdit=NULL;
r.left=35;
r.top=rect[0].bottom+2;
r.right=200+r.left;
r.bottom=r.top+20;
pEdit=newCEdit;
pEdit->
Create(ES_CENTER|WS_VISIBLE|ES_READONLY,r,this,1);
CFont*cFont=newCFont;
cFont->
CreateFont(16,0,0,0,FW_SEMIBOLD,FALSE,FALSE,0,
ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
DEFAULT_PITCH&
FF_SWISS,"
Arial"
SetFont(cFont,TRUE);
SetWindowText(s2);
}……
Operate_Byte(BYTE&
operate1,BYTE&
operate2,BYTEm_operate)
{//将m_operate最低四位取出来放到L里最高四位放到H里,
//最后将H赋值给operate1最后四位L赋值给operate2最后四位
inti;
BYTEM=240,t=m_operate;
//11110000
BYTEH,L,x[8],y[4];
y[3]=8;
y[2]=4;
y[1]=2;
y[0]=1;
for(i=0;
i<
8;
i++)
x[i]=m_operate&
1;
m_operate>
>
=1;
H=x[7]*y[3]+x[6]*y[2]+x[5]*y[1]+x[4]*y[0];
//hight
L=x[3]*y[3]+x[2]*y[2]+x[1]*y[1]+x[0]*y[0];
//low
operate1&
=M;
operate2&
operate1+=H;
operate2+=L;
PutInWaterMessage()
longa,b,c,d;
a=ImageHeight;
b=ImageWidth;
c=WaterHeight;
d=WaterWidth;
BYTECWaterMarkDlg:
Operate_ByteOut(BYTEoperate1,BYTEoperate2)
//相对与Operate_Byte()
inti=0;
BYTEx[8],y[8],data;
for(i=0;
4;
x[i]=operate2&
operate2>
//取出最低的四位
for(i=4;
x[i]=operate1&
operate1>
//取出最高的四位
y[0]=1;
y[3]=8;
y[4]=16;
y[5]=32;
y[6]=64;
y[7]=128;
data=x[0]*y[0]+x[1]*y[1]+x[2]*y[2]+x[3]*y[3]+x[4]*y[4]+x[5]*y[5]+x[6]*y[6]+x[7]*y[7];
returndata;
}……
OnOpenW_E_Bitmap()
if(dlg.DoModal()!
=IDOK)return;
if(hwnd[2]!
=NULL)hwnd[2]=NULL;
if(hSrcDC[2]!
=NULL)hSrcDC[2]=NULL;
if(hDesDC[2]!
=NULL)hDesDC[2]=NULL;
hwnd[2]=GetDlgItem(IDC_STATIC2);
hDesDC[2]=hwnd[2]->
hSrcDC[2]=CreateCompatibleDC(hDesDC[2]);
CStringfile;
file=dlg.GetPathName();
file=dlg.GetNextPathName(pos);
Embed2Data(file);
hBitmap[2]=(HBITMAP)LoadImage(AfxGetInstanceHandle(),file,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
GetObject(hBitmap[2],sizeofBITMAP,&
bm[2]);
SelectObject(hSrcDC[2],hBitmap[2]);
hwnd[2]->
rect[2]);
SetStretchBltMode(hDesDC[2],COLORONCOLOR);
StretchBlt(hDesDC[2],rect[2].left,rect[2].top,rect[2].right,rect[2].bottom,hSrcDC[2],0,0,bm[2].bmWidth,bm[2].bmHeight,+SRCCOPY);
show[2]=TRUE;
运行结果如下图:
五、实验遇到问题及解决方法
实验中,由于对加载DLL以及DCT系数有较浅的认识,所以实验起来有些麻烦,特别是编写、整合源程序的过程。
由于下载的VC++6.0一些功能问题,所以实验迟迟不能得到更好的解决。
通过本次实验,我对数字水印的实现原理有了基本的了解,通过演示程序对数字水印有了一定的认识,虽然水印嵌入和检测代码的编写工作完成的不是太好,但尽了最大的努力。
实验中,一方面不是太喜欢或擅长使用VC++6.0,由于VC++6.0不仅出现Bug,就是出现各种异常,也给实验带来了一定的阻碍。
另一方面,自己对基础理论知识的研究还不是太深刻,尽管这样,这次实验还是积累了不少东西。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最新信息 安全 实验 报告