实验目的
理解卡方分析[1]的原理,采用其攻击 Jsteg 算法[2],并验证 OutGuess 算法 [3]的改进。
原理说明
卡方分布
解释
卡方分布 ($\chi^2$分布)是概率论与统计学中常用的一种概率分布。$k$个独立的标准正态分布变量的平方和服从自由度为$k$的卡方分布。卡方分布常用于假设检验和置信区间的计算。
数学定义
若$k$个随机变量$z_1,z_2\cdots,z_k$相互独立,且数学期望为$0$,方差为$1$(即服从标准正态分布),则随机变量$X=\sum_{n=1}^kZ_n^2$服从自由度为$k$的的$\chi^2$分布,记作:
\[X~\chi^2(k)\]概率密度函数
卡方分布的概率密度函数$f_k(x)$为:
\[f_k(x)=\cfrac{1}{2^{\frac k2}\Gamma(\frac k2)}x^{\frac k2-1}e^{\frac{-x}2}\]当$k\le0$时,$f_k(x)=0$
$\Gamma(x)$ 为伽马函数:
\[实数:\Gamma(x)= (n-1)!\] \[复数:\Gamma(x)= \int_0^\infty t^{z-1}e^{-t}dt\]部分自由度下的密度分布函数
均值与方差
假设$\chi^2(k)$为自由度为$k$的卡方分布:
\[E(\chi^2(k))=k\] \[Var(\chi^2(k))=2k\]卡方分布表
下图 $p$ 越小置信度越高,分布约正常。
\[p =\int_T^\infty f_k(t)dt\]分析代码修改
根据提供的 $p$ 值提取算法进行了一定的修改,原分析的 $DCT$ 系数区间只能连续。
现将 $var$ 参数修改为要求输入一个偶数长度的数组,其两个一对,且要求每对之前的闭合区间长度为偶数。
function p = analysis(imgPath, var)
jobj = jpeg_read(imgPath); % 图片读取
zall = reshape(jobj.coef_arrays{1,1},1,size(jobj.coef_arrays{1,1},1)*size(jobj.coef_arrays{1,1},2));
% 连接好DCT系数
z = zall;
advh = [];
len = length(var)/2; % 计算有多少个区间
for i = 1:len
x = advh;
y = histc(z,var(i*2-1):var(i*2)); % 计算每个区间内系数的出现次数
advh = [x,y]; % 将所有区间计数结果拼接
end
pairnum = floor( length(advh) / 2); % 计算值对总数
t = length(advh);
y = ones(pairnum,1);
yy = ones(pairnum,1);
for j = 1:1:pairnum
if advh(2*j-1)+advh(2*j) > 0
y(j) = ( advh(2*j-1) + advh(2*j) ) / 2; % 计算值对平均值
yy(j) = max(advh(2*j-1),advh(2*j); % 计算值对最大值
else
t = t - 2; % 计算有效系数的数目
end
end
xsq = sum( (y(:) - yy(:)).^ 2 ./ y(:) );
% (yy(j)-y(j))^2/y(j) 服从标准正态分布,则t/2有效值相加符合自由度为t/2卡方分布
p = 1 - chi2cdf( xsq, t/2);
% p越大越说明可能存在隐写,因为chi2cdf函数是从0到xsq积分(即正常的可能性)
实验步骤
进行分析参数配置,设置卡方分析的量化 $DCT$ 系数检测区间;
- 根据基本原理,系数 $-1,0,1$ 三个系数不会被使用,DCT上限绝对值设置在 $1000$ 左右
- 对于正负两边,分别考虑其值对的对应情况
- 单边的DCT检测区间也是一个可以进行试验的目标
- 对于负数部分,设置 $DCT$ 检测区间 $[-1000,-3],[-999,-2]$,检测其负数值对的对应情况
- 对于正数部分,设置 $DCT$ 检测区间 $[2,999],[3,1000]$,检测其正数区间值对的对应情况
- 确定值对和范围后,联合正负区间进行验证
- 攻击 Jsteg 算法,对于 Jsteg 算法产生的载体和隐写样本,计算它们的卡方分析值,验证卡方分析检测 LSB 类型隐写算法的有效性;
- $[-1000,-3]*****[-999,-2]$
由上面两个图可以发现在负值区左图有较好的鉴别能力,故负值区值对为$(-2i,-2i+1)$ - $[2,999]*****[3,1000]$
由上面两个图可以发现在正值区左图有识别能力,故正值区值对为$(2i,2i-1)$ - 验证$[-1000,-3]\cup[2,999]$的分别效果
在该种区间情况下,400个载体图片只有一个 $p$ 值为 $0.2992$,其它的全部为$0$,而载密载体图片$p$值全部非$0$,且大部分集中于$1$附近,达到了较好的区分效果
- $[-1000,-3]*****[-999,-2]$
攻击 OutGuess 算法,对于 OutGuess 算法产生的载体和隐写样本,计算它们的卡方分析值,验证 OutGuess 在安全性上的改进。
- $[-1000,-3]*****[-999,-2]$
由上面两个图可以发现在负值区左图有一定的鉴别能力,故负值区值对为$(-2i,-2i+1)$ - $[2,999]*****[3,1000]$
由上面两个图可以发现在正值区左图有识别能力,故正值区值对为$(2i,2i-1)$ - 验证$[-1000,-3]\cup[2,999]$的分别效果
在该种区间情况下,400个载体图片只有两个点 $p$ 值非0,其它的全部为$0$,而载密载体图片$p$值全部非$0$,且大部分集中于$1$附近,达到了一定的区分效果,但是没有Jsteg分辨能力强
- $[-1000,-3]*****[-999,-2]$
实验要求
- 实验报告必须包含对卡方分析的原理说明;
- 实验报告必须包含详细的实验步骤描述,并配有相应的截图;
- 实验报告必须详实记录具体的卡方分析配置参数,并通过散点图展示各个测试集的卡方分析结果;
- 最终上传的压缩包中,除实验报告外,还应包含:实验过程中所编写的所有源代码。
实验提示
- samples.rar 包含本次实验所需的全部样本,其中共有 4 个文件夹,文件 夹命名格式为“BOSS_StegoAlg_EmbedRate”,StegoAlg 表示算法名称,EmbedRate 代表嵌入率,例如,文件夹“BOSS_OTGS_500”包含的是采用 OutGuess 隐写算法,在0.5bpac 的嵌入率下制备的隐写样本;
- 卡方分析的 matlab 函数接口为 p = analysis(imgPath, var),其中,imgPath 表示待分析图像的路径,var 代表配置参数,其为结构体变量,成员包括 WinDown, WinUp,[WinDown, WinUp]表示进行卡方分析的量化 DCT 系数检测区间。
参考文献
1. Westfield, A. and Pfitzmann A., “Attacks on Steganographic Systems“, Proc. 3rd Info. Hiding Workshop, Dresden, Germany, September 28-October 1, 1999, pp. 61-75.
2. Jsteg, https://zooid.org/~paul/crypto/Jsteg/
3. N. Proves. Defending against statistical steganalysis. The 10th USENIX Security Symposium, Washington, DC, USA, August 2001, pp.323-335.