Cipher对象是否可重用?

时间:2011-01-27 12:32:40

标签: java performance encryption

我可以在多个方法中使用相同的Cipher对象,因为getInstanceinit的方法参数不会更改吗?

例如,假设应用程序的多个部分在实用程序类中使用decrypt方法。传递的所有加密值都使用相同的密钥和算法生成。那么,我可以重用相同的Cipher对象吗?

真的值得担心Cipher的多个创作(可能会导致创建KeySpecSecretKey个对象吗?

3 个答案:

答案 0 :(得分:0)

是的

如文档所述:

  

完成后,此方法将该密码对象重置为其状态   以前是通过调用init初始化的。那就是   对象被重置并且可以加密或解密(取决于   在调用init时指定的操作模式)更多数据。

答案 1 :(得分:0)

是的,但是……为什么?也就是说,使用任何算法的“新密码”实现的开销几乎为零。 “init()”调用有更多开销,无论如何都必须按如下方式重做:

  SecretKey secretKey = new SecretKeySpec(key,baseAlgorithm);
  Cipher cipher = Cipher.getInstance(algorithm);
  IvParameterSpec ivSpec = new IvParameterSpec(iv);
  cipher.init(Cipher.ENCRYPT_MODE,secretKey,ivSpec);

哪里:

  • key 是一个字节数组
  • baseAlgorithm 是类似于“AES”的名称,适用于密钥类型
  • 算法就像“AES...”这样的名字
  • iv 是初始化向量(字节数组)

答案 2 :(得分:-5)

您可以重复使用密码对象,但每次都必须通过为每个操作调用init()来初始化密码对象。

如果您担心重新创建KeySpec,您应该保存它并在多个init()中使用相同的值。