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)、これはばかな質問で、任意の助けに感謝場合、私は事前にお詫び申し上げます。
このリンクをご覧ください:http://stackoverflow.com/a/29881041/6296931 –
@CoderACJHPリンクはどのように関係していますか? –