2015-08-30 3 views
0

Я пытаюсь написать метод в тестовой среде, чтобы заставить его работать, прежде чем использовать его в моем проекте. Этот метод должен взять строку, превратить ее в байты (используя кодировку UTF-8), запустить ее через AES CipherOutputStream, а затем снова перевести ее в строку (опять же с UTF-8).Запись на мой CipherStream не записывается в мой ByteArrayOutputStream

Моя проблема в том, что я действительно не понимаю, как работают потоки. Я видел примеры перехода из одного файла в другой, но это не то, что я хочу. Вместо FileOutputStream у меня есть ByteArrayOutputStream; однако кажется, что он никогда даже не дает этому потоку ничего, потому что когда я его читаю, он пуст.

String encrypt(String raw) 
{ 
    String encrypted = ""; 
    ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    CipherOutputStream cipherStream = new CipherOutputStream(out, this.a); 
    try 
    { 
     cipherStream.write(raw.getBytes(Charset.forName("UTF-8"))); 
     encrypted += new String(out.toByteArray(), Charset.forName("UTF-8")); 
     out.close(); 
     cipherStream.close(); 
    } 
    catch (Exception e) 
    { 
     System.out.println(e.getMessage()); 
    } 

    return encrypted; 
} 

Просьба игнорировать все уродливые общие блоки catch - я буду правильно обрабатывать исключения позже. (Нет, я не получаю никаких исключений прямо сейчас.)

Я предположил, что поток шифрования будет шифровать байты, а затем записать их в поток, предоставленный в конструкторе, но по какой-то причине он просто всасывает их и никогда не дает их обратно.

Любые идеи относительно того, где я это привожу?

ответ

1

Некоторые вещи неправильны:

  1. Вы должны закрыть поток шифра выходной перед тем, как байты из выходного потока основного массива байтов. В противном случае doFinal() операции шифрования не выполняется.
  2. Преобразование произвольных байтов в строку с использованием UTF8 не имеет смысла. Либо верните массив байтов, либо закодируйте массив байтов, используя base64, чтобы получить String. Каждая последовательность байтов не является допустимой последовательностью кодированных символов UTF-8.

.

byte[] encrypt(String raw) throws IOException { 
    try (ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     CipherOutputStream cipherStream = new CipherOutputStream(out, this.a)) { 
     cipherStream.write(raw.getBytes(Charset.forName("UTF-8"))); 
     cipherStream.close(); 
     return out.toByteArray(); 
    } 
} 

Примечание хотя, что использование CipherOutputStream не очень нужны, когда все, что вы хотите, чтобы зашифровать массив байтов в памяти. Поток полезен при чтении длинного потока байтов и шифровании их на лету.

Вы могли бы просто использовать

byte[] encrypted = this.a.doFinal(raw.getBytes(StandardCharsets.UTF_8)); 
+0

Спасибо! Кроме того, я не собираюсь использовать метод, который возвращает строку. Я только сделал это, чтобы распечатать его и посмотреть. – RogueCSDev

Смежные вопросы