gpt4 book ai didi

java - 首次解密后使用 Cipher.doFinal(byte[] b) 解密速度更快?

转载 作者:行者123 更新时间:2023-11-30 02:45:01 25 4
gpt4 key购买 nike

我有以下代码:

KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
SecretKey mSecretKey = keyGen.generateKey();

public byte[] encrypt(byte[] data) {
try {
Cipher c = Cipher.getInstance("AES/CBC/PKCS5PADDING");
SecretKeySpec k = new SecretKeySpec(mSecretKey.getEncoded(), "AES");
c.init(Cipher.ENCRYPT_MODE, k);
byte[] encryptedData = c.doFinal(data);
return Bytes.concat(c.getIV(), encryptedData);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

public byte[] decrypt(byte[] encryptedData) {
try {
byte[] iv = Arrays.copyOfRange(encryptedData, 0, 16);
SecretKeySpec k = new SecretKeySpec(mSecretKey.getEncoded(), "AES");
Cipher c = Cipher.getInstance("AES/CBC/PKCS5PADDING");
c.init(Cipher.DECRYPT_MODE, k, new IvParameterSpec(iv));
byte[] decrypted = c.doFinal(Arrays.copyOfRange(encryptedData, 16, encryptedData.length));
return decrypted;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

由于某种原因,我发现如果我执行如下所示的操作:

byte[] encrypted = encrypt(some_byte_array);

byte[] decrypt1 = decrypt(encrypted);
byte[] decrypt2 = decrypt(encrypted);
...
byte[] decryptN = decrypt(encrypted);

第一次解密(有时是第一对解密)总是比接下来的解密花费更长的时间。然而,这并不限于解密相同的加密。例如,如果我加密两个字节数组,ab,如果我先解密a的加密,然后解密a>b 执行速度会快得多。

所以基本上,第一次(有时是几次)解密调用总是比所有后续调用。我做了一些自己的基准测试,发现差异似乎在于我对 c.doFinal(Arrays.copyOfRange(encryptedData, 16, cryptoData.length) 的调用,第一次需要更长的时间(有时比之后的几)倍。

如果这是一个愚蠢的问题,我提前道歉,并感谢您的帮助。

最佳答案

字节码第一次在 Java 中运行时,通常会通过 JIT 编译(由 JVM)为 native 代码。编译器。之后,它保存 native 代码并再次使用。因此,我预计后续调用会比第一次调用更快。另请参阅startup delay and optimizations .

关于java - 首次解密后使用 Cipher.doFinal(byte[] b) 解密速度更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40443876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com