我在这个问题上陷入了无限循环。 最初,我从服务器接收加密的文件,然后使用cipherInputStream对其解密,并且运行良好。但是后来我有点恼火,因为为此,我总是需要创建从服务器接收到的加密文件。
然后我认为CipherInputStream只是接受一个InputStream,无论它是fileInputStream还是其他。所以我决定直接给我从服务器(带有套接字)获取的DataInputStream
现在,它仍然可以正常工作。我收到数据,将其解密,但是我的解密方法中的while循环永远不会结束,因为我永远不会为-1,而是始终为8。此外,我得到的解密文件还不是很完整(可能错过一两行)最后的数据。
这是我的解密方法:
public static void decrypt(DataInputStream dis, SecretKeySpec aesKey, String filename) throws NoSuchAlgorithmException, NoSuchPaddingException{
Cipher c = Cipher.getInstance("AES");
try {
c.init(Cipher.DECRYPT_MODE, aesKey);
FileOutputStream fos;
CipherInputStream cis;
cis = new CipherInputStream(dis, c);
fos = new FileOutputStream(filename);
byte[] b = new byte[8];
int i = cis.read(b);
while (i != -1) {
fos.write(b, 0, i);
i = cis.read(b);
System.out.println(i);
}
fos.close();
cis.close();
new File(filename);
} catch (InvalidKeyException e) {
// TODO Auto-generated catch block
System.out.println("clé incorrecte.");
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我的dis是:
DataInputStream dis = new DataInputStream(socket.getInputStream());
这里是从服务器上的数据库发送文件的代码:
public void sendFile(String fileID, String owner, Socket clientSocket) {
String sql = "SELECT file FROM files WHERE owner LIKE '" + owner + "' AND filename LIKE '"+ fileID + "'";
try (Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)){
DataOutputStream dOut = new DataOutputStream(clientSocket.getOutputStream());
if(rs.next()) {
InputStream input = rs.getBinaryStream("file");
int count;
byte[] buffer = new byte[4096];
while ((count = input.read(buffer)) > 0)
{
dOut.write(buffer, 0, count);
}
}
else
System.err.println("File not found in DB!");
} catch (SQLException | IOException e) {
System.out.println(e.getMessage());
}
}
我已经尝试在密码中使用4096个缓冲区;那么除了最后一个,我将始终为512。因此,输入确实有结尾,但是-1并没有按预期发生(如Javadoc中所述: 如果由于已到达流的末尾而没有字节可用,则返回值-1)
有人有主意吗?