我目前正在处理加密程序,而且在解密时遇到问题。生成的文件是空白的,我一直试图找到大约一个小时的原因。我的解密代码如下......
有人可以告诉我为什么我的数据可能会空白吗?
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 ...如果有人可以提供帮助,我仍然不确定可能导致此问题的原因。
答案 0 :(得分:0)
您没有说明Hash.MD5()
和Hash.MD5R()
做了什么,更不用说提供源代码了,但显然MD5()
会返回String,
,这已经是错误了(参见下面),MD5R()
只返回输入参数,这基本上是没有意义的。除非你认为你已经发现了一种扭转MD5的方法?你还没有。
如果您对代码进行了以下更改:
更改MD5()
以返回必须执行的byte[]
操作产生的MessageDigest.digest()
,而不是将其包装在字符串中,并在调用时进行相应的调整网站(即删除几个地方的.toByteArray("UTF-8")
和
更改MD5R()
以返回输入参数,或者只删除方法,
你会发现你的代码有效。
NB:
在我之后重复:'String不是二进制数据的容器'。
flush()
之前close()
是多余的。
File
变量file
应该是方法本地的,而不是静态的。
您不需要所有这些File.getAbsolutePath()
方法调用。 getPath()
在大多数情况下也可以正常工作,或者在其他情况下只能用File
个对象。