F4 (Стеганографический алгоритм)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 00:17, 18 ноября 2016.

F4 — один из алгоритмов стеганографии для встраивания данных в изображения JPEG.

Принцип работы алгоритма

Алгоритм F4 устраняет недостатки алгоритма F3, отображая отрицательные коэффициенты на инвертированное стеганографическое значение: четные отрицательные коэффициенты представляют стеганографическую единицу, нечетные отрицательные коэффициенты – ноль, четные положительные представляют ноль и нечетные положительные – единицу.

Пусть и – две случайные величины, описывающие количество коэффициентов до и после встраивания сообщения. означает вероятность появления коэффициента с заданным значением для исходного изображения, а — вероятность появления коэффициента с заданным значением после встраивания. Можно записать 2 неравенства

Если биты сообщения распределены равномерно, то

При вычитании из получается равенство , точно так же при вычитании из получается

Из можно сделать вывод, что правые части и положительны. Тогда первое свойство для можно записать в следующем виде:

При добавлении к получается следующее неравенство

Тогда можно сделать вывод, что правая часть равенства больше, чем правая часть . Поэтому левая часть дает второе свойство для

Таким образом, частота появления коэффициентов уменьшается с увеличением абсолютного значения этих коэффициентов:

Рис. 1. Гистограмма JPEG коэффициентов в интерпретации F4

На рис. 1 каждые 2 столбца одинаковой высоты представляют коэффициенты с инверсным стеганографическим значением.

Программная реализация алгоритма F4 на языке Java

Ниже представлен исходный код на языке Java, описывающий функцию встраивания F4 в упрощенном виде. Массив coeff[] содержит все коэффициенты JPEG контейнера.

int nextBitToEmbed = embeddedData.readBit();
for (int i=0; i<coeff.length; i++) {
	if (i%64 == 0) continue; // skip DC coefficients
	if (coeff[i] == 0) continue; // skip zeroes
 	if (coeff[i] > 0) {
		if ((coeff[i]&1) != nextBitToEmbed)
		     coeff[i]--; // decrease absolute value
	} else {
		if ((coeff[i]&1) == nextBitToEmbed)
		     coeff[i]++; // decrease absolute value
 	}
	if (coeff[i] != 0) { //successfully embedded
		if (embeddedData.available()==0)
		    break; // end of embeddedData
		nextBitToEmbed = embeddedData.readBit();
	}
}

См. также

Литература

  1. Andreas Westfeld. F5 – A Steganographic Algorithm: High Capacity Despite Better Steganalysis / In Ira S. Moskowitz, editor, Information Hiding, 4th International Workshop, volume 2137 of Lecture Notes in Computer Science, pages 289-302. Springer, 2001.