首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java的CipherOutputStream与Apache的CryptoOutputStream性能

Java的CipherOutputStream与Apache的CryptoOutputStream性能
EN

Stack Overflow用户
提问于 2018-07-13 10:49:45
回答 1查看 345关注 0票数 1

我在我的应用程序中实现AES256加密,它是通过自定义FilterOutputStream完成的,在那里我用加密的流包装提供的输出流。目标加密是AES/CTR/NoPadding

首先,我开始使用标准Java的javax.crypto.CipherOutputStream,所以代码如下所示:

代码语言:javascript
复制
...
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提供(因为它是在这里推荐的,所以)。因此,守则变成:

代码语言:javascript
复制
...
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,所以代码开始如下所示:

代码语言:javascript
复制
...
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的复制,因为这个问题是明确的关于普通流的性能,但是这个问题是关于加密流的性能,答案并不是那么明显。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-15 09:51:52

您需要将流包装在一个BufferedOutputStream中,这可以提高IO的效率,因为它使用的不是许多小的写入,而是使用一个更大的写入。

根据具体使用情况,缓冲CipherOutputStream可能比out更好。有时,这两者都可能会有帮助。YMMV,我建议测试哪种方法最有效。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51323432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档