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

时间:2015-08-30 14:31:56

标签: java encryption stream aes

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

我的问题是我真的不明白流是如何工作的。我看过从一个文件到另一个文件的例子,但这不是我想要的。我有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 个答案:

答案 0 :(得分:1)

有些事情是错的:

  1. 在从基础字节数组输出流中获取字节之前,必须先关闭密码输出流。否则,不执行加密操作的doFinal()。
  2. 使用UTF8将任意字节转换为字符串是没有意义的。要么返回一个字节数组,要么使用base64对字节数组进行编码以获得String。每个字节序列都不是UTF-8编码字符的有效序列。
  3. 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));