无法解密和读取加密的图像文件

时间:2013-01-17 07:31:09

标签: java image aes

这是我的简单图像加密类,我在其中:

  1. 将图像从一个地方读取为字节
  2. 加密这些字节
  3. 再次从这些加密字节创建图像
  4. 代码:

    public class ImageEncrypt {
    
      Cipher cipher; 
    
      public static byte[] convertImageToByteArray(String sourcePath) {
        byte[] imageInByte = null;
        try{
    
          BufferedImage originalImage = ImageIO.read(new File(
          sourcePath));
    
          // convert BufferedImage to byte array
          ByteArrayOutputStream baos = new ByteArrayOutputStream();
          ImageIO.write(originalImage, "jpg", baos);
          baos.flush();
          imageInByte = baos.toByteArray();
          baos.close();
        }catch(Exception e){
          e.printStackTrace();
        }
        return imageInByte;
      }
    
      public static void convertByteArrayToImage(byte[] b , String path) {
    
        try{
    
          InputStream in = new ByteArrayInputStream(b);
          BufferedImage bImageFromConvert = ImageIO.read(in);
    
          ImageIO.write(bImageFromConvert, "jpg", new File(
          path));
    
        }catch(Exception e)
        {
          e.printStackTrace();
        }
      }
    
    
      public static void main(String args []){
        final String strPassword = "password12345678";
    
        SecretKeySpec initVector = new SecretKeySpec(strPassword.getBytes(), "AES");
        AlgorithmParameterSpec paramSpec = new IvParameterSpec(strPassword.getBytes()); 
    
        try{
          Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
    
          cipher.init(Cipher.ENCRYPT_MODE, initVector, paramSpec); 
    
          byte[] ecrypted = cipher.doFinal(convertImageToByteArray("C:/Users/user/Desktop/a.jpg"));
    
          convertByteArrayToImage(ecrypted,"C:/Users/user/user/enc.jpg");
    
          System.out.println("converted to encrypted file .... ");
        }catch(Exception e){
          e.printStackTrace();
        }
      }
    

    现在,当我尝试从加密字节制作图像时,我在第3步遇到问题。它抛出了一个例外,如下所示:

    java.lang.IllegalArgumentException: image == null!
        at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925)
        at javax.imageio.ImageIO.getWriter(ImageIO.java:1591)
        at javax.imageio.ImageIO.write(ImageIO.java:1520)
        at ImageEncrypt.convertByteArrayToImage(ImageEncrypt.java:55)
        at ImageEncrypt.main(ImageEncrypt.java:83)
    

    我不知道我哪里出错了?我正在做同样的转换文件(文档,pdf等)加密,它工作正常(当然在这种情况下,我使用不同的流类进行字节转换)但我无法理解为什么它在这里弄乱?

1 个答案:

答案 0 :(得分:2)

加密数据后,它不再是有效的图像文件。尝试在加密数据上使用ImageIO就像在记事本中打开加密文本文件的结果一样,并希望看到文本。

要获得Image,您需要先解密数据,然后再请ImageIO进行阅读。

你的convertByteArrayToImage方法真正意味着什么并不清楚 - 如果目的只是将字节写入文件,为什么要通过Image呢?为什么不直接将字节转储到磁盘?他们已经图像的加密表示 - 没有必要再尝试将它们解释为图像。如果您想应用某种图像转换(例如总是写出JPEG,即使输入是PNG),那么应该在未加密的数据上完成。

(同样在convertImageToByteArray上,假设您开始使用磁盘上的文件,除非您想要执行特定于图像的转换,否则将其作为图像加载是没有意义的。)

侧面说明:

  • 不要使用不占用字符集的String.getBytes()的重载 - 它将使用平台默认编码,这意味着它不能跨平台移植
  • 您也将加密数据转换为base64,但忽略了结果。为什么?