Java 显示不同输出的图像隐写术

Java 显示不同输出的图像隐写术,java,jakarta-ee,servlets,steganography,Java,Jakarta Ee,Servlets,Steganography,我在用java制作一个使用图像速记的web应用程序。但当我在我的桌面应用程序中使用相同的编码和解码算法时,我陷入了两者之间。我得到了不同的结果(正确)。但当我在web应用程序中使用相同的算法时,结果是错误的 按如下方式对文本进行编码: private static BufferedImage add_text(BufferedImage image, String text) { //convert all items to byte arrays: image, message, me

我在用java制作一个使用图像速记的web应用程序。但当我在我的桌面应用程序中使用相同的编码和解码算法时,我陷入了两者之间。我得到了不同的结果(正确)。但当我在web应用程序中使用相同的算法时,结果是错误的

按如下方式对文本进行编码:

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;
}
private static byte[] get_byte_data(BufferedImage image)
{
    WritableRaster raster   = image.getRaster();
    DataBufferByte buffer = (DataBufferByte)raster.getDataBuffer();
    return buffer.getData();
}
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});
}
它使用三个功能

获取字节数据()
如下所示:

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;
}
private static byte[] get_byte_data(BufferedImage image)
{
    WritableRaster raster   = image.getRaster();
    DataBufferByte buffer = (DataBufferByte)raster.getDataBuffer();
    return buffer.getData();
}
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});
}
使用的第二个函数是位转换。它如下所示:

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;
}
private static byte[] get_byte_data(BufferedImage image)
{
    WritableRaster raster   = image.getRaster();
    DataBufferByte buffer = (DataBufferByte)raster.getDataBuffer();
    return buffer.getData();
}
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});
}
第三个也是最后一个是
encode_text
,用于对图像中的文本进行编码

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;
}
解码文本功能:

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;
}
私有静态字节[]解码\u文本(字节[]图像)
{
整数长度=0;
整数偏移=32;
//循环32字节的数据以确定文本长度

对于(int i=0;i结果如何不同?解码过程是什么?@Reti43我检查了加密后相同文本和原始图像的图像大小,它们不同,我编辑了这篇文章进行解密。希望这有助于我不要使用Java,这么愚蠢的问题,在
add_text
方法中,你在
img中进行嵌入对象,但您返回的是原始图像对象
图像
,它不应该从输入中更改。我缺少什么吗?