数字图像取证 - 基于文件格式的取证 2

Posted on Fri 01 May 2020 in Digital Image Forensics • 1 min read

二次量化(double quantization, double JPEG)

前面提到, JEPG是将位图(bit map)进行转制后利用量化操作$q_a(u) = \lfloor{\frac{u}{a}}\rfloor$, 而这一操作明显是一种有损操作. 那么当对任意图像进行修改之时, 还原回得位图必定不完全等于原始得位图, 随后得又一次压缩更会带来一定得损失以及一种特征. 这种特征可以令安全人员检测出该JPEG文件是否进行过二次编辑.

二次量化是指对JEPG文件进行还原时, 量化还原$q^{-1}_a(u) = \lfloor\frac{u}{a}\rfloor\times a$ 后再一次对图像进行量化, 故该行为可以被写为$q_{ab}(u) =\lfloor \lfloor{\frac{u}{a}}\rfloor\frac{a}{b}\rfloor$

下面用一组[0, 127]的正态分布数据来进行模拟实验。

In [1]:
import numpy as np 
import matplotlib.pyplot as plt 
# imports
var = np.random.randn(256, 256, 3)
#var = var.flatten()
print("var_shape:{}".format(var.shape))
print("var_min:{}".format(var.min()))
print("var_max:{}".format(var.max()))
print("rescale normal distribution")
var = (var - var.min())/(var.max()-var.min())*127
print("var_min:{}".format(var.min())) 

plt.hist(var.flatten(), bins='auto')
plt.show()
var_shape:(256, 256, 3)
var_min:-5.2071984908675155
var_max:4.825354925163632
rescale normal distribution
var_min:0.0

一次量化

直方图仍然保持着正态分布的趋势

In [2]:
var_3 = np.floor(var/3);
plt.hist(var_3.flatten(), bins='auto');
In [3]:
var_2 = np.floor(var/2);
plt.hist(var_2.flatten(), bins='auto');

二次量化

二次量化后的图形, 出现了某种特殊的周期性现象

In [4]:
var_2 = np.floor(var/2);
var_23 = np.floor((var_2*2)/3)
plt.hist(var_23.flatten(), bins='auto');
In [5]:
var_3 = np.floor(var/3);
var_32 = np.floor((var_3*3)/2);
plt.hist(var_32.flatten(), bins='auto');

按照相同的量化等级二次量化

原始图像仍然保持着正态分布的形状,在原书中并未对该现象进行过讨论。 也就是说经过二次量化的图像(被篡改),经过精心的设计(使用相同的量化等级恢复并压缩)可以使得这一方法并不能完美的适用于各种情况, 更何况是二次压缩实际上只是判断图像被篡改的必要条件。

In [6]:
var_3 = np.floor(var/3);
var_33 = np.floor((var_3*3)/3);
plt.hist(var_33.flatten(), bins='auto');
In [7]:
var_2 = np.floor(var/2);
var_22 = np.floor((var_2*2)/2);
plt.hist(var_22.flatten(), bins='auto');

数学证明

下面通过数学方式证明为什么经过2次量化(不同量化指标)的图像出现与原始压缩不同的直方图。 对于下界函数(floor)。$$\lfloor{z}\rfloor=m\Rightarrow m\leq\lfloor{z}\rfloor<m+1$$ 二次量化则存在性质$$v \leq\left\lfloor\frac{u}{b}\right\rfloor \frac{b}{a}<v+1 \quad \Leftrightarrow \quad \frac{a}{b} v \leq\left\lfloor\frac{u}{b}\right\rfloor<\frac{a}{b}(v+1)$$ 当$\lfloor{\frac{u}{b}}\rfloor$为整数时,上式可以利用上界函数(cell)进行改写$$\left[\frac{a}{b} v\right] \leq\left\lfloor\frac{u}{b}\right\rfloor \leq\left\lceil\frac{a}{b}(v+1)\right\rceil- 1$$ 故对于$u_{min}$以及$u_{max}$有 $$ \left\lfloor\frac{u_{\min }}{b}\right\rfloor=\left\lceil\frac{a}{b} v\right\rceil \quad \Rightarrow \quad u_{\min }=\left\lceil\frac{a}{b} v\right\rceil b $$

$$ \left\lfloor\frac{u_{\max }}{b}\right\rfloor =\left[\frac{a}{b}(v+1)\right]-1 \Rightarrow u_{\max } =\left(\left[\frac{a}{b}(v+1)\right]-1\right) b+(b-1)=\left[\frac{a}{b}(v+1)\right] b-1 $$

对于计算二次量化序列的直方图时令$H_{a b}(v)=\sum_{u=u_{\min }}^{u_{\max }} H(u)$。对于每一个直方图的盒$n(v)$其可以表示为 $$ n(v)=u_{\max }-u_{\min }+1=b\left(\left\lceil\frac{a}{b}(v+1)\right\rceil-\left\lceil\frac{a}{b} v\right\rceil\right) $$ 如上$n(v)=n(v+b)$,就此我们证明出其周期性的来源 最后我们用3-2二次量化(即原图量化等级为3,修改后我们按照量化等级为2对其进行压缩)对该方法进行进一步说明 $$ \begin{aligned} n(3 k+2) &=3\left(\left[\frac{2}{3}(3 k+3)\right]-\left[\frac{2}{3}(3 k+2)\right]\right) \\ &=3\left(2 k+2-2 k-\left[\frac{4}{3}\right]\right) \\ &=0 \end{aligned} $$ 故每$(3k+2)^{nd}$的盒中,其直方图数据为0