我正在尝试在测试环境中编写一个方法,以便在我的项目中使用它之前使其正常工作。此方法应采用字符串,将其转换为字节(使用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块 - 我将在以后妥善处理异常。 (不,我现在没有任何例外。)
我假设密码流会加密字节,然后将它们写入构造函数中提供的流,但由于某种原因,它只是吸入它们并且永远不会将它们还给它们。
关于我搞砸了这个问题的任何想法?
答案 0 :(得分:1)
有些事情是错的:
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));