JPEG стеганографии
Если вы хотите, чтобы сохранить изображение в формате JPEG, вы должны следовать процесс кодирования jpeg. К сожалению, бумаги, которые я читал, не оправдывают этого. Весь процесс состоит в следующем (wiki summary из 182-page specifications book):
- RGB в YCbCr преобразования (по желанию),
- подвыборки из цветности каналов (по желанию),
- блок 8x8 расщепления,
- пикселей значение центрирование,
- ДКП,
- квантования на основе степени сжатия/качества,
- порядка с коэффициенты по зигзагообразному рисунку и
- энтропийное кодирование; чаще всего с использованием кодирования Хаффмана и кодирования длины (RLE).
Есть на самом деле a lot more details involved, такие как заголовки, раздел маркеров, особенности того, как хранить коэффициенты постоянного и переменного тока и т.д. Затем, есть аспекты, которые стандарт только свободно определены и их реализация может варьироваться между кодеками , например, алгоритм подвыборки, таблицы квантования и энтропийное кодирование.Тем не менее, большинство программных продуктов подчиняются стандарту JFIF и могут быть прочитаны различными программами. Если вы хотите, чтобы ваш файл jpeg делал то же самое, будьте готовы написать сотни (до тысячи) строк кода только для кодировщика. Вам лучше заимствовать кодировщик, который уже опубликован в Интернете, чем писать свои собственные. Вы можете начать с поиска в libjpeg, который написан на языке C и составляет основу многих других кодеков jpeg, их C# implementation или даже версии Java, вдохновленной этим.
В некотором псевдокоде процесс кодирования/декодирования может быть описан следующим образом.
function saveToJpeg(pixels, fileout) {
// pixels is a 2D or 3D array containing your raw pixel values
// blocks is a list of 2D arrays of size 8x8 each, containing pixel values
blocks = splitBlocks(pixels);
// a list similar to blocks, but for the DCT coefficients
coeffs = dct(blocks);
saveCoefficients(coeffs, fileout);
}
function loadJpeg(filein) {
coeffs = readCoefficients(filein);
blocks = idct(coeffs);
pixels = combineBlocks(blocks);
return pixels;
}
Для стеганографии вы должны изменить его следующим образом.
function embedSecretToJpeg(pixels, secret, fileout) {
blocks = splitBlocks(pixels);
coeffs = dct(blocks);
modified_coeffs = embedSecret(coeffs, secret);
saveCoefficients(modified_coeffs, fileout);
}
function extractSecretFromJpeg(filein) {
coeffs = readCoefficients(filein);
secret = extractSecret(coeffs);
return secret;
}
Если изображение обложки уже в формате JPEG, нет никакой необходимости, чтобы загрузить его с декодером пикселей, а затем передать его в кодер, чтобы встроить сообщение. Вы можете сделать это вместо этого.
function embedSecretToJpeg(pixels, secret, filein, fileout) {
coeffs = readCoefficients(filein);
modified_coeffs = embedSecret(coeffs, secret);
saveCoefficients(modified_coeffs, fileout);
}
Насколько ваши вопросы касаются, 1, 2, 3 и 5 следует позаботиться о кодером/декодером, если вы не себя написанием.
Вопрос 1: Как правило, вы хотите раздуть изображение с необходимым количеством строк/столбцов так, что как ширина и высота делится на 8. Внутренне, кодер будет следить за ватные строки/столбцов , так что декодер будет отбрасывать их после восстановления. Выбор значения пикселя для этих фиктивных строк/столбцов зависит от вас, но вам советуют не использовать постоянное значение, потому что это приведет к ringing artifacts, что связано с тем, что преобразование Фурье прямоугольной волны является sinc функция.
Вопрос 2: Если вы измените только несколько блоков, процесс кодирования требует, чтобы вы преобразовали их все, чтобы их можно было сохранить в файле.
Вопрос 3: Вы должны квантовать коэффициенты DCT поплавка, поскольку это то, что хранится без потерь в файле. Вы можете изменить их до содержания вашего сердца после этапа квантования.
Вопрос 4: Никто не мешает вам изменять какой-либо коэффициент, но вы должны помнить, что каждый коэффициент влияет на все 64 пикселя в блоке. Коэффициент DC и low frequency AC представляют самые большие искажения, поэтому вы можете избегать их. Более конкретно, из-за того, как сохраняются DC-коэффициенты, модификация может исказить искажение ко всем следующим блокам.
Поскольку большинство высокочастотных коэффициентов равны 0, они эффективно сжимаются с помощью RLE. Изменение коэффициента 0 может переворачивать его до 1 (если вы выполняете базовую замену LSB), что нарушает это эффективное сжатие.
Наконец, некоторые алгоритмы хранят свой секрет в любых ненулевых коэффициентах и пропускают любые 0s. Однако, если вы попытаетесь изменить значение 1, оно может перейти на 0 и в процессе извлечения вы слепо пропустите его чтение. Поэтому такие алгоритмы не приближаются к каким-либо коэффициентам со значением 1 или 0.
Вопрос 5: При декодировании вы просто умножаете коэффициент с соответствующим значением таблицы квантования. Например, коэффициент DC составляет 309,443, а квантование дает вам round(309.443/16) = 19
.Квадратный бит - это часть с потерями, которая не позволяет вам восстановить 309.433. Так что обратное просто 19 * 16 = 304
.
Другие виды использования DCT в стеганографии
частоты Преобразует, такие как DCT и DWT могут быть использованы в стеганографии, чтобы встроить секрет в частотной области, но не обязательно хранить Stego изображение для JPEG. Этот процесс - пиксели -> DCT -> коэффициенты -> изменять коэффициенты -> IDCT -> пиксели, что вы отправляете получателю. Таким образом, выбор формата имеет значение. Если вы решите сохранить свои пиксели в jpeg, ваш секрет в DCT-коэффициентах may be disturbed другим слоем квантования из jpeg-кодирования.
Не могли бы вы назвать документы, которые включают ваши выдержки? Для первого я нашел [Мондал и др. al (2015) - новый подход к основанию изображения Стеганография с использованием псевдослучайной последовательности Функция генератора и коэффициенты DCT] (http://www.mecs-press.org/ijcnis/ijcnis-v7-n3/IJCNIS-V7-N3- 6.pdf) и для второго [D Singla et. al (2012) - Безопасность данных с использованием LSB & DCT Steganography In Images] (http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.300.8610&rep=rep1&type=pdf#page=152). Я могу расширить свой ответ о них, но они не касаются сохранения изображения в jpeg. – Reti43
да эти два .. –
так что они о ??? –