Как извлечь добавленные данные в конце изображения jpeg (обнаружение jpeg EOF).

Поскольку 0xFFD9 не обязательно должен присутствовать в изображении JPEG (в качестве маркера EOF), и даже если он присутствует, это может дать неверный результат из-за встроенной миниатюры в jpeg, поэтому мне нужно проанализировать JPEG, чтобы извлечь любые добавленные данные (например, zip ). У меня есть следующий код Java, основанный на предположении, что за маркером будет следовать длина 2 байта. Но это не относится к сегменту SOS, т.е. маркеру 0xFFDA. Как я могу обнаружить EOF в JPEG?

public String getJPEGAppendedData(DataInputStream in) {
    StringBuilder message = new StringBuilder();
    try {
        // reading first two bytes 0xFFD8
        in.readFully(new byte[2]);

        // 0xFFXX
        byte twoBytes[] = new byte[2];

        while (true) {
            in.readFully(twoBytes);
            if (twoBytes[0] == (byte) 0xFF) {
                    if (twoBytes[1] == (byte) 0xDD) {
                        // fixed 4 bytes payload
                        in.readFully(new byte[4]);
                    } else if (twoBytes[1] == (byte) 0xD9) {
                        // end of image reached
                        break;
                    } else if (twoBytes[1] >= (byte) 0xD0 && twoBytes[1] <= (byte) 0xD7) {
                        // no payload
                    } else {
                        // reading payload length form two bytes
                        short length = in.readShort();
                        System.out.println(length);

                        // skipping payload
                        for (int i = 1; i <= length - 2; i++) {
                            in.readByte();
                        }
                    }
            } else {
                break;
            }
        }

        // reading appended data (byte by byte) if any
        boolean moreData = true;
        while (moreData) {
            try {
                byte b = in.readByte();
                message.append(String.format("%02X", b));
            } catch (Exception e) {
                moreData = false;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return message.toString();
}

person Varun Kumar    schedule 10.04.2017    source источник


Ответы (1)


Я не думаю, что вам нужно обнаружить конец.

Если вы сами создаете сообщение, вы можете просто перейти к концу массива байтов, содержащего изображение, и определить, присутствует ли EOI (ddf9), если нет, то просто добавьте его туда и добавьте свое сообщение.

Поскольку EOI должен быть концом изображения, вы можете добавить его самостоятельно, даже если оно уже присутствует.

При чтении вашего сообщения читайте с конца файла и обнаруживайте ddf9 (который может присутствовать в самом сообщении, поэтому лучше выбрать более длинный разделитель, например @@SecretMessageOfMine@@, и обнаружить его.

Например, данное изображение ниже

некая черная дыра

Вы можете создать массив изображений, как показано ниже

введите здесь описание изображения

person 11thdimension    schedule 10.04.2017
comment
Нет, я не создаю сообщения сам. Моя программа примет любое изображение и извлечет добавленные данные, если таковые имеются (стеганография). - person Varun Kumar; 10.04.2017