2012-05-16 2 views
1

Мне удалось закодировать функцию для шифрования/дешифрования файлов. Но его очень медленный, особенно при увеличении размера файла. например, файл audio/vidoe длиной в несколько МБandroid AES шифрование/дешифрование

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

public class DataEncryptDecrypt { 
public Cipher encryptcipher, decryptCipher; 
int blockSize = 16; 
String TAG = "DataEncryptDecrypt"; 
private static final String RANDOM_ALGORITHM = "SHA1PRNG"; 

public DataEncryptDecrypt(String passwd) { 
    final String CIPHERMODEPADDING = "AES/CBC/PKCS5Padding"; 
    //AES/CBC/PKCS7Padding 
    char[] humanPassphrase = passwd.toCharArray(); 
    byte[] salt = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 
      0xF }; // must save this! 
    //salt =generateSalt(); 
    final int HASH_ITERATIONS = 100; 
    final int KEY_LENGTH = 128; //256 
    PBEKeySpec mykeyspec = new PBEKeySpec(humanPassphrase, salt, 
      HASH_ITERATIONS, KEY_LENGTH); 
// final String KEY_GENERATION_ALG = "PBEWITHSHAANDTWOFISH-CBC"; 
    final String KEY_GENERATION_ALG="PBEWithMD5And128BitAES-CBC-OpenSSL"; 
    SecretKey sk; 
    try { 
     encryptcipher = Cipher.getInstance(CIPHERMODEPADDING); 
     SecretKeyFactory keyfactory = SecretKeyFactory 
       .getInstance(KEY_GENERATION_ALG); 
     sk = keyfactory.generateSecret(mykeyspec); 

     // step 1 - get an instance of the cipher, specifying the mode and 
     // padding 

     byte[] iv = { 0xA, 1, 0xB, 5, 4, 0xF, 7, 9, 0x17, 3, 1, 6, 8, 0xC, 
       0xD, 91 }; // must save this 
     //iv= generateIv(); 
     IvParameterSpec IV = new IvParameterSpec(iv); 
     encryptcipher = Cipher.getInstance(CIPHERMODEPADDING); 
     decryptCipher = Cipher.getInstance(CIPHERMODEPADDING); 

     // step 2 - initialize the cipher 
     encryptcipher.init(Cipher.ENCRYPT_MODE, sk, IV); 
     decryptCipher.init(Cipher.DECRYPT_MODE, sk, IV); 

    } catch (NoSuchAlgorithmException nsae) { 
     Log.e("AESdemo", 
       "no key factory support for PBEWITHSHAANDTWOFISH-CBC"); 
    } catch (InvalidKeySpecException ikse) { 
     Log.e("AESdemo", "invalid key spec for PBKDF2"); 
    } catch (Exception ex) { 

    } 
} 

public String encryptData(String inputFileName) { 
    String outFilename = null; 
    File inputFile = new File(inputFileName); 
    try { 

     // step 3 - not needed, as we have all the blocks on hand 

     // step 4 - call doFinal() 

     outFilename = ".".concat(CommonUtils.getHash(inputFile.getName())); 
     InputStream fis; 
     OutputStream fos; 
     fis = new BufferedInputStream(new FileInputStream(inputFileName)); 

     fos = new BufferedOutputStream(new FileOutputStream(
       inputFile.getParent() + "/" + outFilename)); 
     Log.i(TAG, "Output path:" + inputFile.getParent() + "/" + outFilename); 
     byte[] buffer = new byte[blockSize]; 
     int noBytes = 0; 
     byte[] cipherBlock = new byte[encryptcipher 
       .getOutputSize(buffer.length)]; 
     int cipherBytes; 
     while ((noBytes = fis.read(buffer)) != -1) { 
      cipherBytes = encryptcipher.update(buffer, 0, noBytes, 
        cipherBlock); 
      fos.write(cipherBlock, 0, cipherBytes); 
     } 
     // always call doFinal 
     cipherBytes = encryptcipher.doFinal(cipherBlock, 0); 
     fos.write(cipherBlock, 0, cipherBytes); 

     // close the files 
     fos.close(); 
     fis.close(); 
     Log.i("encrpty", "done"); 
     inputFile.delete(); 
    } 

    catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
    return inputFile.getParent() + "/" + outFilename; 
} 

Я сохранил в комментариях другие algos, которые я пробовал, но не видел никакой разницы. Большое спасибо за помощь

ответ

2

Профиль вашего кода, но вы, вероятно, делаете слишком много ввода-вывода. Сделайте свой размер buffer больше, он не должен быть того же размера, что и размер блока шифрования. Что касается фактической скорости шифрования, это зависит в основном от процессора, поэтому вы не можете это изменить. Вы можете попробовать использовать собственный код (OpenSSL и т. Д.) И посмотреть, не изменилось ли это.

+1

Спасибо. Я попытался увеличить размер буфера. Это не имело большого значения. Можете ли вы предложить любые другие изменения, которые могут помочь. Я пробовал шифровать файл с помощью другого приложения и довольно быстро. Я не знаю, какую магию они делают :). поэтому я не могу обвинить процессор – png

+0

. Хороший пример можно найти по адресу: http://stackoverflow.com/a/33171612/475496 – StaticBR

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