基于DCT的JSteg隐写及分析.docx
- 文档编号:3581210
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:14
- 大小:368.40KB
基于DCT的JSteg隐写及分析.docx
《基于DCT的JSteg隐写及分析.docx》由会员分享,可在线阅读,更多相关《基于DCT的JSteg隐写及分析.docx(14页珍藏版)》请在冰豆网上搜索。
基于DCT的JSteg隐写及分析
基于DCT的JSteg隐写及分析
一、摘要
JPEG是互联网上最为常见的一种图像格式,而DCT变换是JPEG压缩采用的重要技术之一,在DCT变换系数(DCT域)上隐藏信息是常见的数字隐写方式。
DCT(DiscreteCosineTransform,离散余弦变换)是一种实数域变换,其变换核为实数余弦函数。
作为DCT变换的方法之一,JSteg是一种采用JPEG图像作为载体的隐写软件,其算法实际上就是将空域LSB替换隐写应用到JPEG图像上。
主要思想是:
将一个二进制位的隐秘信息嵌入到量化后的DCT系数的LSB上,但对原始值为.1、0、1的DCT系数例外,提取隐秘信息时,只需将载密图像中不等于.1、O、l的量化DCT系数的LSB逐一取出即可。
JSteg算法虽然简单易用,但由于其会引起系数直方图出现值对区域相等的特点,用卡方分析可以很容易的检测到秘密信息的存在,因此其安全性较差。
关键词:
JPEGDCTJSteg实数余弦函数
BasedontheanalysisofDCTsteganography
Abstract
JPEGistheInternet'smostcommonimageformat,JPEGcompressionandtheDCTisoneofthekeytechnologyusedintheDCTcoefficients(DCTdomain)onthehiddeninformationisacommondigitalsteganographyway.DCT(DiscreteCosineTransform,DiscreteCosineTransform)isarealdomaintransform,whichisarealnumbercosinetransformkernelfunctions.AsonemethodofDCT,JStegaJPEGimageusingsteganographysoftwareasacarrier,thealgorithmwillactuallyreplaceairspaceLSBsteganographyappliedtoJPEGimages.Themainideais:
toembedabitofsecretinformationtotheLSBofquantizedDCTcoefficients,buttheoriginalvalue.1,0,1DCTcoefficientsexceptionwhenextractinghiddeninformation,simplystegoimageisnotequal.1,LSBO,lquantizedDCTcoefficientscanbetakenoutonebyone.JStegalgorithmissimpleandeasytouse,butbecauseitwillcausethevalueofthecoefficientequaltotheregionalcharacteristicsofthehistogramappearschi-squareanalysiscaneasilydetectthepresenceofsecretinformation,sothesecurityispoor.
Keywords:
JPEGDCTJStegrealcosinefunction
二、引言
作为信息安全的分支,隐写技术主要是针对图片等外在特征较为明显的载体写入想要隐藏的信息,用以达到信息隐藏的目的。
而JPEG是互联网上最为常见的一种图像格式,而DCT变换是JPEG压缩采用的重要技术之一,在DCT变换系数(DCT域)上隐藏信息是常见的数字隐写方式。
DCT(DiscreteCosineTransform,离散余弦变换)是一种实数域变换,其变换核为实数余弦函数。
对一幅图像进行离散余弦变换后,许多有关图像的重要可视信息都集中在DTC变换的一小部分系数中。
因此,DTC是有损图像压缩JPEG的核心,同时也是所谓的“变换域信息隐藏算法”的主要“变换域”之一。
因此图像处理运用二维离散余弦变换,所以直接介绍二维DCT变换。
JSteg是最早在JPEG图像中进行隐写的方法之一,由于该方法使得系数直方图有明显的改变,随后即出现了F3隐写,F4隐写,F5隐写,OutGuess隐写和MB隐写等等。
本文对JSteg的隐写做着重的分析和研究。
三、JSteg隐写
3.1JSteg简介
ISO和前CCITT于1986年底成立“联合图像专家组”,研究静止图像压缩算法的标准化,至1992年正式完成了用于各种分辨率和格式的连续色调图像的ISO/IEC.10918标准(ITU.TT.81建议),简称JPEG标准。
JPEG压缩一般要经过四个步骤:
颜色模式转换及采样、DCT、量化、编码,其中,DCT作为其中的一部分,是其重要的技术之一。
它又包含JSteg隐写,F3隐写,F4隐写,F5隐写等等,JSteg是最早用于JPEG图像的隐写工具,该算法是由D。
Upam提出的,是指将空域上LSB替换隐写到JPEG图像上。
3.2JSteg算法
JSteg的算法,或称其主要思想是将秘密消息嵌入在量化后的DcT系数的最低比特位上,但对原始值为O、1的DCT系数不进行嵌入。
提取秘密消息时,只需将载密图像中不等于0、l的量化DcT系数的LSB取出即可。
如图1.1所示:
图1.1
秘密消息嵌入位置的选择方法有顺序嵌入法和随机间隔法。
顺序嵌入的JSteg算法简单,易实现,但是有严重的安全问题,这是因为载体图像中修改了的部分和未修改的部分,具有不同的统计特性,很容易被检测出含有秘密消息。
随机间隔法,首先要生成一个伪随机序列作为嵌入间隔,调整伪随机序列的均值,可以使得秘密消息随机地散布在整幅图像中,进而提高了安全性。
其具体算法步骤如下:
(1)选择掩护图像,并将图像区分成不重迭的8*8区块
(2)将每个区块利用离散余弦转换成频率域系数
(3)利用用户选定的量化表对频率域进行量化
(4)对秘密信息进行Z字性扫描,并对除了0和1之外的DCT系数的最低位加以替换
(5)进行熵编码,产生JPEG隐写图像
或者这样说,定义H为载体图像中DCT系数的数目,定义h(X=x)为载体图像中DCT系数等于x的数目。
由算法的描述可知,两种Jsteg算法的最大容量均为H-h(x=0)-h(x=1)比特。
定义h(Y=y)为载密图像中DCT系数等于y的数目。
由于嵌入的秘密信息一般为密文,其O、l比特出现的概率近似相等,都为O.5左右,那么嵌入达到最大容量时,有
h(Y=2)=0.5h(X=3)=h(Y=3)
也就是说载密图像中DCT系数为2的数目约等于DCT系数为3的数目,同理DCT系数为2i(i!
=0)的数目与DCT系数为2i+1(i!
=0)的数目也是大约相等的,所以载密图像的DcT系数直方图中会出现值对现象,与载体图像的直方图形成了明显的差异。
利用这种特性,就可以很容易地检测出秘密消息的存在。
3.3JSteg隐写过程
JSteg的具体嵌入过程如下:
(1)部分解码JPEG图像,得到二进制存储的AC系数,判断该AC系数是否等于1或0,若等于则跳过该AC系数,否则,执行下一步。
(2)判断二进制存储的AC系数的LSB是否与要嵌入的秘密信息比特相同,若相同,则不对其进行修改,否则执行下一步。
(3)用秘密信息比特替换二进制存储的AC系数的LSB,将修改后的AC系数重新编码得到隐秘JPEG图像。
JSteg的提取过程如下:
部分解码JPEG图像,得到二进制存储的AC系数,取出不等于1和0的AC系数的LSB,排列后组成秘密信息。
在JSteg中,关于DCT系数中0和1的处理
(1)DCT系数中“0”的比例最大(一般可达到60%以上,取决于图像质量和压缩因子),压缩编码是利用大量出现连零实现的,如果改变DCT系数中“0”的话,不能很好的实现压缩。
(2)DCT系数中的“1”若变成“0”,由于接受端无法区分未使用的“0”和嵌入消息后得到的“0”,从而无法实现秘密信息的提取。
四、JSteg隐写检测
通用隐写分析算法的关键在于寻找对隐秘信息嵌入敏感的统计特征,设计合适的判别方案来区分载体图像和载密图像。
JPEG图像具有两个基本统计特性:
直方图特性和分块效应,大多针对JPEG图像的隐写分析算法都是利用这两个特性来设计的。
研究者已提出了几种较有效的基于JPEG图像的通用隐写分析技术算法,下面我们主要研究讨论两种。
4.1基于小波特征函数统计矩的隐写分析
基于小波特征函数统计矩的隐写分析方法f62】是由Shi等提出的,是一种通用型隐写分析方法,它将小波子带的特征函数统计矩作为隐写分析的特征。
该隐写分析系统涉及到两个主要问题:
(1)特征向量的确定。
首先对待检测图像进行两层Haar小波变换,包括图像本身在(这里看做子带LLo),
将获得13个子带:
然后计算每个子带对应直方图的DFT,即得到了特征函数。
最后根据下列式子得到一阶、二阶和三阶矩:
其中,
表示第j个频率成分的幅值,n取1,2,3。
这样就构建了一个39维的特
征向量。
(2)分类器的选择。
Bayes分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。
由于嵌入的隐秘信息一般服从高斯分布或近似于高斯分布,因此选用Bayes分类器。
用
表示第i幅图像的39维特征向量,
分别表示原始图像集和隐秘图像集,其均值向量和协方差矩阵分别由
和
表示,Bayes分类描述如下:
A最大后验概率
其中,N表示标准高斯分布
B.决策函数
大量实验证明,基于小波特征函数统计矩的隐写分析方法很有效,检测率很高。
4.2基于支持向量机的多特征盲检测算法
我们知道,现在研究的隐写分析都是唯载密攻击,即载体图像未知的检测,所以我们要构造一近似于载体图像的图像。
由于JPEG图像在进行压缩时,其DCT变换和量化都是在sxs的子块上进行的,所以块与块之间存在一定的不连续性,即所谓的分块效应,枝准图像的获得:
首先将载密图像J1解压到空域,然后在每个方向上裁剪掉4个像素点,最后用与原图像相同的的量化矩阵重新压缩图像得到图像如J2,如图3.1所示,J2近似为原载体图像,称为校准图像。
图3.1标准图像的产生
定义图像的特征函数为F(如直方图函数,共生矩阵函数等),则特征值f由下式产生:
其中Ll数定义为一个向量(或矩阵)所有元素的绝对值总和。
当然,最简单的还是基于JSteg的卡方检测,因为JSteg的隐藏本身就是和LSB隐写的构造差不多,只不过隐写的方法不一样而已,既然LSB隐写可以用卡方检测,JSteg当然也可以,因为在前面提到过,所以在此就不再赘述。
五、总结
JSteg隐写算法是一种较为简单的算法,其主要是基于DCT系数的变换进行数字隐写,具有简单,易于实现,且其隐藏容量相当客观,其相对容量(嵌入容量与文件自身的大小比值)与空域LSB方法相当,很适合初学者使用。
不过,对于其检测而言,由于其DCT系数在隐写前后统计直方图的异常,可以很容易的被卡方攻击方法检测出秘密信息的存在,因此,安全不具有一定的保障性,对于初学者而言,因为不会用其隐藏较为秘密的信息,故仍然可以采用JSteg来对DCT隐写来进行学习,掌握了这一种方法后,就可以向更高级的隐写方法跳转学习。
【参考文献】
[1]王丽娜,焕国.信息隐藏技术与应用.:
大学,2003,1-13
[2]JanJK,TsengYM.Onthesecurityofimageencryptionmethod.InformationProcessingLetters,1996,60
(2):
261—265
[3]健乾.图像隐藏信息检测[D].大学,2005
[4]剑锋.信息隐藏的算法研究[D].复旦大学,2004
[5]BenderW,GruhlD,MorimotoN,etal.Techniquesfordatahiding[J].IBMSystemJournal,1996,35(3&4):
313-336
[6]王朔中,新鹏,开文.数字密写和密写分析:
互联网时代的信息战技术[M].:
清华大学,2005
[7]吴秋新,义先.信息隐藏技术——隐写术与数字水印[M].人民邮电,2001,9:
3-8
[8]王炳锡,琦,邓峰森.数字水印技术[M〕.电子科技大学,2003.
[9]StefanKatzenbeisser,FabienA..P.Peticolas编.吴秋新,钮心忻,义先,罗守山,晓兵,译.信息隐藏技术)隐写术与数字水印=Ml.:
人民邮电,2001.
[10]丁玮,齐东旭.数字图像变换及信息隐藏与伪装技术IJ].计算机学报,1998,21(9):
839~843
附录
JSteg隐写代码(matlab)
clc
clearall;%clearallvariablesfromprevioussessions
closeall;
covername=input('Enterimagefilenamewithextension:
','s');
messagename=input('Entermessageimagefilenamewithextension:
','s');
cover=imread(covername);
sz=size(cover);
rows=sz(1,1);
cols=sz(1,2);
colors=max(max(cover));
%r=1;
%fori=1:
rows
%forj=1:
3:
cols
%rgb(r,1)=cover(i,j);
%rgb(r,2)=cover(i,j+1);
%rgb(r,3)=cover(i,j+2);
%r=r+1;
%end
%end
%gray=rgb2gray(rgb);
%cover=gray;
fd=fopen(messagename,'r');
message=fgetl(fd);
messagelength=length(message);
figure
(1),imshow(cover);title('OriginalImage(CoverImage)');
%disp(message);
%cover=double(cover);
%message=double(message);
message=uint8(message);
coverzero=cover;
%disp(coverzero);
%coverzero=imread('GrayScale.bmp');
quant_multiple=1;
blocksize=8;
DCT_quantizer=...
[1611101624405161;...
1212141926586055;...
1413162440576956;...
1417222951878062;...
182237566810910377;...
243555648110411392;...
49647887103121120101;...
7292959811210010399];
%figure
(1)
%image(coverzero)
figure
(2);imshow(coverzero);
%colormap(map)
title('Originalimage');
%figure
(2)
%coverzero=coverzero-ceil(colors/2);
%figure
(2);imshow(coverzero);
pad_cols=(1-(cols/blocksize-floor(cols/blocksize)))*blocksize;
ifpad_cols==blocksize,pad_cols=0;end
pad_rows=(1-(rows/blocksize-floor(rows/blocksize)))*blocksize;
ifpad_rows==blocksize,pad_rows=0;end
forextra_cols=1:
pad_cols
coverzero(1:
rows,cols+extra_cols)=coverzero(1:
rows,cols);
end
cols=cols+pad_cols;%coverzeroisnowpad_colswider
forextra_rows=1:
pad_rows
coverzero(rows+extra_rows,1:
cols)=coverzero(rows,1:
cols);
end
rows=rows+pad_rows;%coverzeroisnowpad_rowstaller
forrow=1:
blocksize:
rows
forcol=1:
blocksize:
cols
DCT_matrix=coverzero(row:
row+blocksize-1,col:
col+blocksize-1);
DCT_matrix=DCT2(DCT_matrix);
%quantizeit(levelsstoredinDCT_quantizermatrix):
%DCT_matrix=floor(DCT_matrix...
%./(DCT_quantizer(1:
blocksize,1:
blocksize)*quant_multiple)+0.5);
DCT_matrix=round(DCT_matrix...
./(DCT_quantizer(1:
blocksize,1:
blocksize)*quant_multiple));
%DCT_matrix=round(DCT_matrix);
%placeitintothecompressed-imagematrix:
jpeg_img(row:
row+blocksize-1,col:
col+blocksize-1)=DCT_matrix;
end
end
figure(3);hist(jpeg_img);
figure(4);imshow(jpeg_img);
bitlength=1;
%messagebit=zeros(messagelength*8);
fori=1:
messagelength
%imbed=7;
forimbed=1:
8
messageshift=bitshift(message(i),8-imbed);
showmess=uint8(messageshift);
showmess=bitshift(showmess,-7);
messagebit(bitlength)=showmess;
bitlength=bitlength+1;
%coverindex=coverindex+1;
end
end
%embedding
i=1;
forrow=1:
rows
forcol=1:
cols
x=jpeg_img(row,col);
if(x~=0)&&(x~=1)
r=mod(x,2);
ifr==0%
ifmessagebit(i)==1
x=x+1;
end
else
ifmessagebit(i)==0
x=x-1;
end
end
i=i+1;
end
jpeg_img(row,col)=x;
ifi==bitlength
break;
end
end
ifi==bitlength
break;
end
end
figure(5);hist(jpeg_img);
%Reconstructingimage
recon_img=coverzero-coverzero;%zerothematrixforthereconstructedimage
forrow=1:
blocksize:
rows
forcol=1:
blocksize:
cols
IDCT_matrix=jpeg_img(row:
row+blocksize-1,col:
col+blocksize-1);
%IDCT_matrix=floor(idct2(IDCT_matrix.*((DCT_quantizer(1:
blocksize,1:
blocksize)*quant_multiple))-0.5));
%IDCT_matrix=floor(idct2(IDCT_matrix.*(DCT_quantizer(1:
blocksize,1:
blocksize)*quant_multiple)));
IDCT_matrix=round(idct2(IDCT_matrix.*(DCT_quantizer(1:
blocksize,1:
blocksize)*quant_multiple)));
recon_img(row:
row+blocksize-1,col:
col+blocksize-1)=IDCT_matrix;
end
end
%recon_img=recon_img+ceil(colors/2);
%coverzero=coverzero+ceil(colors/2);
%Clipoffpaddedrowsandcolumns
rows=rows-pad_rows;
cols=cols-pad_cols;
recon_img=recon_img(1:
rows,1:
cols);
figure(6);imshow(recon_img);
%disp(recon_img);
%recon_img=recon_img-ceil(colors/2);
pad_cols=(1-(cols/blocksize-floor(cols/blocksize)))*blocksize;
ifpad_cols==blocksize,pad_cols
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 DCT JSteg 分析