2013-12-24 6 views
2

Я разрабатываю приложение для Android для шифрования файлов по телефону. В поисках, я нашел эту тему: How to encrypt file from SD card using AES in Android?Увеличьте скорость шифрования AES android

Метод работает нормально, но очень медленно шифровать файлы ... В этой строке: byte [] d = новый байт [8]; почему только 8 байтов? не можем ли мы установить более высокое значение?

Кроме того, вы знаете способ быстрого шифрования файлов? Я слышал о crypto ++ для собственной реализации кода, но как я могу реализовать JNI в своем приложении?

Спасибо,

EDIT: Шифрование функция

public void encrypt (String RSAPrivateKey, String Key, byte[] iv, String zipname, ZipEncryptAsyncTask task) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException 
    { 
     FileInputStream  fis  = new FileInputStream (zipname + ".temp"); 
     FileOutputStream fos  = new FileOutputStream (zipname); 
     SecretKeySpec  sks  = new SecretKeySpec  (Base64.decode(Key, Base64.DEFAULT), "AES"); 
     IvParameterSpec  ivspec = new IvParameterSpec (iv); 
     Cipher    cipher = Cipher.getInstance ("AES/CBC/PKCS5Padding"); 

     fos.write(String.valueOf(RSAPrivateKey.getBytes().length).getBytes()); 
     fos.write(RSAPrivateKey.getBytes()); 

     cipher.init(Cipher.ENCRYPT_MODE, sks, ivspec); 
     CipherOutputStream cos = new CipherOutputStream(fos, cipher); 

     long size = 0; 
     byte[] d = new byte[8]; 
     for(int b; (b = fis.read(d)) != -1;) 
     { 
      cos.write(d, 0, b); 
      task.doProgress((size += 8)); 
     } 

     cos.flush(); 
     cos.close(); 
     fis.close(); 

     new File(zipname + ".temp").delete(); 
    } 
+0

Пожалуйста, не могли бы вы разместить свой код шифрования? Может быть, мы сможем найти что-то, что поцарапать там. –

+0

добавлен код, спасибо – Flo354

+0

Предлагаю вам обернуть ваши файлы FileInputStreams и FileOutputStreams в BufferedInputStreams и BufferedOutputStreams, профилировать обе версии и сравнить производительность. Вы даже должны попробовать с разными размерами буфера. Кстати, вы должны выяснить, можете ли вы реорганизовать метод, который имеет переменную 'cipher' и ее инициализацию' cipher.init', похоже, что она может что-то улучшить? –

ответ

0

как сказал @CodesInChaos, способ сделать это, чтобы увеличить размер буфера. Теперь я делаю бенчмарк, который определяет лучший размер для буфера, и я использую оптимальное значение.

1

В качестве альтернативы вы можете рассмотреть возможность изменения режима шифрования, который вы используете. Режим CBC должен использоваться последовательно, блок за блоком. Режим счетчика (CTR) может запускаться параллельно с одновременным зашифрованием различных блоков. Конечно, для параллельной обработки есть накладные расходы, и вам нужно будет переработать код, но если изменение размера буфера не даст вам достаточной скорости, то это может быть следующий вариант.

Смежные вопросы