加密截断

Encryption truncated

我有一个加密功能,在各种环境下一直运行良好,但最近,它一直在吐出奇怪的结果。

代码如下:

public static byte[] Encrypt(String pstrInput) throws Exception {
    ByteArrayOutputStream ms;
    CipherOutputStream encStream;
    OutputStreamWriter sw;
    byte[] buffer;

    ms = new ByteArrayOutputStream();
    encStream = new CipherOutputStream(ms, getEncCipher());
    sw = new OutputStreamWriter(encStream);

    try {
        sw.write(pstrInput);
        sw.write("\r\n");
        sw.close();
        encStream.close();
        ms.close();
        buffer = ms.toByteArray();
    } catch(IOException e) {
        throw new Exception("Unexpected IO errors in Security Encrypt", e);
    }
    return buffer;
}

问题是,在某些环境中,buffer 将被截断为 8 个字节,我不知道为什么。

我可以通过注释掉 encStream.close() 行在我的机器上重现该问题,但我也不知道为什么。

据我所知,有问题的机器(开发和 QA)是 运行 相同的 JVM(OpenJDK 1.7 64 位)。唯一的区别是开发机器是 运行 Eclipse 的 Jetty 中的代码,QA 是 运行 和 Tomcat,但这应该没有任何区别...

有什么指点吗?

问题不是截断输出。问题是在代码 "works" 所在的机器上的输出中添加了垃圾。截断的版本实际上是正确的。

关闭流编写器将关闭基础流。此外,关闭已关闭的流应该不会有任何影响。

但是,某些版本的 CipherStream 似乎存在错误,再次关闭它实际上会导致它刷新并加密一个新块。

这就是为什么注释掉 encStream.close() "recreates" 问题(通过实际修复)。