写入我的 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 块——我稍后会妥善处理异常。 (不,我现在没有收到任何例外情况。)
我假设密码流会加密字节,然后将它们写入构造函数中提供的流,但出于某种原因,它只是将它们吸入,再也不会返回。
关于我在哪里搞砸了的任何想法?
有几处错误:
- 在从底层字节数组输出流中获取字节之前,您必须关闭密码输出流。否则不执行加密操作的doFinal()
- 使用 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));
我正在尝试在测试环境中编写一个方法,以便在我的项目中使用它之前使其正常工作。此方法应采用一个字符串,将其转换为字节(使用 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 块——我稍后会妥善处理异常。 (不,我现在没有收到任何例外情况。)
我假设密码流会加密字节,然后将它们写入构造函数中提供的流,但出于某种原因,它只是将它们吸入,再也不会返回。
关于我在哪里搞砸了的任何想法?
有几处错误:
- 在从底层字节数组输出流中获取字节之前,您必须关闭密码输出流。否则不执行加密操作的doFinal()
- 使用 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));