【问题标题】:Unable to decrypt and read encrypted image file无法解密和读取加密的图像文件
【发布时间】:2013-01-24 20:40:51
【问题描述】:

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

  1. 将图像从一个位置读入字节
  2. 加密这些字节
  3. 再次从这些加密字节创建图像

代码:

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();
    }
  }

现在,当我尝试从加密字节制作图像时,我在第三步遇到了问题。它抛出下面给出的异常:

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等)转换为加密并且它工作正常(当然在这种情况下我使用不同的流类进行字节转换)但我无法理解为什么它在这里搞砸了?

【问题讨论】:

    标签: java image aes


    【解决方案1】:

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

    要获得Image,您需要在请求ImageIO 读取数据之前解密数据。

    完全不清楚您的convertByteArrayToImage 方法的真正目的是什么——如果目的只是将字节写入文件,为什么还要通过Image 呢?为什么不直接将字节转储到磁盘?它们已经是图像的加密表示 - 无需再次尝试将它们解释为图像。如果你想应用某种图像转换(例如,总是写出 JPEG,即使输入是 PNG),那么应该对 未加密 数据进行。

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

    旁注:

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

    【讨论】:

    • base64 行只是打印错误
    • Why not dump the bytes straight to disk?我以图片的形式倾倒它们。请清楚你想说什么?我没有正确理解它
    • @despicable:当它到达磁盘时,它只是字节。它不像文件“知道”它是图像,只是因为它是由ImageIO 编写的。换句话说:加密不关心数据的性质。您可以在不知道通常如何解释数据的情况下加密文件:加载字节,加密它们,保存结果。这里根本不需要ImageIO
    • 那么我需要在我的代码中进行哪些更改?以及最后将其存储为加密图像文件(使用AES)是否可以实现?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多