1

I have managed to code the function for doing file encryption / decryption . But its very slow especially as the file size increase. for eg audio / vidoe file which are few MB long

I have gone through almost all post to improve it, and tried changing the algorthms. Please help me if there is any change that can help me improve performance.

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

i have kept in comments the other algos i had tried but didnt see any difference. Thanks a lot for the help

png
  • 4,368
  • 7
  • 69
  • 118

1 Answers1

2

Profile your code, but you are probably doing too much IO. Make your buffer larger, it doesn't have to be the same size as the cipher block size. As for the actual encryption speed, it depends mostly on the CPU, so you can't really change that. You could try to use native code (OpenSSL, etc.) and see if that makes a difference.

Nikolay Elenkov
  • 52,576
  • 10
  • 84
  • 84
  • 1
    Thanks . I tried increasing the buffer size.It didnt make much difference. Can you suggest any other change that can help. I tried encrypting the file using some other app and its quite fast. I dont know what magic they are doing :) . so i cannot really blame the processor – png May 17 '12 at 07:13