请考虑以下代码:

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非常慢相关推荐

  1. java PKCS7Padding 加密Cannot find any provider supporting AES/CBC/PKCS7Padding 解决办法

    在java中用aes256进行加密,但是发现java里面不能使用PKCS7Padding,而java中自带的是PKCS5Padding填充,那解决办法是,通过BouncyCastle组件来让java里 ...

  2. aes解密算法 java_AES算法实现Java和JS互通加解密

    实际开发中客户端与服务端的通信内容往往需要通过密文传输,本文将介绍可以实现Java与js的互相加解密的AES加密方式 Java语言实现 public class AESTest { //static ...

  3. 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 ...

  4. Java带KeyGenerator(密钥生成器)生成AES加密,c++里面AES解密

    之前文章Java里面生成AES加密,c++里面AES解密介绍了Java代码加密,c++代码解密.本文介绍:Java带KeyGenerator(密钥生成器)生成AES加密,c++里面AES解密 一.Ja ...

  5. Java RSA、AES加解密,Python RSA、AES加解密

    需求 python服务发起加密http请求网关,网关验签解密后路由返回加密结果,python服务解密得到明文 请求加密 生成随机字符 s,[a-z][A-z][0-9] 16位 ,例如:s=2zQ6E ...

  6. java和其他语言相比 特点,【单选题】与其他面向对象语言相比,Java语言突出的特点是:...

    [单选题]与其他面向对象语言相比,Java语言突出的特点是: 更多相关问题 55 A fresh B soft C deep D warm 13 Many economists have given ...

  7. php aes 256 加解密,PHP完整的AES加解密算法使用及例子(256位)

    依赖PHP自身的mcrypt扩展 class aes { // CRYPTO_CIPHER_BLOCK_SIZE 32 private $_secret_key = 'default_secret_k ...

  8. java.io.IOException: exception unwrapping private key - java.security.InvalidKeyException

    java.io.IOException: exception unwrapping private key - java.security.InvalidKeyException: Illegal k ...

  9. java python算法_用Python,Java和C ++示例解释的排序算法

    java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...

  10. java安装_我最喜欢的Java高级开发人员书籍

    java安装 我上一篇博客文章(我对高级Java开发人员的十个最喜欢的在线资源)的想法,是由Xiaoran Wang发表的 "面向高级Java开发人员的十大网站"的启发. Wang ...

最新文章

  1. c语言实验报告世界时钟,基于LCD的电子时钟实验报告.doc
  2. NYOJ 275 队花的烦恼一
  3. inline-block的兼容性问题
  4. HDU-6470 Count (构造矩阵+矩阵快速幂)
  5. python3 字符串方法
  6. SpringCloud工作笔记047---FastJson解析多级JSON_FastJson解析嵌套JSON_FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换
  7. 在pycharm/IDEA里编辑latex:TeXiFy-IDEA/Pycharm
  8. dynamips常用命令
  9. 音频测试方法(tiny)
  10. Docker容器监控cAdvisor
  11. Android 应用FPS测试方法介绍
  12. Python指数运算
  13. c语言中断函数作用,进一步理解中断函数
  14. 如何魔改Xilinx Vivado 的MIG IP核
  15. java中的直接内存
  16. 【精】iOS知识树,知识点(包括对象、Block、消息转发、GCD、运行时、runloop、动画、Push、KVO、tableview,UIViewController、提交AppStore)
  17. 文档点击链接无法自动跳转浏览器+google浏览器重启无法继续浏览上次打开的网页
  18. 使用DBUtil踩过的坑,使用DButil查不出结果
  19. 微盟删库血案背后人的错还是代码的锅?
  20. I2C 与 I3C协议

热门文章

  1. Jenkins-springcloud项目打包并上传docker仓库
  2. OpenGL学习(十)天空盒
  3. ORA-01558故障恢复----惜分飞
  4. leetcode1306
  5. Feng's blog
  6. 一文深入浅出理解国产开源木兰许可系列协议
  7. linux多窗口切换,linux screen 多窗口命令分析
  8. 第9章 Quartz定时器和发送Email
  9. 天龙手游角色删除服务器还有显示,天龙八部手游怎么删除角色_角色删除方法详解_玩游戏网...
  10. 不懂SpringApplication生命周期事件?那就等于不会Spring Boot嘛