Шифрование изображения

я делаю стеганографию изображений, и если я набираю сообщение больше 3 символов для шифрования, есть исключение, что таблица квантования 0x01 не определена, а сообщение меньше 3 символов, я получил зашифрованное изображение, как мне было нужно. Я думаю, это связано с Формат JPEG (я думаю, что при вставке битов в массив байтов изображения я уничтожил свойство и атрибуты изображения). Помогите мне, я уверен, что это что-то связанное с метаданными, но мало что знаю об этом.

я добавляю код что я делаю

 Creating_image()
 {
  File f=new File(file.getParent()+"/encrypt.jpg");
    if(file==null)
    {
        JOptionPane.showMessageDialog(rootPane, "file null ho gyi encrypt mein");
    }
      try{

          FileInputStream imageInFile = new FileInputStream(file);
        byte imageData[] = new byte[(int) file.length()];
        imageInFile.read(imageData);


        // Converting Image byte array into Base64 String
        String imageDataString =  Base64.encode(imageData);

        // Converting a Base64 String into Image byte array
        pixels = Base64.decode(imageDataString);

        // Write a image byte array into file system

        imageInFile.close();

        }
        catch(Exception as)
       {
   JOptionPane.showMessageDialog(rootPane,"Please first select an Image");
       }
   String msg=jTextArea1.getText(); 
   byte[] bmsg=msg.getBytes();
   String as=Base64.encode(bmsg);
  bmsg=Base64.decode(as);

    int len=msg.length();
   byte[] blen=inttobyte(len);
 String sd=Base64.encode(blen);
 blen=Base64.decode(sd);
 pixels=encode(pixels,blen,32);
 pixels=encode(pixels,bmsg,64);

 try{



         // Converting Image byte array into Base64 String
       String imageDataString =  Base64.encode(pixels);

        // Converting a Base64 String into Image byte array
        pixels = Base64.decode(imageDataString);
   InputStream baisData = new ByteArrayInputStream(pixels,0,pixels.length);
        image= ImageIO.read(baisData);
 if(image == null)
 {
     System.out.println("imag is empty");
 }
 ImageIO.write(image, "jpg", f);

 }
 catch(Exception s)
 {
    System.out.println(s.getMessage());
    }
 }

и вот как выглядит encode fxn

byte[] encode(byte [] old,byte[] add,int offset)
{ 
try{    if(add.length+offset>old.length)
{
    JOptionPane.showMessageDialog(rootPane, "File too short");
}
}
catch(Exception d)
{
  JOptionPane.showMessageDialog(rootPane, d.getLocalizedMessage()); 
}
byte no;
    for(int i=0;i<add.length;i++)
    {
        no=add[i];
        for(int bit=7;bit>=0;bit--,++offset)
        {
           int  b=(no>>bit)&1;
            old[offset]=(byte)((old[offset]&0xfe)|b);
        }
    } 
    return old;
 }

person Rishabh Mamgain    schedule 07.11.2015    source источник
comment
Подскажите, правильно ли я это понимаю, а то ваш подход конвертации в base-64 и обратно меня смущает. Вы просто получаете массив байтов необработанного двоичного файла из изображения и массив байтов вашего сообщения и просто передаете их своему методу encode?   -  person Reti43    schedule 07.11.2015


Ответы (1)


Вы правы в том, что нарушили структуру файла. Формат JPEG содержит сильно сжатые данные до такой степени, что ни один из его байтов не представляет напрямую значения пикселей. На самом деле JPEG хранит даже не значения пикселей, а коэффициенты DCT блоков пикселей.

Ваш метод чтения необработанных байтов файла будет работать только для такого формата, как BMP, где пиксели хранятся непосредственно в файле. Однако вам все равно придется пропустить первые несколько байтов (заголовок), которые содержат такую ​​информацию, как ширина и высота изображения, количество цветовых плоскостей и количество битов на пиксель.

Если вы хотите встроить свое сообщение, изменив наименее значащие биты пикселей, вам нужно загрузить фактические пиксели в массиве байтов. Затем вы можете изменить пиксели с помощью метода encode(). Чтобы сохранить данные в файл, преобразуйте массив байтов в объект BufferedImage и используйте ImageIO.write(). Однако вы должны использовать формат, не связанный со сжатием с потерями, потому что это может исказить значения пикселей, тем самым уничтожив ваше сообщение. Форматы файлов, сжатые без потерь (или несжатые), включают BMP и PNG, а JPEG — с потерями.

Если вы все еще хотите выполнять стеганографию JPEG, процесс немного сложнее, но этот ответ в значительной степени охватывает то, что вам нужно сделать. Вкратце, вы хотите позаимствовать исходный код кодировщика jpeg, потому что его написание очень сложно и требует глубокого понимания всего формата. Кодер преобразует пиксели в набор различных чисел (шаг с потерями) и компактно сохраняет их в файл. Затем ваш алгоритм стеганографии должен быть введен между этими двумя шагами, где вы можете изменить эти числа, прежде чем сохранять их в файл.

person Reti43    schedule 07.11.2015