Использование CipherOutputStream в Java - PullRequest
1 голос
/ 05 октября 2011

Я пытаюсь использовать шифр AES для шифрования некоторых байтов, но он возвращает тихую ошибку, означающую, что я ввел что-то вроде:

byte[] raw = new String("Test","UTF8").getBytes("UTF8");

, и он ничего не вернет.Я думаю, что проблема в ByteArrayInput / OutputStreams, но я не знаю, как это сделать другим способом.

Вот код, о котором идет речь.

public byte[] encrypt(byte[] in) {
    byte[] encrypted = null;
    try {
        aesCipher.getInstance("AES/CBC/PKCS5Padding");
        aesCipher.init(Cipher.ENCRYPT_MODE, aeskeySpec);
        ByteArrayInputStream bais = new ByteArrayInputStream(in);
        ByteArrayOutputStream baos = new ByteArrayOutputStream(bais.available());
        CipherOutputStream os = new CipherOutputStream(baos, aesCipher);
        copy(bais, os);
        os.flush();
        byte[] raw = baos.toByteArray();
        os.close();
        encrypted = Base64.encodeBase64(raw);

    } catch (FileNotFoundException ex) {
        Logger.getLogger(FileEncryption.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(FileEncryption.class.getName()).log(Level.SEVERE, null, ex);
    } catch (InvalidKeyException ex) {
        Logger.getLogger(FileEncryption.class.getName()).log(Level.SEVERE, null, ex);
    } catch (NoSuchAlgorithmException ex) {
        Logger.getLogger(FileEncryption.class.getName()).log(Level.SEVERE, null, ex);
    } catch (NoSuchPaddingException ex) {
        Logger.getLogger(FileEncryption.class.getName()).log(Level.SEVERE, null, ex);
    }
    return encrypted;
}

Вотдругая функция в том же классе, которая работает:

public void encrypt(File in, File out) {


    try {
        aesCipher.getInstance("AES/CBC/PKCS5Padding");
        aesCipher.init(Cipher.ENCRYPT_MODE, aeskeySpec);
        FileInputStream is;
        is = new FileInputStream(in);
        CipherOutputStream os = new CipherOutputStream(new FileOutputStream(out), aesCipher);
        copy(is, os);
        os.close();
    } catch (FileNotFoundException ex) {
        Logger.getLogger(FileEncryption.class.getName()).log(Level.SEVERE, null, ex);
    } catch (IOException ex) {
        Logger.getLogger(FileEncryption.class.getName()).log(Level.SEVERE, null, ex);
    } catch (InvalidKeyException ex) {
        Logger.getLogger(FileEncryption.class.getName()).log(Level.SEVERE, null, ex);
    } catch (NoSuchAlgorithmException ex) {
        Logger.getLogger(FileEncryption.class.getName()).log(Level.SEVERE, null, ex);
    } catch (NoSuchPaddingException ex) {
        Logger.getLogger(FileEncryption.class.getName()).log(Level.SEVERE, null, ex);
    }

}

private void copy(InputStream is, OutputStream os) throws IOException {
    int i;
    byte[] b = new byte[2048];
    while ((i = is.read(b)) != -1) {
        os.write(b, 0, i);
    }
}

1 Ответ

2 голосов
/ 06 октября 2011

Первое, что бросается в глаза, это строка:

aesCipher.getInstance ("AES / CBC / PKCS5Padding");

Предположим, aesCipher - это переменная типа Cipher, вы называете здесь статический Cipher.getInstance и отбрасываете результат (не присваивая его какой-либо переменной).Т.е. эта строка не имеет никакого эффекта, aesCipher такая же, как и до этой строки.

Если раньше это было null, то она все еще равна null, и следующая строка (которая вызываетнестатический метод) даст вам исключение NullPointerException.Если ваш код молча поглощает неизвестные исключения (это может быть за пределами показанного кода), это общая проблема.

Кроме этого, я полагаю, что flush на CipherOutputStream действительно не очищает весьбуфер, но только столько блоков, которые могут быть записаны без добавления каких-либо отступов.Используйте close() вместо flush() здесь (что также похоже на работу во втором примере).


Общее замечание: небольшой автономный полный скомпилируемый пример будетпозволили мне попробовать и дать вам определенный ответ, а не только гадать.Например, «ничего не возвращает» не является хорошим описанием поведения вашего метода - метод возвращает null, пустой массив, генерирует исключение, блокирует вечно?

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