信息隐藏实验报告lsb及dct.docx

上传人:牧羊曲112 文档编号:5013096 上传时间:2023-05-29 格式:DOCX 页数:15 大小:241.96KB
返回 下载 相关 举报
信息隐藏实验报告lsb及dct.docx_第1页
第1页 / 共15页
信息隐藏实验报告lsb及dct.docx_第2页
第2页 / 共15页
信息隐藏实验报告lsb及dct.docx_第3页
第3页 / 共15页
信息隐藏实验报告lsb及dct.docx_第4页
第4页 / 共15页
信息隐藏实验报告lsb及dct.docx_第5页
第5页 / 共15页
亲,该文档总共15页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《信息隐藏实验报告lsb及dct.docx》由会员分享,可在线阅读,更多相关《信息隐藏实验报告lsb及dct.docx(15页珍藏版)》请在三一办公上搜索。

1、华北电力大学实验报告实验名称 基于LSB及DCT技术的信息隐藏技术课程名称专业班级:信安1001班学生姓名:学 号:成 绩:指导教师:袁和金实验日期:2013.5.9(实验报告如打印,纸张用A4,左装订;页边距:上下2.5cm,左 2.9cm, 右2.1cm ;字体:宋体小四号,1.25倍行距。)验证性、综合性实验报告应含的主要内容:一、实验目的及要求二、所用仪器、设备三、实验原理四、实验方法与步骤五、实验结果与数据处理六、讨论与结论(对实验现象、实验故障及处理方法、实验中存在的问 题等进行分析和讨论,对实验的进一步想法或改进意见)七、所附实验输出的结果或数据设计性实验报告应含的主要内容:一、

2、设计要求二、选择的方案三、所用仪器、设备四、实验方法与步骤五、实验结果与数据处理六、结论(依据“设计要求”)七、所附实验输出的结果或数据*封面左侧印痕处装订一、实验目的及要求学会把把一个有意义的信息(秘密信息)隐藏在另一个称为载体(Cover)的信息(非 机密信息)中得到隐蔽载体(Stego Cover)。本实验是借助图片这个载体借助LSB(最低有效位)及DCT(离散余弦变换)两种思想, 把一个秘密图像信息进行隐藏,并最终还原。二、所用仪器、设备一台 PC、Microsoft Visual studio 2008 编辑环境。三、基于最低有效位的信息隐藏1、原理:每个像素值为8bit二进制值,表

3、示该点亮度。不同位平面对视觉影响不同。人的视觉和听觉系统对于图像和声音的最低比特位是不敏感的。因此,可以利用这些位 置隐藏信息。设c表示载体对象,匕表示载体对象的取样值。匕的取值范围根据载体信号的不同 而不同。对于二值图像,其值为0或1,对于量化的图像或声音,它的可能取值是0到 255的整数,对于归一化的图像或声音,可能取值为-1,1的任意值。载体的大小用L(c) 表示。要隐藏的秘密信息用序列mt表示,L(m)表示其长度。由于任何秘密信息(如口令、 实现、徽标)都可以转化为比特串,所以一般都假定m的取值为0或1。将秘密信息嵌入载体后,输出的对象就是伪装载体,用S表示。同样,S也是一个 长度等于

4、载体对象长度L(c)的序列5 o把载体划分成几个不相重叠的区域,在一个载体区域(而非单个元素)中存储一个 比特的信息。具体方法是,首先选择L(m)个不重叠区域,计算每一个区域的所有最低比 特的奇偶校验位p(I) = S LSB (c )mod 2。嵌入信息时,是在对应区域的奇偶校验位上 嵌入信息比特mt,如果奇偶校验位与mt不匹配,则将该区域中所有元素的最低比特位进 行翻转,导致奇偶校验位与m相同。优点:基于最低有效位的信息隐藏方法算法简单,容易实现,隐藏的容量较大,大 部分都是基于私钥隐藏或无密钥隐藏。缺点:其安全性不高,从隐蔽性的角度来讲,如果没有故意破坏或压缩等处理,隐藏的信 息不易觉察

5、。但从安全性的角度来讲,如果伪装对象上叠加了一些邹爱生,或为了适应 信息传输,对其进行了有损压缩或攻击者有意破换,都会擦除隐藏信息,使得接收者无 法正确恢复出秘密信息。改进之处:对秘密信息先加密后隐藏;隐藏信息时,多次重复嵌入,以提高信息的冗余度,从 而可以抵抗一些破坏;引入纠错编码技术,在秘密信息嵌入之前先进行纠错编码,这样, 即使出现少量的干扰,也可以正确恢复出秘密信息。3、隐藏算法的主要代码:void bitget(int* dataget,IplImage*in, int lendata)将提取出来的二进制数据保存到binSecret2.txt中FILE* fp4=fopen(binS

6、ecret2.txt”,w”);int loc=0;/当前正要提取的bit位在data中的位置for (int y=0;yheight;y=y+3)/uchar* ptr=(uchar*)(in-imageData+y*in-widthStep);for (int x=0;xwidth;x=x+3) 将每小块最低位平面替换为秘密信息cvSetImageROI(in,cvRect(x,y,3,3);int nump=0;for (int j=0;j9;j+)int pixel1=(int)cvGetReal1D(in,j);if (pixel1%2=1)nump+;/cvSetReal1D(sr

7、c,j,0);if (nump%2=1)奇偶校验为奇datagetloc=1;else if (nump%2=0)奇偶校验为偶datagetloc=0;cvResetImageROI(in);fprintf(fp4,%d”,datagetloc);if ( (loc+1)%8=0)fprintf(fp4,);loc+;if (loc=lendata)/已经提取到最后一位return;fclose(fp4);void bitset(IplImage* src,int* in,int lendata)int loc=0;/当前正要插入的bit为在data中的位置for (int y=0;yheig

8、ht;y=y+3)uchar* ptr=(uchar*)(src-imageData+y*src-widthStep);for (int x=0;xwidth;x=x+3) 将每小块最低位平面替换为秘密信息cvSetImageROI( src ,cvRect(x,y,3,3);int nump=0;for (int j=0;j9;j+)int pixel1=(int)cvGetReal1D(src ,j);if (pixel1%2=1)nump+;if (nump%2=1)奇偶校验为奇if(inloc=0)/而要隐藏的值最低位为/将个像素最低有效位翻转for(int i=0;i9;i+)int

9、 pixel2=(int)cvGetReal1D(src,i);if (pixel2%2=0)cvSetReal1D( src,i,pixel2+1);elsecvSetReal1D( src,i,pixel2-1);if (nump%2=0)奇偶校验为偶if (inloc=1)/而要隐藏的值为/将个像素最低有效位翻转for(int i=0;i9;i+)int pixel3=(int)cvGetReal1D(src,i);if (pixel3%2=0)cvSetReal1D( src,i,pixel3+1);elsecvSetReal1D( src,i,pixel3-1);cvResetlma

10、geROI(src);loc+;/printf(loc:%dn”,loc);if (loc=lendata)/已经隐藏到最后一位return;void Imgbit2byte(IplImage* out,int* in,int len)int bytelen=len/8;/返回大于或者等于num/8的最小整数int* byteArray=new intbytelen;memset(byteArray,0,bytelen*sizeof(int);for (int i=0;ilen;i+)byteArrayi/8+=(int)(ini*pow(2.0, double(7-i%8);for(int

11、j=0;j bytelen ;j+)cvSetReal1D(out,j, double(byteArray j);BOOL Imgbyte2bit(int* out,IplImage* in,int lendata)判断秘密信息长度是否过大if (!judge(src,lendata)return FALSE;FILE* fpSecret=fopen(binSecret.txt”,w”);int pixel=0;for(int i=0;i (7-i%8) &1;fprintf(fpSecret,%d”,outi);if ( (i+1)%8=0)fprintf(fpSecret,);fclose

12、(fpSecret);return TRUE;void writeGrayImg(IplImage* img,FILE* fp)/将灰度图像的数据写到txt文件中。for (int y=0;yheight;y+)uchar* ptr=(uchar*)(img-imageData+y*img-widthStep);for (int x=0;xwidth;x+)fprintf(fp,%d ”,ptrx);fprintf(fp,n);BOOL judge(IplImage* img,int datalen)/判断秘密信息长度是否过大if (datalen(img-width/3)*(img-heig

13、ht/3)return FALSE;return TRUE;4、运行效果图:g C:Win3 2crnd.exe= 口四、DCT信息隐藏技术1、原理在信号的频域(变换域)中隐藏信息要比在时域中嵌入信息具有更好的鲁棒性。一幅 图像经过时域到频域的变换后,可将待隐藏的信息嵌入到图像的显著区域,这种方法比 LSB以及其他一些时域水印算法更具有抗攻击的能力,而且还保持了对人类感官的不可 觉察性。常用的变换域方法有离散余弦变换、离散小波变换和离散傅里叶变换等。二维DCT变换是目前使用的最著名的有损数字图像压缩系统一JPEG系统的核心。因 此,在DCT域中隐藏信息,可以有效地抵抗有损压缩。DCT首先把图像

14、分成8X8的像素块,然后进行二维DCT变换,得到8X8的DCT系数, 这些DCT系数从低频到高频按照Zig-Zag次序排列,第一个值(左上角)为直流系数,其 余为交流系数。DCT系数中左上角为直流和低频部分,右下角为高频部分,中间区域为 低频系数。低频代表图像像素之间得的慢变化,高频代表快变化。因此,高频部分代表 图像中的噪声部分,这些部分很容易通过有损压缩或者滤波被去掉,而中低频部分则包 含了图像的大部分能量,是对人的视觉最重要的部分。而低频部分的改变有可能引起图 像较大的变动,所以,为了将隐藏的信息与载体图像的视觉重要部分绑定,一般都将隐 藏信息嵌入在载体的中频部分,达到既不引起视觉变化、

15、又不会被轻易破坏的目的。不需要原始载体的信息隐藏方法,主要是利用载体中两个特定数的相对大小来代表 隐藏信息。以DCT域为例,将载体图像分成8X8的块,每一块只精确地对一个秘密信息 比特进行编码。嵌入过程开始时,首先伪随机地选择一个图像块b,,它经二维DCT变换 后得到B,用它对第气个消息比特进行编码。发送者和接收者事先约定嵌入过程中使用的两个DCT系数的位置(为了达到隐藏的 健壮性和不可觉察性,应该在DCT的中频系数中选择),比如用(U ,V)和(U ,V )代表所1122选定的两个系数的坐标。嵌入过程为:如果 就代表隐藏信息” 1”,如果B (U , V ) B (U , V )就代表隐藏信

16、息”0”。如果需要隐藏的信息位为1,但是 i 11 i 22B (u ,V) B (U , V)那么就把这两个系数交换,最后发送者做二维逆DCT变换,将图像变11 i 22回空间域进行传输。提取算法:接收者接收到图像后,同样进行二维DCT变换,并且比较每一块中约定位置的DCT 系数,根据其相对大小,得到隐藏信息的比特串,从而恢复出秘密信息。3、部分代码void dctProc(IplImage *dct_Img)/ffidct_Img分成n个X8的块,分别对它们进行dct变换/IplImage *tmp=cvCreateImage(cvGetSize(dct_Img),IPL_DEPTH_64

17、F,1);for (int y=0;yheight;y+=8)for (int x=0;xwidth;x+=8)cvSetImageROI(dct_Img,cvRect(x,y,8,8);cvDCT(dct_Img,dct_Img,CV_DXT_FORWARD);cvResetImageROI(dct_Img);void dct_InverseProc(IplImage *in)把dct_Img分成n个X8的块,分别对它们进行dct逆变换IplImage *tmp=cvCreateImage(cvGetSize(in),IPL_DEPTH_64F,1);for (int y=0;yheight

18、;y+=8)for (int x=0;xwidth;x+=8)cvSetImageROI(in,cvRect(x,y,8,8);cvDCT(in,in,CV_DXT_INVERSE); cvResetImageROI(in);BOOL judge(IplImage* img,int datalen)/判断秘密信息长度是否过大if (datalen(img-width/8)*(img-height/8)return FALSE;return TRUE;BOOL Imgbyte2bit(int* out,IplImage* in,int lendata)判断秘密信息长度是否过大if (!judge

19、(src,lendata)return FALSE;FILE* fpSecret=fopen(binSecret.txt”,w”);int pixel=0;for(int i=0;i (7-i%8) &1;fprintf(fpSecret,%d”,outi);if ( (i+1)%8=0)fprintf(fpSecret,);fclose(fpSecret);return TRUE;void bitset(IplImage* dct_Img,int* in,int lendata)把dct_Img分成n个X8的块,分别对它们进行dct变换选择中频系数(5,2),(4,3);规定:如果每一个小块

20、中v alue(4,3)value(5,2)隐藏,否则隐藏int loc=0;/当前正要提取的bit位在data中的位置for (int y=0;yheight;y+=8)for (int x=0;xwidth;x+=8)cvSetImageROI(dct_Img,cvRect(x,y,8,8);选择(5,2)和(4,3)这一对系数,比较大小 double pix52,pix43;pix52=cvGetReal1D(dct_Img,8*4+1);pix43=cvGetReal1D(dct_Img,8*3+2);将原本小的小数调节的更小,使得系数的差别变大 if (inloc=1)/要隐藏的信息

21、为if(pix43pix52)cvSetReal1D(dct_Img,8*4+1,pix43);cvSetReal1D(dct_Img,8*3+2,pix52-alpha);pix52=cvGetReal1D(dct_Img,8*4+1);pix43=cvGetReal1D(dct_Img,8*3+2);if (pix52pix43)cvSetReal1D(dct_Img,8*3+2,pix43-alpha);else if (pix52=pix43)if (inloc=1)/要隐藏的信息为cvSetReal1D(dct_Img,8*4+1,pix52-alpha);else if (inlo

22、c=0)/要隐藏的信息为cvSetReal1D(dct_Img,8*3+2,pix43-alpha);cvResetImageROI(dct_Img);loc+;if (loc=lendata)/已经隐藏到最后一位return;BOOL bitget(int* dataget,IplImage* dct_Img,int lendata)把dct_Img分成n个X8的块,分别对它们进行dct变换选择中频系数(5,2),(4,3);规定:如果每一个小块中v alue(4,3)value(5,2)隐藏,否则隐藏将提取出来的二进制数据保存到binSecret2.txt中FILE* fp6=fopen(

23、binSecret2.txt”,w”);int loc=0;/当前正要提取的bit位在dataget中的位置for (int y=0;yheight;y+=8)for (int x=0;xwidth;x+=8)cvSetImageROI(dct_Img,cvRect(x,y,8,8);选择(5,2 )和(4,3)这一对系数,提取秘密信息cvDCT(dct_Img,dct_Img,CV_DXT_INVERSE);/这一步非常重要 double pix52,pix43;pix52=cvGetReal1D(dct_Img,8*4+1);pix43=cvGetReal1D(dct_Img,8*3+2)

24、;if (pix43pix52)datagetloc=1;else if (pix43pix52)datagetloc=0;if (pix43=pix52)printf(函数 bitget 中有错 n);return FALSE;cvResetImageROI(dct_Img);fprintf(fp6,%d”,datagetloc);if ( (loc+1)%8=0) fprintf(fp6,);loc+;if (loc=lendata)/已经提取秘密信息到最后一位return TRUE;fclose(fp6);void Imgbit2byte(IplImage* out,int* in,in

25、t len)int bytelen=len/8;/返回大于或者等于num/8的最小整数int* byteArray=new intbytelen;memset(byteArray,0,bytelen*sizeof(int);for (int i=0;ilen;i+)byteArrayi/8+=(int)(ini*pow(2.0, double(7-i%8);for(int j=0;j width*4,in-height*2),in-depth,in-nChannels); for (int y=0;yheight;y+=in-height)for(int x=0;xwidth;x+=in-width)cvSetImageROI(out,cvRect(x,y,in-width,in-height);cvCopy(in,out);cvResetImageROI(out);return out;4、效果图五:结论通过本次实验我学会用opencv这个工具编写一些简单的图片处理方面的程序。学 会了用LSB及DCT技术加密图像。对自己的编程能力有一定的提升。实验中遇到的问题 不少,最让我印象深刻的是动态数组分配的一个小问题话费了我大概4个小时的时间, 足以证明对c语言语法知识掌握的不够好。最后感谢老师能耐心解答我提出的疑问。也希望以后的自己能再接再厉、以虚心、 沉着的态度学好编程。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号