java aes ctr_与AES-CTR相比,Java AES-GCM非常慢
请考虑以下代码:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.IvParameterSpec;
import java.security.SecureRandom;
public class AES_Mod_Speed {
// AES parameters
private static final int AES_KEY_SIZE = 128; // in bits
private static final int AES_COUNTER_SIZE = 16; // in bytes
private static final int GCM_NONCE_LENGTH = 12; // in bytes. 12 is the recommended value.
private static final int GCM_TAG_LENGTH = 16 * 8; // in bits
public static void main(String[] args) throws Exception {
SecureRandom sr = new SecureRandom();
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(AES_KEY_SIZE);
SecretKey key = kg.generateKey();
byte[] counter = new byte[AES_COUNTER_SIZE];
Cipher aes_ctr = Cipher.getInstance("AES/CTR/NoPadding");
byte[] nonce = new byte[GCM_NONCE_LENGTH];
Cipher aes_gcm = Cipher.getInstance("AES/GCM/NoPadding");
for (int i = 0; i < 10; i++) {
sr.nextBytes(counter);
aes_ctr.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(counter));
speedTest(aes_ctr);
}
System.out.println("-----------------------------------------");
for (int i = 0; i < 10; i++) {
sr.nextBytes(nonce);
aes_gcm.init(Cipher.ENCRYPT_MODE, key, new GCMParameterSpec(GCM_TAG_LENGTH, nonce));
speedTest(aes_gcm);
}
}
private static void speedTest(Cipher cipher) throws Exception {
byte[] ptxt = new byte[1 << 26];
long start, end;
start = System.nanoTime();
cipher.doFinal(ptxt);
end = System.nanoTime();
System.out.printf("%s took %f seconds.\n",
cipher.getAlgorithm(),
(end - start) / 1E9);
}
}
结果(Java 11.0.2):
AES/CTR/NoPadding took 0.259894 seconds.
AES/CTR/NoPadding took 0.206136 seconds.
AES/CTR/NoPadding took 0.247764 seconds.
AES/CTR/NoPadding took 0.196413 seconds.
AES/CTR/NoPadding took 0.181117 seconds.
AES/CTR/NoPadding took 0.194041 seconds.
AES/CTR/NoPadding took 0.181889 seconds.
AES/CTR/NoPadding took 0.180970 seconds.
AES/CTR/NoPadding took 0.180546 seconds.
AES/CTR/NoPadding took 0.179797 seconds.
-----------------------------------------
AES/GCM/NoPadding took 0.961051 seconds.
AES/GCM/NoPadding took 0.952866 seconds.
AES/GCM/NoPadding took 0.963486 seconds.
AES/GCM/NoPadding took 0.963280 seconds.
AES/GCM/NoPadding took 0.961424 seconds.
AES/GCM/NoPadding took 0.977850 seconds.
AES/GCM/NoPadding took 0.961449 seconds.
AES/GCM/NoPadding took 0.957542 seconds.
AES/GCM/NoPadding took 0.967129 seconds.
AES/GCM/NoPadding took 0.959292 seconds.
这很奇怪,因为GCM是几乎5慢于CTR(用于加密倍1<<26字节,即,64 MB).通过使用OpenSSL的1.1.1a速度测试,我发出的命令openssl speed -evp aes-128-ctr和openssl speed -evp aes-128-gcm,并得到了以下结果:
The 'numbers' are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes
aes-128-ctr 463059.16k 1446320.32k 3515070.12k 5182218.92k 6063797.59k 6210150.19k
aes-128-gcm 480296.99k 1088337.47k 2531854.17k 4501395.11k 5940079.27k 6087589.89k
可以看出GCM仅略低于CTR,尤其是对于较大的明文.
为什么AES-GCM的Java实现比AES-CTR慢?我错过了什么吗?
PS:我也使用Java JMH进行微基准测试,结果相似.
另请参阅此答案,其中OP解释了早期JDK中如何解决AES性能问题.
java aes ctr_与AES-CTR相比,Java AES-GCM非常慢相关推荐
- java PKCS7Padding 加密Cannot find any provider supporting AES/CBC/PKCS7Padding 解决办法
在java中用aes256进行加密,但是发现java里面不能使用PKCS7Padding,而java中自带的是PKCS5Padding填充,那解决办法是,通过BouncyCastle组件来让java里 ...
- aes解密算法 java_AES算法实现Java和JS互通加解密
实际开发中客户端与服务端的通信内容往往需要通过密文传输,本文将介绍可以实现Java与js的互相加解密的AES加密方式 Java语言实现 public class AESTest { //static ...
- java aes iv 24位_当key和IV是Java字节数组时,用python进行AES解密
我有以下两个值: AES key它是一个Java字节数组64,67,-65,88,-19,-118,-16,-53,-81,-98,44,-83,82,-90,124,112,-120,42,92,6 ...
- Java带KeyGenerator(密钥生成器)生成AES加密,c++里面AES解密
之前文章Java里面生成AES加密,c++里面AES解密介绍了Java代码加密,c++代码解密.本文介绍:Java带KeyGenerator(密钥生成器)生成AES加密,c++里面AES解密 一.Ja ...
- Java RSA、AES加解密,Python RSA、AES加解密
需求 python服务发起加密http请求网关,网关验签解密后路由返回加密结果,python服务解密得到明文 请求加密 生成随机字符 s,[a-z][A-z][0-9] 16位 ,例如:s=2zQ6E ...
- java和其他语言相比 特点,【单选题】与其他面向对象语言相比,Java语言突出的特点是:...
[单选题]与其他面向对象语言相比,Java语言突出的特点是: 更多相关问题 55 A fresh B soft C deep D warm 13 Many economists have given ...
- php aes 256 加解密,PHP完整的AES加解密算法使用及例子(256位)
依赖PHP自身的mcrypt扩展 class aes { // CRYPTO_CIPHER_BLOCK_SIZE 32 private $_secret_key = 'default_secret_k ...
- java.io.IOException: exception unwrapping private key - java.security.InvalidKeyException
java.io.IOException: exception unwrapping private key - java.security.InvalidKeyException: Illegal k ...
- java python算法_用Python,Java和C ++示例解释的排序算法
java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...
- java安装_我最喜欢的Java高级开发人员书籍
java安装 我上一篇博客文章(我对高级Java开发人员的十个最喜欢的在线资源)的想法,是由Xiaoran Wang发表的 "面向高级Java开发人员的十大网站"的启发. Wang ...
最新文章
- c语言实验报告世界时钟,基于LCD的电子时钟实验报告.doc
- NYOJ 275 队花的烦恼一
- inline-block的兼容性问题
- HDU-6470 Count (构造矩阵+矩阵快速幂)
- python3 字符串方法
- SpringCloud工作笔记047---FastJson解析多级JSON_FastJson解析嵌套JSON_FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换
- 在pycharm/IDEA里编辑latex:TeXiFy-IDEA/Pycharm
- dynamips常用命令
- 音频测试方法(tiny)
- Docker容器监控cAdvisor
- Android 应用FPS测试方法介绍
- Python指数运算
- c语言中断函数作用,进一步理解中断函数
- 如何魔改Xilinx Vivado 的MIG IP核
- java中的直接内存
- 【精】iOS知识树,知识点(包括对象、Block、消息转发、GCD、运行时、runloop、动画、Push、KVO、tableview,UIViewController、提交AppStore)
- 文档点击链接无法自动跳转浏览器+google浏览器重启无法继续浏览上次打开的网页
- 使用DBUtil踩过的坑,使用DButil查不出结果
- 微盟删库血案背后人的错还是代码的锅?
- I2C 与 I3C协议
热门文章
- Jenkins-springcloud项目打包并上传docker仓库
- OpenGL学习(十)天空盒
- ORA-01558故障恢复----惜分飞
- leetcode1306
- Feng's blog
- 一文深入浅出理解国产开源木兰许可系列协议
- linux多窗口切换,linux screen 多窗口命令分析
- 第9章 Quartz定时器和发送Email
- 天龙手游角色删除服务器还有显示,天龙八部手游怎么删除角色_角色删除方法详解_玩游戏网...
- 不懂SpringApplication生命周期事件?那就等于不会Spring Boot嘛