CipherOutputStream не работает - PullRequest
0 голосов
/ 15 мая 2018

У меня проблема со следующим кодом.

Если я использую ObjectOutputStream, все работает нормально, но когда я пытаюсь использовать CipherOutputStream, я получаю следующую ошибку на стороне сервера.

Если я отправляю один файл, я не получаю его полностью. Если я отправляю более одного файла, последний отправляется не полностью, а предыдущий.

Что бы это могло быть?

Я видел другие сообщения, но они мне не помогли.

java.lang.ArrayIndexOutOfBoundsException
    at java.lang.System.arraycopy(Native Method)
    at java.io.BufferedOutputStream.write(BufferedOutputStream.java:128)
    at myCloudServer$myCloudServerThread.run(myCloudServer.java:257)

Код клиента. Отправка файла.

SocketFactory socketFactory = SSLSocketFactory.getDefault();
clientSocket = socketFactory.createSocket(serverAddress[0], Integer.parseInt(serverAddress[1]));

ObjectInputStream objectInputStream = new ObjectInputStream(clientSocket.getInputStream());
ObjectOutputStream objectOutputStream = new ObjectOutputStream(clientSocket.getOutputStream());

[...]

byte[] buffer = new byte[1024];
objectOutputStream.writeObject(sendingClientFiles.size());

for (File sendingClientFile : sendingClientFiles) {
    [...]

    KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
    keyGenerator.init(128);
    SecretKey secretKeyEncrypt = keyGenerator.generateKey();    

    Cipher cipherEncrypt = Cipher.getInstance("AES");   
    cipherEncrypt.init(Cipher.ENCRYPT_MODE, secretKeyEncrypt);
    CipherOutputStream cipherOutputStream = new CipherOutputStream(objectOutputStream, cipherEncrypt);    

    BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(sendingClientFile));
    int count = 0;
    while ((count = bufferedInputStream.read(buffer, 0, buffer.length)) != -1) {
        //objectOutputStream.write(buffer, 0, count);
        cipherOutputStream.write(buffer, 0, count);
    }

    bufferedInputStream.close();
    //objectOutputStream.flush();
    cipherOutputStream.flush();
}

Код сервера. Получение файла.

ServerSocketFactory serverSocketFactory = SSLServerSocketFactory.getDefault();
serverSocket = serverSocketFactory.createServerSocket(port);

Socket clientSocket = serverSocket.accept();

ObjectOutputStream objectOutputStream = new ObjectOutputStream(clientSocket.getOutputStream());
ObjectInputStream  objectInputStream  = new ObjectInputStream(clientSocket.getInputStream());

[...]

byte[] buffer = new byte[1024];
int i = 0;
int receivingClientFiles = (int) objectInputStream.readObject();

while(i < receivingClientFiles) {
    [...]

    BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(diretorio + "/" + fileName));
    int count = 0;                      
    int received = 0;
    while (received < fileLength) {
        count = objectInputStream.read(buffer, 0,  buffer.length);
        bufferedOutputStream.write(buffer, 0, count);
        received += count;
    }
    //while ((count = objectInputStream.read(buffer, 0, buffer.length)) != -1) {
    //  bufferedOutputStream.write(buffer, 0, count);
    //}

    bufferedOutputStream.close();

    i++;
}

1 Ответ

0 голосов
/ 16 мая 2018

В count = objectInputStream.read(buffer, 0, buffer.length); вы должны максимально увеличить размер файла (потому что в противном случае вы можете прочитать байты из следующего файла). И этот конкретный размер файла должен быть зашифрованной длиной потока , а не исходным размером файла (если они отличаются, то есть).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...