gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:32:12 26 4
gpt4 key购买 nike

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

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

最佳答案

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

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

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

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

旁注:

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

关于java - 无法解密和读取加密的图像文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14374147/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com