Java crypto,是否可以重置IV以提高性能?

J Pullar

我按如下方式创建加密密码(在Scala中,使用充气城堡)

  def encryptCipher(secret:SecretKeySpec, iv:IvParameterSpec):Cipher = {
    val e = Cipher.getInstance("AES/GCM/NoPadding")
    e.init(Cipher.ENCRYPT_MODE, secret, iv)
  }

您会看到生成密钥规范的缓慢操作已得到解决。但是,为每个消息本身调用init太慢了。
我目前正在处理5万条消息,调用init方法会增加近4秒钟的时间。

有没有一种方法可以用新的IV重新初始化,而这种IV并不那么费时?

伊丹加

在标准库中没有标准的方法可以执行此操作,但是如果您使用的是AES,则有一个很好的解决方法:

IV的目的是消除将相同的纯文本加密为相同的密文的可能性。

您可以Cipher.update(byte[])在加密之前使用一个随机块大小的字节数组来“更新”(如中所述)(解密时使用相同的块)。这几乎与使用与IV相同的随机块完全相同。

为此,请运行此代码段(使用上面的方法来生成完全相同的密文-但这只是为了与其他平台兼容,因此无需计算特定的IV即可确保其安全。

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecureRandom secureRandom = new SecureRandom();

byte[] keyBytes = new byte[16];
secureRandom.nextBytes(keyBytes);
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");

byte[] plain = new byte[256];
secureRandom.nextBytes(plain);

// first init using random IV (save it for later)
cipher.init(Cipher.ENCRYPT_MODE, key, secureRandom);
byte[] realIv = cipher.getIV();
byte[] expected = cipher.doFinal(plain);

// now init using dummy IV and encrypt with real IV prefix
IvParameterSpec nullIv = new IvParameterSpec(new byte[16]);
cipher.init(Cipher.ENCRYPT_MODE, key, nullIv);
// calculate equivalent iv
Cipher equivalentIvAsFirstBlock = Cipher.getInstance("AES/CBC/NoPadding");
equivalentIvAsFirstBlock.init(Cipher.DECRYPT_MODE, key, nullIv);
byte[] equivalentIv = equivalentIvAsFirstBlock.doFinal(realIv);

cipher.update(equivalentIv);
byte[] result = cipher.doFinal(plain);
System.out.println(Arrays.equals(expected, result));

解密部分比较容易,因为将块解密的结果与先前的密文进行异或(请参阅块密文操作模式),您只需要在密文后面附加真实的IV,然后将其扔掉即可:

// Encrypt as before

IvParameterSpec nullIv = new IvParameterSpec(new byte[16]);
cipher.init(Cipher.DECRYPT_MODE, key, nullIv);

cipher.update(realIv);
byte[] result = cipher.doFinal(encrypted);
// result.length == plain.length + 16
// just throw away the first block

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java crypto,是否可以重设IV以提高性能?

来自分类Dev

提高性能-Java

来自分类Dev

Java两个Web服务调用可以并发以提高性能

来自分类Dev

多线程会提高性能吗?场景Java

来自分类Dev

带有reduce()的Java parallelStream()不能提高性能

来自分类Dev

带有reduce()的Java parallelStream()不能提高性能

来自分类Dev

有关提高性能的建议Java代码

来自分类Dev

骨干:范围界定是否可以提高性能?

来自分类Dev

连接池是否总是可以提高性能?

来自分类Dev

使用可为空的结构是否可以提高性能?

来自分类Dev

更具体的异常处理是否可以提高性能?

来自分类Dev

在for循环中使用str.length()值存储在变量中之前,它在Java中是否能提高性能?

来自分类Dev

Java 8 mapToInt(mapToInt(e-> e))如何精确地提高性能?

来自分类Dev

提高Java的BigInteger性能

来自分类Dev

通常,将输出重定向到/ dev / null是否可以提高性能?

来自分类Dev

将const调用应用于原始类型时,是否可以提高性能?

来自分类Dev

将常用字符串定义为变量是否可以提高性能?

来自分类Dev

IDE到SATA适配器是否可以提高性能?

来自分类Dev

RAID1是否可以通过Linux mdadm提高性能?

来自分类Dev

浏览器端是否可以调整大小以提高性能?

来自分类Dev

在加密卷上使用压缩文件系统是否可以提高性能?

来自分类Dev

jQuery:选择器专一性是否可以通过.on()委派提高性能?

来自分类Dev

HDD速度较慢的系统上的交换交换是否可以提高性能?

来自分类Dev

在隐式类上扩展AnyVal是否可以提高性能?

来自分类Dev

SQL提高性能

来自分类Dev

skSpriteKit提高性能

来自分类Dev

CLS 提高性能

来自分类Dev

字符/数字的乘法可以提高性能吗?

来自分类Dev

通过使用yield与foreach可以提高性能吗?

Related 相关文章

  1. 1

    Java crypto,是否可以重设IV以提高性能?

  2. 2

    提高性能-Java

  3. 3

    Java两个Web服务调用可以并发以提高性能

  4. 4

    多线程会提高性能吗?场景Java

  5. 5

    带有reduce()的Java parallelStream()不能提高性能

  6. 6

    带有reduce()的Java parallelStream()不能提高性能

  7. 7

    有关提高性能的建议Java代码

  8. 8

    骨干:范围界定是否可以提高性能?

  9. 9

    连接池是否总是可以提高性能?

  10. 10

    使用可为空的结构是否可以提高性能?

  11. 11

    更具体的异常处理是否可以提高性能?

  12. 12

    在for循环中使用str.length()值存储在变量中之前,它在Java中是否能提高性能?

  13. 13

    Java 8 mapToInt(mapToInt(e-> e))如何精确地提高性能?

  14. 14

    提高Java的BigInteger性能

  15. 15

    通常,将输出重定向到/ dev / null是否可以提高性能?

  16. 16

    将const调用应用于原始类型时,是否可以提高性能?

  17. 17

    将常用字符串定义为变量是否可以提高性能?

  18. 18

    IDE到SATA适配器是否可以提高性能?

  19. 19

    RAID1是否可以通过Linux mdadm提高性能?

  20. 20

    浏览器端是否可以调整大小以提高性能?

  21. 21

    在加密卷上使用压缩文件系统是否可以提高性能?

  22. 22

    jQuery:选择器专一性是否可以通过.on()委派提高性能?

  23. 23

    HDD速度较慢的系统上的交换交换是否可以提高性能?

  24. 24

    在隐式类上扩展AnyVal是否可以提高性能?

  25. 25

    SQL提高性能

  26. 26

    skSpriteKit提高性能

  27. 27

    CLS 提高性能

  28. 28

    字符/数字的乘法可以提高性能吗?

  29. 29

    通过使用yield与foreach可以提高性能吗?

热门标签

归档