将加密的图像字节保存到文件并恢复到java中的原始图像

我有一个图像加密和解密的问题,原因现在已经确定,但我无法找到解决方案。

我正在尝试实施这个项目

但问题是加密后的图像字节在使用rasterclass和ImageIO类写入图像文件后无法恢复

我的问题,尝试过的代码和解释都在这里提交

我必须在加密图像(Stegnography)中嵌入文本。 我用Google搜索并找到了在图片中嵌入文字的代码。 但我必须首先加密图像并在此加密图像中嵌入文本。 我的尝试如下。

/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package tbn; import java.awt.Graphics2D; import java.awt.Point; import java.awt.Transparency; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.ComponentColorModel; import java.awt.image.DataBuffer; import java.awt.image.DataBufferByte; import java.awt.image.Raster; import java.awt.image.WritableRaster; import java.io.File; import java.io.IOException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.logging.Level; import java.util.logging.Logger; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.SecretKey; import javax.imageio.ImageIO; /** * * @author user */ public class DbtClass { public static void main(String[] args) { try { BufferedImage orgnlimage = ImageIO.read(new File("parrruuuuu.png")); orgnlimage = user_space(orgnlimage); byte[] orgnlimagebytes = get_byte_data(orgnlimage); byte[] encryptedbytes = encrypt(orgnlimagebytes, "abc"); BufferedImage encryptedimage = toImage(encryptedbytes, orgnlimage.getWidth(), orgnlimage.getHeight()); ImageIO.write(encryptedimage, "png", new File("encrypted.png")); ///////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////// byte[] encryptedbytes2 = get_byte_data(encryptedimage); System.out.println("encryptedbytes before writing: "+encryptedbytes2.length); BufferedImage encryptedimage3 = ImageIO.read(new File("encrypted.png")); byte[] encryptedbyte3 = get_byte_data(encryptedimage3); System.out.println("encryptedbytes after writing: "+encryptedbyte3.length); } catch (IOException ex) { Logger.getLogger(DbtClass.class.getName()).log(Level.SEVERE, null, ex); } } public static BufferedImage user_space(BufferedImage image) { //create new_img with the attributes of image BufferedImage new_img = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_3BYTE_BGR); Graphics2D graphics = new_img.createGraphics(); graphics.drawRenderedImage(image, null); graphics.dispose(); //release all allocated memory for this image return new_img; } public static byte[] get_byte_data(BufferedImage image) { WritableRaster raster = image.getRaster(); DataBufferByte buffer = (DataBufferByte) raster.getDataBuffer(); return buffer.getData(); } public static byte[] encrypt(byte[] orgnlbytes, String key) { byte[] encbytes = null; try { Cipher cipher = Cipher.getInstance("AES"); KeyGenerator keyGen = KeyGenerator.getInstance("AES"); SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); // cryptograph. secure random random.setSeed(key.getBytes()); keyGen.init(128, random); // for example SecretKey secretKey = keyGen.generateKey(); cipher.init(Cipher.ENCRYPT_MODE, secretKey); encbytes = cipher.doFinal(orgnlbytes); } catch (NoSuchAlgorithmException ex) { Logger.getLogger(DbtClass.class.getName()).log(Level.SEVERE, null, ex); } catch (NoSuchPaddingException ex) { Logger.getLogger(DbtClass.class.getName()).log(Level.SEVERE, null, ex); } catch (InvalidKeyException ex) { Logger.getLogger(DbtClass.class.getName()).log(Level.SEVERE, null, ex); } catch (IllegalBlockSizeException ex) { Logger.getLogger(DbtClass.class.getName()).log(Level.SEVERE, null, ex); } catch (BadPaddingException ex) { Logger.getLogger(DbtClass.class.getName()).log(Level.SEVERE, null, ex); } return encbytes; } public static BufferedImage toImage(byte[] imagebytes, int width, int height) { DataBuffer buffer = new DataBufferByte(imagebytes, imagebytes.length); WritableRaster raster = Raster.createInterleavedRaster(buffer, width, height, 3 * width, 3, new int[]{2, 1, 0}, (Point) null); ColorModel cm = new ComponentColorModel(ColorModel.getRGBdefault().getColorSpace(), false, true, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); return new BufferedImage(cm, raster, true, null); } } 

在这里,我使用光栅类和ImageIO.write()编写了加密图像。然后从文件中读取此加密字节使用ImageIO.read()。在写入图像之前加密的byte []和在读取图像之后的byte []完全不同

我在这里有理由,但我不知道该怎么做才能克服

我通过XOR加密替换AES加密得到了解决方案,这绝不会通过将加密图像字节写入图像文件而导致数据丢失

所以,感谢您在每次提出的问题和回答问题时的回答