当前位置: 首页 > 面试题库 >

图像文件的加密和解密

秦宏硕
2023-03-14
问题内容

结合我的另一个问题,并在更改了这部分代码之后

FileOutputStream output = new FileOutputStream("sheepTest.png");
    CipherOutputStream cos = new CipherOutputStream(output, pbeCipher);
    ImageIO.write(input, "PNG", cos);
    cos.close();

从解密部分,我遇到了另一个错误,这是

Exception in thread "main" java.lang.IllegalArgumentException: image == null!
at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(Unknown Source)
at javax.imageio.ImageIO.getWriter(Unknown Source)
at javax.imageio.ImageIO.write(Unknown Source)
at encypt.com.trial.main(trial.java:82)

当我单击SheepTest.png时,文件为空。错误在哪里?谁能帮助我解决错误?谢谢。

public class trial {
public static void main(String[] arg) throws Exception {

   // Scanner to read the user's password. The Java cryptography
   // architecture points out that strong passwords in strings is a
   // bad idea, but we'll let it go for this assignment.
   Scanner scanner = new Scanner(System.in);
   // Arbitrary salt data, used to make guessing attacks against the
   // password more difficult to pull off.
   byte[] salt = { (byte) 0xc7, (byte) 0x73, (byte) 0x21, (byte) 0x8c,
           (byte) 0x7e, (byte) 0xc8, (byte) 0xee, (byte) 0x99 };

   {
     File inputFile = new File("sheep.png");
      BufferedImage input = ImageIO.read(inputFile);
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
      SecretKeyFactory keyFac = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
     // Get a password from the user.
     System.out.print("Password: ");
     System.out.flush();
     PBEKeySpec pbeKeySpec = new PBEKeySpec(scanner.nextLine().toCharArray());          
     // Set up other parameters to be used by the password-based
     // encryption.
     PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, 20);
     SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec);
     // Make a PBE Cyhper object and initialize it to encrypt using
     // the given password.
     Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
     pbeCipher.init(Cipher.ENCRYPT_MODE, pbeKey, pbeParamSpec);
     FileOutputStream output = new FileOutputStream("sheepTest.png");
     CipherOutputStream cos = new CipherOutputStream(
            output, pbeCipher);
       //File outputFile = new File("image.png");
         ImageIO.write(input,"PNG",cos);
      cos.close();

   }
   // Now, create a Cipher object to decrypt for us. We are repeating
   // some of the same code here to illustrate how java applications on
   // two different hosts could set up compatible encryption/decryption
   // mechanisms.
  {
       File inputFile = new File("sheepTest.png");
         BufferedImage input = ImageIO.read(inputFile);
       // Get another (hopefully the same) password from the user.
      System.out.print("Decryption Password: ");
       System.out.flush();
       PBEKeySpec pbeKeySpec = new PBEKeySpec(scanner.next().toCharArray());
       // Set up other parameters to be used by the password-based
       // encryption.
       PBEParameterSpec pbeParamSpec = new PBEParameterSpec(salt, 20);
       SecretKeyFactory keyFac = SecretKeyFactory
               .getInstance("PBEWithMD5AndDES");
       SecretKey pbeKey = keyFac.generateSecret(pbeKeySpec);
       // Make a PBE Cyper object and initialize it to decrypt using
       // the given password.
       Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
       pbeCipher.init(Cipher.DECRYPT_MODE, pbeKey, pbeParamSpec);
       // Decrypt the ciphertext and then print it out.
       /*byte[] cleartext = pbeCipher.doFinal(ciphertext);
       System.out.println(new String(cleartext));*/
       FileOutputStream output = new FileOutputStream("sheepTest.png");
       CipherOutputStream cos = new CipherOutputStream(
              output, pbeCipher);
        ImageIO.write(input,"PNG",  cos);
        cos.close();

   }
   }
}

问题答案:

我猜想这行返回null:

BufferedImage input = ImageIO.read(inputFile);

文档ImageIO.read说明:

“如果没有注册的ImageReader声称能够读取结果流,则返回null。”

空值将传递给此调用,从而导致NPE:

ImageIO.write(input,"PNG",  cos);

我不熟悉此API,但是从文档和此处看到的内容中,我想我可以推断出ImageIO.read返回null
的原因是因为它试图解释文件中的图像数据,但是不能,因为加密。您需要先解密数据,然后才能将其解释为图像。

您正在执行解密,但是格式转换使用的是原始的加密文件作为输入,而不是解密的图像数据。



 类似资料:
  • 问题内容: 我正在创建一个APP,并且只需要刻印图像的内容。我需要文件转换后仍然是图像,但是显示的图像不会显示为原始图像。 例如,我将加密的图像发送给其他用户,并且该用户将能够显示和成像(但不是原始图像),但是原始图像已在该文件中加密。 使用以下算法,我加密了整个文件,由于标头也被加密,因此无法将其作为图像打开。 我正在使用此算法,但我不知道如何仅加密数据或如何在Java / Android中添加

  • 如何使用Pycrypto python库加密图像?我在互联网上找到了一些文本加密的例子,但在图像上找不到同样的例子。有人能帮我吗?

  • 问题内容: 我尝试使用AES 128位密钥解密4.2 MB .dcf文件,但是解密(在cipher.doFinal(data)函数上)花费了33秒,这是否正常? 这是一个代码片段: 问题答案: 您应该尝试计算不写入文件所花费的时间,即,在调用之前和之后立即调用。 话虽这么说,基于Android的手机通常使用最新的主频为500 MHz或更高的ARM处理器,并且从理论上讲,这种野兽每秒可以对几兆字节的

  • 问题内容: 编辑:::问题中的代码有效,但是一旦在相机中拍摄了图像,返回活动大约需要10秒钟。我放弃了这种方法,而是使用Facebook的隐秘库对图像进行加密和解密。 我看了很多示例,但是仍然找不到解决正确加密和解​​密的方法。我以为我在互联网上使用一些随机代码时是正确的,但是在解码时会收到BadPadding异常。 所以,我正在努力解决。正如大多数人在SO上所建议的那样,我正在关注以下问题(但是

  • 编辑:::问题中的代码起作用,但一旦图像被相机拍摄,返回活动需要大约10秒的时间。我放弃了这种做法,使用Facebook的隐藏库来加密和解密图像。链接到Facebook的解决方案:Facebook隐藏-图像加密和解密 所以,我正在努力解决这个问题。我遵循下面的问题,正如SO上的大多数人所建议的那样(但这段代码展示了如何加密字符串)。有人能帮我加密和解密图像吗?问题中的代码是否适用于图像? 链接到问

  • 我正在尝试用AES加密一个大文件,然后解密,与原件进行比较。 这堂课总结了工作。它适用于.txt文件,但不适用于.mp3、.pdf等文件。 我们将非常感谢你的帮助。