Я попытался расшифровать файл размером 4.2 MB .dcf с использованием ключа AES 128 бит, но потребовалось 33 секунды для расшифровки (на функции cipher.doFinal (data)), нормально ли это?
Вот фрагмент кода:
long start = System.currentTimeMillis()/1000L; try { SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivspec); android.util.Log.d("TEST", "Start decoding...." + String.valueOf(length)); byte[] decrypted = cipher.doFinal(content); File file2 = new File(Environment.getExternalStorageDirectory().getPath() + "/test.mp3"); OutputStream os = new FileOutputStream(file2); os.write(decrypted); } catch (Exception ex) { ex.printStackTrace(); } long end = System.currentTimeMillis()/1000L; android.util.Log.d("TEST","Time "+ String.valueOf(end-start));
Вы должны попытаться провести время без записи файла, то есть вызвать System.currentTimeMillis()
прямо перед и сразу после вызова cipher.doFinal()
.
При этом телефон на базе Android обычно использует недавний процессор ARM с тактовой частотой 500 МГц или более, и такой зверь теоретически способен шифровать AES или AES-дешифровать несколько мегабайт данных в секунду.
Однако в Android-коде используется виртуальная машина почти Java, называемая Dalvik . До Android-2.2 это интерпретатор (не JIT-компилятор), а это означает, что он довольно медленный для задач с интенсивным вычислением. Если посредственная производительность, которую вы наблюдаете, действительно исходит из самой операции AES (а не записи файла), тогда правдоподобный ответ заключается в том, что ваша виртуальная машина обеспечивает реализацию AES, написанную на Java и интерпретированную с помощью Dalvik. В этом случае есть немного лекарств, кроме надежд на наличие лучшей реализации ВМ (виртуальная машина может использовать встроенную реализацию кода для AES, а также с Android 2.2 и более поздними версиями у Dalvik есть JIT-компилятор, который должен повысить производительность выполнения кода ).
AFAIK, нет возможности получить доступ к аппаратным средствам шифрования / дешифрования AIS от ARM через API Android 🙁
Это огромный надзор со стороны Google, к сожалению … делает использование AES на других платформах намного быстрее ….