我在我的应用程序中实现AES256加密,它是通过自定义FilterOutputStream完成的,在那里我用加密的流包装提供的输出流。目标加密是AES/CTR/NoPadding。
首先,我开始使用标准Java的javax.crypto.CipherOutputStream,所以代码如下所示:
...
Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, sessionKey, new IvParameterSpec(ivBytes));
this.out = new CipherOutputStream(out, cipher);但是我注意到100 MB文件的加密需要10分钟(是的,分钟!)使用这种方法,这显然是不合适的吞吐量。
因此,我开始修补,我的第一猜测是使用Cipher提供(因为它是在这里推荐的,所以)。因此,守则变成:
...
Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding", BouncyCastleProvider.PROVIDER_NAME);
cipher.init(Cipher.ENCRYPT_MODE, sessionKey, new IvParameterSpec(ivBytes));
this.out = new CipherOutputStream(out, cipher);随着这一变化,加密时间缩短到45秒,比原来好10倍多,但仍然不合适。
接下来我所做的就是用Apache提供的CipherOutputStream替换标准CryptoOutputStream,所以代码开始如下所示:
...
this.out = new CryptoOutputStream("AES/CTR/NoPadding", new Properties(), out, sessionKey, new IvParameterSpec(ivBytes));而且--瞧--对于同一个文件,加密现在只需2秒,所以比BC的加密速度快15倍,比原来的加密速度快150倍以上!
我的问题是..。背后的原因是什么?这仅仅是因为在Java中默认的CipherOutputStream是如此糟糕,而Apache的CryptoOutputStream是如此的好吗?但是,弹跳城堡如何提升标准的CipherOutputStream呢?我在这里错过了什么?
UPD:我相信这不是Java I/O classes and performance的复制,因为这个问题是明确的关于普通流的性能,但是这个问题是关于加密流的性能,答案并不是那么明显。
发布于 2018-07-15 09:51:52
您需要将流包装在一个BufferedOutputStream中,这可以提高IO的效率,因为它使用的不是许多小的写入,而是使用一个更大的写入。
根据具体使用情况,缓冲CipherOutputStream可能比out更好。有时,这两者都可能会有帮助。YMMV,我建议测试哪种方法最有效。
https://stackoverflow.com/questions/51323432
复制相似问题