Image Stegnography showing different outputs

0

I was making a web application using image stenography in java. But I got stuck in between as when I use a encoding and decoding same algorithm in my desktop application. I got different results(CORRECT). But when I use same algorithm in case of web application, results are wrong

Encoding the text is done as follow :

private static BufferedImage add_text(BufferedImage image, String text)
{
    //convert all items to byte arrays: image, message, message length
    byte img[]  = get_byte_data(image);

    byte msg[] = text.getBytes();
    byte len[]   = bit_conversion(msg.length);
    try
    {
        encode_text(img, len,  0); //0 first positiong
        encode_text(img, msg, 32); //4 bytes of space for length: 4bytes*8bit = 32 bits
    }
    catch(Exception e)
    {
        JOptionPane.showMessageDialog(null,"Target File cannot hold message!", "Error",JOptionPane.ERROR_MESSAGE);
    }
    return image;
}

It uses three functions.

get_byte_data() is as follow :

private static byte[] get_byte_data(BufferedImage image)
{
    WritableRaster raster   = image.getRaster();
    DataBufferByte buffer = (DataBufferByte)raster.getDataBuffer();
    return buffer.getData();
}

2nd function used is bit_Conversion.It is as follow :

private static byte[] bit_conversion(int i)
{
    byte byte3 = (byte)((i & 0xFF000000) >>> 24); //0
    byte byte2 = (byte)((i & 0x00FF0000) >>> 16); //0
    byte byte1 = (byte)((i & 0x0000FF00) >>> 8 ); //0
    byte byte0 = (byte)((i & 0x000000FF)       );
    return(new byte[]{byte3,byte2,byte1,byte0});
}

3rd and final one is encode_text that is used to encode the text in image

private static byte[] encode_text(byte[] image, byte[] addition, int offset)
{
    //check that the data + offset will fit in the image
    if(addition.length + offset > image.length)
    {
        throw new IllegalArgumentException("File not long enough!");
    }
    //loop through each addition byte
    for(int i=0; i<addition.length; ++i)
    {
        //loop through the 8 bits of each byte
        int add = addition[i];
        for(int bit=7; bit>=0; --bit, ++offset) //ensure the new offset value carries on through both loops
        {
            //assign an integer to b, shifted by bit spaces AND 1
            //a single bit of the current byte
            int b = (add >>> bit) & 1;
            //assign the bit by taking: [(previous byte value) AND 0xfe] OR bit to add
            //changes the last bit of the byte in the image to be the bit of addition
            image[offset] = (byte)((image[offset] & 0xFE) | b );
        }
    }
    return image;
}

Decode :

public static String decode(String path, String name)
{
    byte[] decode;
    try
    {
        //user space is necessary for decrypting
        BufferedImage image  = user_space(getImage(image_path(path,name,"png")));
        decode = decode_text(get_byte_data(image));
        return(new String(decode));
    }
    catch(Exception e)
    {
        JOptionPane.showMessageDialog(null, 
            "There is no hidden message in this image!","Error",
            JOptionPane.ERROR_MESSAGE);
        return "";
    }
}

Decode _text function :

private static byte[] decode_text(byte[] image)
{
    int length = 0;
    int offset  = 32;
    //loop through 32 bytes of data to determine text length
    for(int i=0; i<32; ++i) //i=24 will also work, as only the 4th byte contains real data
    {
        length = (length << 1) | (image[i] & 1);
    }

    byte[] result = new byte[length];

    //loop through each byte of text
    for(int b=0; b<result.length; ++b )
    {
        //loop through each bit within a byte of text
        for(int i=0; i<8; ++i, ++offset)
        {
            //assign bit: [(new byte value) << 1] OR [(text byte) AND 1]
            result[b] = (byte)((result[b] << 1) | (image[offset] & 1));
        }
    }
    return result;
}

What can be the reason for different results? Please help. Also tell a solution for the same

java
jakarta-ee
servlets
steganography
asked on Stack Overflow Apr 11, 2014 by user3522121 • edited Apr 11, 2014 by user3522121

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0