Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 写入我的密码流不会写入我的ByteArrayOutputStream_Java_Encryption_Stream_Aes - Fatal编程技术网

Java 写入我的密码流不会写入我的ByteArrayOutputStream

Java 写入我的密码流不会写入我的ByteArrayOutputStream,java,encryption,stream,aes,Java,Encryption,Stream,Aes,我试图在测试环境中编写一个方法,以便在我的项目中使用它之前让它工作。此方法应获取一个字符串,将其转换为字节(使用UTF-8字符集),通过AESCipherOutputStream运行它,然后将其重新分割成一个字符串(同样使用UTF-8) 我的问题是,我并不真正理解这些流是如何工作的。我见过从一个文件转到另一个文件的例子,但这不是我想要的。我使用的不是FileOutputStream,而是ByteArrayOutputStream;然而,它似乎从来没有给那个流任何东西,因为当我读它的时候,它是空的

我试图在测试环境中编写一个方法,以便在我的项目中使用它之前让它工作。此方法应获取一个字符串,将其转换为字节(使用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块——稍后我将正确处理异常。(不,我现在没有任何例外。)

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


你知道我在哪里搞砸了吗?

有几件事不对:

  • 必须先关闭密码输出流,然后才能从基础字节数组输出流中获取字节。否则,将不执行加密操作的doFinal()
  • 使用UTF8将任意字节转换为字符串毫无意义。返回字节数组,或者使用base64对字节数组进行编码以获取字符串。每个字节序列都不是有效的UTF-8编码字符序列
  • 请注意,当您只想加密内存中的字节数组时,实际上并不需要使用CipherOutputStream。在读取长字节流并动态加密它们时,流非常有用

    你可以简单地使用

    byte[] encrypted = this.a.doFinal(raw.getBytes(StandardCharsets.UTF_8));
    

    谢谢另外,我实际上不会使用返回字符串的方法。我这样做只是为了把它打印出来看看。
    byte[] encrypted = this.a.doFinal(raw.getBytes(StandardCharsets.UTF_8));