华北电力大学实验报告实验名称基于LSB及DCT技术的信息隐藏技术课程名称信息隐藏技术专业班级:信安1001班学生姓名:学号:201009040成绩:指导教师:袁和金实验日期:2013.5.9(实验报告如打印,纸张用A4,左装订;页边距:上下2.5cm,左2.9cm,右2.1cm;字体:宋体小四号,1.25倍行距。)验证性、综合性实验报告应含的主要内容:一、实验目的及要求二、所用仪器、设备三、实验原理四、实验方法与步骤五、实验结果与数据处理六、讨论与结论(对实验现象、实验故障及处理方法、实验中存在的问题等进行分析和讨论,对实验的进一步想法或改进意见)七、所附实验输出的结果或数据设计性实验报告应含的主要内容:一、设计要求二、选择的方案三、所用仪器、设备四、实验方法与步骤五、实验结果与数据处理六、结论(依据“设计要求”)七、所附实验输出的结果或数据*封面左侧印痕处装订一、实验目的及要求学会把把一个有意义的信息(秘密信息)隐藏在另一个称为载体(Cover)的信息(非机密信息)中得到隐蔽载体(StegoCover)。本实验是借助图片这个载体借助LSB(最低有效位)及DCT(离散余弦变换)两种思想,把一个秘密图像信息进行隐藏,并最终还原。二、所用仪器、设备一台PC、MicrosoftVisualstudio2008编辑环境。三、基于最低有效位的信息隐藏1、原理:每个像素值为8bit二进制值,表示该点亮度。不同位平面对视觉影响不同。人的视觉和听觉系统对于图像和声音的最低比特位是不敏感的。因此,可以利用这些位置隐藏信息。设c表示载体对象,ic表示载体对象的取样值。ic的取值范围根据载体信号的不同而不同。对于二值图像,其值为0或1,对于量化的图像或声音,它的可能取值是0到255的整数,对于归一化的图像或声音,可能取值为[-1,1]的任意值。载体的大小用L(c)表示。要隐藏的秘密信息用序列im表示,L(m)表示其长度。由于任何秘密信息(如口令、实现、徽标)都可以转化为比特串,所以一般都假定im的取值为0或1。将秘密信息嵌入载体后,输出的对象就是伪装载体,用S表示。同样,S也是一个长度等于载体对象长度L(c)的序列is。把载体划分成几个不相重叠的区域,在一个载体区域(而非单个元素)中存储一个比特的信息。具体方法是,首先选择L(m)个不重叠区域,计算每一个区域的所有最低比特的奇偶校验位。嵌入信息时,是在对应区域的奇偶校验位上嵌入信息比特im,如果奇偶校验位与im不匹配,则将该区域中所有元素的最低比特位进行翻转,导致奇偶校验位与im相同。2、分析与总结:优点:基于最低有效位的信息隐藏方法算法简单,容易实现,隐藏的容量较大,大部分都是基于私钥隐藏或无密钥隐藏。缺点:其安全性不高,从隐蔽性的角度来讲,如果没有故意破坏或压缩等处理,隐藏的信息不易觉察。但从安全性的角度来讲,如果伪装对象上叠加了一些邹爱生,或为了适应信息传输,对其进行了有损压缩或攻击者有意破换,都会擦除隐藏信息,使得接收者无法正确恢复出秘密信息。改进之处:对秘密信息先加密后隐藏;隐藏信息时,多次重复嵌入,以提高信息的冗余度,从而可以抵抗一些破坏;引入纠错编码技术,在秘密信息嵌入之前先进行纠错编码,这样,即使出现少量的干扰,也可以正确恢复出秘密信息。IjjcLSBIp2mod)()(3、隐藏算法的主要代码:voidbitget(int*dataget,IplImage*in,intlendata){//将提取出来的二进制数据保存到binSecret2.txt中FILE*fp4=fopen(binSecret2.txt,w);intloc=0;//当前正要提取的bit位在data中的位置for(inty=0;yin-height;y=y+3){//uchar*ptr=(uchar*)(in-imageData+y*in-widthStep);for(intx=0;xin-width;x=x+3){//将每小块最低位平面替换为秘密信息cvSetImageROI(in,cvRect(x,y,3,3));intnump=0;for(intj=0;j9;j++){intpixel1=(int)cvGetReal1D(in,j);if(pixel1%2==1){nump++;}//cvSetReal1D(src,j,0);}if(nump%2==1){//奇偶校验为奇dataget[loc]=1;}elseif(nump%2==0){//奇偶校验为偶dataget[loc]=0;}cvResetImageROI(in);fprintf(fp4,%d,dataget[loc]);if((loc+1)%8==0)fprintf(fp4,);loc++;if(loc==lendata)//已经提取到最后一位{return;}}}fclose(fp4);}voidbitset(IplImage*src,int*in,intlendata){intloc=0;//当前正要插入的bit为在data中的位置for(inty=0;ysrc-height;y=y+3){uchar*ptr=(uchar*)(src-imageData+y*src-widthStep);for(intx=0;xsrc-width;x=x+3){//将每小块最低位平面替换为秘密信息cvSetImageROI(src,cvRect(x,y,3,3));intnump=0;for(intj=0;j9;j++){intpixel1=(int)cvGetReal1D(src,j);if(pixel1%2==1){nump++;}}if(nump%2==1){//奇偶校验为奇if(in[loc]==0)//而要隐藏的值最低位为{//将个像素最低有效位翻转for(inti=0;i9;i++){intpixel2=(int)cvGetReal1D(src,i);if(pixel2%2==0)cvSetReal1D(src,i,pixel2+1);elsecvSetReal1D(src,i,pixel2-1);}}}if(nump%2==0){//奇偶校验为偶if(in[loc]==1)//而要隐藏的值为{//将个像素最低有效位翻转for(inti=0;i9;i++){intpixel3=(int)cvGetReal1D(src,i);if(pixel3%2==0)cvSetReal1D(src,i,pixel3+1);elsecvSetReal1D(src,i,pixel3-1);}}}cvResetImageROI(src);loc++;//printf(loc:%d\n,loc);if(loc==lendata)//已经隐藏到最后一位{return;}}}}voidImgbit2byte(IplImage*out,int*in,intlen){intbytelen=len/8;//返回大于或者等于num/8的最小整数int*byteArray=newint[bytelen];memset(byteArray,0,bytelen*sizeof(int));for(inti=0;ilen;i++){byteArray[i/8]+=(int)(in[i]*pow(2.0,double(7-i%8)));}for(intj=0;jbytelen;j++){cvSetReal1D(out,j,double(byteArray[j]));}}BOOLImgbyte2bit(int*out,IplImage*in,intlendata){//判断秘密信息长度是否过大if(!judge(src,lendata)){returnFALSE;}FILE*fpSecret=fopen(binSecret.txt,w);intpixel=0;for(inti=0;ilendata;i++){pixel=(int)cvGetReal1D(in,i/8);out[i]=(pixel(7-i%8))&1;fprintf(fpSecret,%d,out[i]);if((i+1)%8==0)fprintf(fpSecret,);}fclose(fpSecret);returnTRUE;}voidwriteGrayImg(IplImage*img,FILE*fp){//将灰度图像的数据写到txt文件中。for(inty=0;yimg-height;y++){uchar*ptr=(uchar*)(img-imageData+y*img-widthStep);for(intx=0;ximg-width;x++){fprintf(fp,%d,ptr[x]);}fprintf(fp,\n);}}BOOLjudge(IplImage*img,intdatalen){//判断秘密信息长度是否过大if(datalen(img-width/3)*(img-height/3)){returnFALSE;}returnTRUE;}4、运行效果图:四、DCT信息隐藏技术1、原理在信号的频域(变换域)中隐藏信息要比在时域中嵌入信息具有更好的鲁棒性。一幅图像经过时域到频域的变换后,可将待隐藏的信息嵌入到图像的显著区域,这种方法比LSB以及其他一些时域水印算法更具有抗攻击的能力,而且还保持了对人类感官的不可觉察性。常用的变换域方法有离散余弦变换、离散小波变换和离散傅里叶变换等。二维DCT变换是目前使用的最著名的有损数字图像压缩系统—JPEG系统的核心。因此,在DCT域中隐藏信息,可以有效地抵抗有损压缩。DCT首先把图像分成8X8的像素块,然后进行二维DCT变换,得到8X8的DCT系数,这些DCT系数从低频到高频按照Zig-Zag次序排列,第一个值(左上角)为直流系数,其余为交流系数。DCT系数中左上角为直流和低频部分,右下角为高频部分,中间区域为低频系数。低频代表图像像素之间得的慢变化,高频代表快变化。因此,高频部分代表图像中的噪声部分,这些部分很容易通过有损压缩或者滤波被去掉,而中低频部分则包含了图像的大部分能量,是对人的视觉最重要的部分。而低频部分的改变有可能引起图像较大的变动,所以,为了将隐藏的信息与载体图像的视觉重要部分绑定,一般都将隐藏信息嵌入在载体的中频部分,达到既不引起视觉变化、又不会被轻易破坏的目的。不需要原始载体的信息隐藏方法,主要是利用载体中两个特定数的相对大小来代表隐藏信息。以DCT域为例,将载体图像分成8X8的块,每一块只精确地对一个秘密信息比特进行编码。嵌入过程开始时,首先伪随机地选择一个图像块ib,它经二维DCT变换后得到iB,用它对第im个消息比特进行编码。2、隐藏算法发送者和接收者事先约定嵌入过程中使用的两个DCT系数的位置(为了达到隐藏的健壮性和不可觉察性,应该在DCT的中频系数中选择),比如用),(11vu和),(22vu代表所选定的两个系数的坐标。嵌入过程为:如果就代表隐藏信息”1”,如果Bi),(11vuBi),(22vu就代表隐藏信息”0”。如果需要隐藏的信息位为1,但是Bi),(11vuBi),(22vu那么就把这两个系数交换,最后发送者做二维逆DCT变换,将图像变回空间域进行传输。提取算法:接收者接收到图像后,同样进行二维DCT变换,并且比较每一块中约定位置的DCT系数,根据其相对大小,得到隐藏信息的比特串,从而恢复出秘密信息。3、部分代码voiddctProc(IplImage*dct_Img){//把dct_Img分成n个X8的块,分别对它们进行dct变换//IplImage*tmp=cvCreateImage(cvGetSize(dct_Img),IPL_DEPTH_64F,1);for(inty=0;ydct_Img-height;y+=8){for(intx=0;xdct_Img-width;x+=8){cvSetImageROI(dct_Img,cvRect(x,y,