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

标签 java encryption stream aes

我正在尝试在测试环境中编写一种方法,使其在我的项目中使用之前能够正常工作。此方法应该采用一个字符串,将其转换为字节(使用 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 block ——我稍后会正确处理异常。 (不,我现在没有遇到任何异常(exception)情况。)

我假设密码流会对字节进行加密,然后将它们写入构造函数中提供的流,但由于某种原因,它只是将它们吸入并且从不将它们返回。

关于我在哪里搞砸了这件事有什么想法吗?

最佳答案

有几件事是错误的:

  1. 在从底层字节数组输出流中获取字节之前,您必须关闭密码输出流。否则,不执行加密操作的doFinal()。
  2. 使用 UTF8 将任意字节转换为字符串是没有意义的。要么返回一个字节数组,要么使用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));

关于java - 写入我的 CipherStream 不会写入我的 ByteArrayOutputStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32297625/

相关文章:

android - 使用 AES 解密 SQLite 数据库

Silverlight 4.0 PDF 查看器

c# - 当 NetworkStream.Read(byte[], int, int) 需要返回 -1 时,它会中止 () 运行它的线程吗?

java - Spring Boot 类变量的自定义解析器

java - 无论我如何尝试,Vaadin 表都不会更新

java - HtmlUnit 属性未定义脚本错误

javascript - 使用异步流 Node.js 时报告错误

java - AL lib : (EE) UpdateDeviceParams: Failed to set 44100hz, 改为 48000hz

c# - 指定的填充模式对此算法无效 - .net Core

java - Android 上的 AES 128 加密