Проблема: идентификация вторичного сжатия изображения


Необходимо отличить оригинальный файл от пережатого (re-encoded). Повторное сжатие уничтожает доказательную ценность снимка в суде, нарушает цепочку хэшей и маскирует следы редактирования.

Причины


1. Сохранение после редактирования — любое повторное сохранение JPEG (Photoshop, Paint, соцсети) перекодирует DCT-коэффициенты.
2. Удаление метаданных — очистка EXIF/ICC-профилей часто совмещается с пересжатием.
3. Конвертация формата — PNG → JPEG или TIFF → JPEG гарантированно вносит артефакты lossy-кодека.

Решение


1. Анализ квантования (для JPEG)

Используй `jpeginfo` или `identify` из ImageMagick:
bash
jpeginfo -c image.jpg
<h2 id="vyvod-warning-non-optimal-jpeg-priznak-pereszhatiya">Вывод: &quot;WARNING: Non-optimal JPEG&quot; — признак пересжатия</h2>

identify -verbose image.jpg | grep -A 20 "Quality"
<h2 id="esli-quality-originalnomu-obychno-92-98-dlya-kamer-fayl-perezhat">Если quality ≠ оригинальному (обычно 92-98 для камер), файл пережат.</h2>


2. Проверка двойного JPEG (DJPEG)

Инструмент `jpeg2pix` из пакета `jpeg`:
bash
jpeg2pix -i image.jpg -o /dev/null 2>&1 | grep "double"
<h2 id="nalichie-double-quantize-pryamoe-ukazanie-na-povtornoe-szhatie">Наличие &quot;double quantize&quot; — прямое указание на повторное сжатие.</h2>


3. Статистический анализ DCT-гистограммы

Плагин для GIMP (`JPEG Artifact Detection`) или `foremost` + скрипт `dhash`:
python
<h2 id="python-s-pil-vychislenie-stat-momentov-dct">Python с PIL: вычисление стат. моментов DCT</h2>
from PIL import Image
import numpy as np
img = Image.open('image.jpg')
dct = np.fft.dctn(np.array(img.convert('L')))
<h2 id="vysokiy-koeffitsient-ekstsessa-kurtosis-5-pereszhatie">Высокий коэффициент эксцесса (kurtosis &gt; 5) = пересжатие</h2>


4. Анализ шумовой сигнатуры

Сравни среднюю яркость в 1×1 блоке (flat region):
bash
exiftool -b -jpegdigest image.jpg
<h2 id="esli-digest-menyaetsya-pri-kazhdom-peresohranenii-fayl-ne-originalen">Если digest меняется при каждом пересохранении — файл не оригинален.</h2>


5. Визуальная проверка через ELA (Error Level Analysis)

`foremsic-ela` из метапакета `autopsy`:
bash
forensic-ela image.jpg --output ela.png --scale 5
<h2 id="oblasti-s-otlichnym-ot-fona-urovnem-oshibok-povtornoe-sohranenie">Области с отличным от фона уровнем ошибок = повторное сохранение.</h2>


Критическое правило: никогда не сохраняй анализируемый файл через интерфейс (сохранение веб-браузером или соцсетями пережимает заново). Работай только с копией, используя `dd` или `cp --sparse=never`. Для цепочки доказательств фиксируй SHA-256 до начала анализа.