Java 使用Cipher.doFinal(字节[]b)在第一次解密后解密速度更快?

Java 使用Cipher.doFinal(字节[]b)在第一次解密后解密速度更快?,java,encryption,Java,Encryption,我有以下代码: 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"); Secre

我有以下代码:

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的加密,那么b的解密将执行得更快

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


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

字节码第一次在Java中运行时,通常是(由JVM)编译的通过编译器调用本机代码。之后,它会保存本机代码并再次使用。因此,我希望后续调用会比第一次调用更快。另请参见。

查看此链接可能会帮助您:@CoderACJHP该链接有何关联?