写入我的 CipherStream 不会写入我的 ByteArrayOutputStream

Writing to my CipherStream does not write to my ByteArrayOutputStream

我正在尝试在测试环境中编写一个方法,以便在我的项目中使用它之前使其正常工作。此方法应采用一个字符串,将其转换为字节(使用 UTF-8 字符集),运行 通过 AES CipherOutputStream,然后将其拼接成一个字符串(再次使用 UTF-8)。

我的问题是我不太了解流是如何工作的。我见过从一个文件转到另一个文件的示例,但这不是我想要的。我有 ByteArrayOutputStream 而不是 FileOutputStream;然而,它似乎从来没有给那个流任何东西,因为当我读它时,它是空的。

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. 在从底层字节数组输出流中获取字节之前,您必须关闭密码输出流。否则不执行加密操作的doFinal()
  2. 使用 UTF8 将任意字节转换为字符串毫无意义。 return 字节数组,或者使用 base64 对字节数组进行编码以获得字符串。每个字节序列都不是有效的 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));