Java解密返回空白

时间:2014-04-10 03:01:17

标签: java encryption

我目前正在处理加密程序,而且在解密时遇到问题。生成的文件是空白的,我一直试图找到大约一个小时的原因。我的解密代码如下......

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

                        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

Full Class Here:http://pastebin.com/hgZHT4wg

我发现CipherInputStream在您尝试读取时返回-1 ...如果有人可以提供帮助,我仍然不确定可能导致此问题的原因。

1 个答案:

答案 0 :(得分:0)

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

如果您对代码进行了以下更改:

  1. 更改MD5()以返回必须执行的byte[]操作产生的MessageDigest.digest(),而不是将其包装在字符串中,并在调用时进行相应的调整网站(即删除几个地方的.toByteArray("UTF-8")

  2. 更改MD5R()以返回输入参数,或者只删除方法,

  3. 你会发现你的代码有效。

    NB:

    1. 在我之后重复:'String不是二进制数据的容器'。

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

    3. File变量file应该是方法本地的,而不是静态的。

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