Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.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 加密后是否进行压缩?_Java_Security_Encryption_Zipoutputstream - Fatal编程技术网

Java 加密后是否进行压缩?

Java 加密后是否进行压缩?,java,security,encryption,zipoutputstream,Java,Security,Encryption,Zipoutputstream,在查看加密方案时,我遇到了以下代码: @Override public OutputStream encrypt(OutputStream outputStream) throws Exception { // generate the IV for encryption final byte[] encryptionIV = KeyFileUtil.randomBytes(16); outputStream.write(enc

在查看加密方案时,我遇到了以下代码:


    @Override
    public OutputStream encrypt(OutputStream outputStream) throws Exception {

        // generate the IV for encryption
        final byte[] encryptionIV = KeyFileUtil.randomBytes(16);
        outputStream.write(encryptionIV);

        // now create the encryption cipher
        final Cipher cipher = Cipher.getInstance(ENCRYPTION_ALGORITHM);
        cipher.init(Cipher.ENCRYPT_MODE, getKey(), new GCMParameterSpec(128, encryptionIV));

        // The CipherOutputStream shouldn't close the underlying stream
        outputStream = new FilterOutputStream(outputStream) {
            @Override
            public void close() throws IOException {
                // Do nothing
            }
        };
        final CipherOutputStream cos = new CipherOutputStream(outputStream, cipher);

        if (useZip) {
            final ZipOutputStream zipOutputStream = new ZipOutputStream(cos) {
                @Override
                public void finish() throws IOException {
                    super.finish();
                    def.end();
                }

                @Override
                public void flush() {
                    // Do nothing.
                }

                @Override
                public void close() throws IOException {
                    try {
                        super.flush();
                    } catch (final IOException exception) {
                        // Continue and try to close.
                    }
                    super.close();
                }
            };
            zipOutputStream.putNextEntry(new ZipEntry("ResourceContents"));
            return zipOutputStream;
        }
        return cos;
    }
据我所知,流的顺序是先加密数据,然后(无用地)压缩数据。这是正确的还是我误解了排序在OutputStreams上的工作方式


谢谢

是的,您误解(或阅读)了订单的工作原理

new ZipOutputStream(cos)
中,
CipherOutputStream
ZOS
包装,因此数据首先压缩,然后传递到包装流,包装流将加密数据,然后传递到下一个包装流,依此类推


最外层的流首先进入数据,如果启用了压缩,
返回zipOutputStream,zipstream是最外层的流。这是对的惯用用法。

是的,你误解了(或阅读了)排序的工作原理

new ZipOutputStream(cos)
中,
CipherOutputStream
ZOS
包装,因此数据首先压缩,然后传递到包装流,包装流将加密数据,然后传递到下一个包装流,依此类推


最外层的流首先进入数据,如果启用了压缩,
返回zipOutputStream,zipstream是最外层的流。这是的惯用用法。

谢谢!您是否有一些java文档的链接来解释这一点?的构造函数提到流是“构建在指定的底层输出流之上的”,但这并没有给出任何指示,说明在应用流时首先应用哪个流chained@phil这就是你所需要的。
ZipOutputStream
正在写入
CipherOutputStream
,而不是相反。@phil-well,哪个流首先应用于
ZipOutputStream out=new zipoutstream(new CipherOutputStream(foo))out.write()
时,是否使用code>?事实上,如果您得到一个
ZipOutputStream
,您将知道将应用压缩,但您不一定知道以后是否应用了其他操作,除非您知道流是如何构造的。我找到了我要找的。FilterOutputStream的文档提到:“这些流位于已经存在的输出流(底层输出流)之上,它将其用作数据的基本接收器”。它使用现有流作为其接收器的事实定义了链接流的顺序。感谢@KayamanTo详细说明我之前的评论:当我们有
ZipOutputStream(CipherOutputStream(outputStream))
时,
zipoutstream
的接收器是
CipherOutputStream(outputStream)
这意味着我们正在压缩然后按照预期进行加密谢谢!您是否有一些java文档的链接来解释这一点?的构造函数提到流是“构建在指定的底层输出流之上的”,但这并没有给出任何指示,说明在应用流时首先应用哪个流chained@phil这就是你所需要的。
ZipOutputStream
正在写入
CipherOutputStream
,而不是相反。@phil-well,哪个流首先应用于
ZipOutputStream out=new zipoutstream(new CipherOutputStream(foo))out.write()
时,是否使用code>?事实上,如果您得到一个
ZipOutputStream
,您将知道将应用压缩,但您不一定知道以后是否应用了其他操作,除非您知道流是如何构造的。我找到了我要找的。FilterOutputStream的文档提到:“这些流位于已经存在的输出流(底层输出流)之上,它将其用作数据的基本接收器”。它使用现有流作为其接收器的事实定义了链接流的顺序。感谢@KayamanTo详细解释我之前的评论:当我们有
ZipOutputStream(CipherOutputStream(outputStream))
时,
zipouttstream
的接收器是
CipherOutputStream(outputStream)
,这意味着我们正在压缩,然后按照预期进行加密,与您的问题无关,但是匿名的ZipOutputStream子类在我看来很可疑。如果真的管用的话,我会把它记录下来的。它提供的任何东西都不是直观的:为什么要在
finish()
中结束delfater
finish()
不是OutputStream(返回类型)的方法,因此调用您的实现的任何人都不会知道他们可以完成()流。他们很可能会
close()
it,它将调用
def.end()
。防止刷新意味着您真正知道自己在做什么(DeflaterOutputStreap有unsyncflush标志,您弄糟了)。只是好奇与你的问题无关,但匿名ZipoutStream子类“在我看来很可疑”。如果真的管用的话,我会把它记录下来的。它提供的任何东西都不是直观的:为什么要在
finish()
中结束delfater
finish()
不是OutputStream(返回类型)的方法,因此调用您的实现的任何人都不会知道他们可以完成()流。他们很可能会
close()
it,它将调用
def.end()
。防止刷新意味着您真正知道自己在做什么(DeflaterOutputStreap有unsyncflush标志,您弄糟了)。只是好奇而已