2014-04-10 141 views
0

我目前正在开发一个加密程序,并且在解密时遇到问题。由此产生的文件是空白的,我一直在试图找到约一个小时的原因。我的解密代码如下...Java解密返回空白

有人可以告诉我为什么我的数据可能会出现空白吗?

     file = x; 
         FileInputStream fis = new FileInputStream(file.getAbsolutePath()); 

         file = new File(file.getAbsolutePath().substring(0, 
           file.getAbsolutePath().length() - 4)); 

         FileOutputStream fos = new FileOutputStream(file); 

         byte k[] = Hash.MD5(password).getBytes("UTF-8"); 
         SecretKeySpec key = new SecretKeySpec(k, "AES"); 

         Cipher cipher = Cipher.getInstance(algorithm); 

         byte[] iv = batchIV; 
         IvParameterSpec ivSpec = new IvParameterSpec(iv); 

         cipher.init(Cipher.DECRYPT_MODE, key, ivSpec); 
         CipherInputStream cin = new CipherInputStream(fis, 
           cipher); 

         byte[] buffer = new byte[1024]; 
         int read = 0; 

         while ((read = cin.read(buffer)) != -1) { 
          fos.write(buffer, 0, read); 
         } 

         fos.flush(); 
         fos.close(); 
         cin.close(); 

链接转到较大的代码部分。

解密方法在这里:http://pastebin.com/2p2juUTa

全部类别这里:http://pastebin.com/hgZHT4wg

我发现,CipherInputStream将返回-1,当您试图从中读取...我来仍不确定如果有人能够帮助,可能会导致这种情况。

+0

检查我的答案在这里http://stackoverflow.com/questions/22619602/files-encryption-java/22620403#22620403 – Libin

+0

我很抱歉,但我没有看到你的答案如何应用于此。我没有使用任何密码流。我有一个非常好的加密方法,但是,解密时出现问题,并且我无法找到为什么CipherInputStream在读取时返回-1。 – Kristoff

+0

“我的加密代码在下面。”不,您的*解密*代码如下。你的加密代码在哪里?你确定你没有生成零长度的文件吗?或具有加密标题但没有数据的文件? – EJP

回答

0

你没有说明什么Hash.MD5()Hash.MD5R()做,更别说提供的源代码,但显然MD5()返回String,这已经是一个错误(见下文),并MD5R()只返回输入参数,这基本上是无意义。除非你认为你已经发现了一种扭转MD5的方式?你没有。

如果您做如下修改代码:

  1. 变化MD5()返回byte[]从它必须执行MessageDigest.digest()操作造成,而不是包裹在一个字符串,并做出相应的调整在呼召位点(即在几个地方去除.toByteArray("UTF-8")

  2. 变化MD5R()返回输入参数,或者只需取出方法,

你会发现你的代码有效。

注:后我

  1. 重复: '字符串不是二进制数据的容器'。

  2. flush()之前close()是多余的。

  3. File可变file应方法本地,不是一成不变的。

  4. 你不需要所有那些File.getAbsolutePath()方法调用。 getPath()在大多数情况下也能正常工作,或者在其他情况下只有File对象本身。

+0

它已经被解决了,但是我不能在8小时内关闭它。另外,我明白你列出的是什么,但是,我确实有我使用静态文件变量的原因,但是,我在错误的地方引用了它,这导致了我的整个问题。至于持有二进制数据的字符串,这是一个bandaid修复程序,因为我遇到了一个小问题,并且想要让代码的重要部分启动并运行。 然而,其他两点是有道理的,首先冲洗,我知道这是一个很好的做法。对于其他类型的数据流,我以前没有使用过这些糟糕的体验。 – Kristoff