2016-11-05 3 views
1

I次のコードを持っている:いくつかの理由Cipher.doFinal(byte [] b)を使用すると、最初の復号後の暗号化が速くなりますか?

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); 

それ史上初の復号化(および機会に最初のカップル)次の解読よりも常に長くかかります。ただし、これは同じ暗号化を解読することに限定されません。私は2つのバイト配列、Bを、暗号化した場合、私はの暗号を解読した場合たとえば、まず、その後、Bの解読がはるかに高速に実行されます。

基本的に、の復号化への最初の(時にはカップルの)コールは、その後のすべての呼び出しで常に遅くなります( )。私は自分自身のベンチマークのいくつかを行い、その違いが私の呼び出しであると思われることを発見しましたc.doFinal(Arrays.copyOfRange(encryptedData、16、encryptedData.length)、これはばかな質問で、任意の助けに感謝場合、私は事前にお詫び申し上げます。

+0

このリンクをご覧ください:http://stackoverflow.com/a/29881041/6296931 –

+2

@CoderACJHPリンクはどのように関係していますか? –

答えて

2

バイトコードはJavaで実行されて初めてそれは一般的に(JVMによって)コンパイルされた後。

の場合よりもネイティブコードをJITコンパイラで実行した後、ネイティブコードを保存して再度使用するため、後続の呼び出しが最初のコードより高速になることが期待されます。startup delay and optimizations

関連する問題