I managed to encode a function to encrypt / decrypt files. But its very slow, especially as the file size increases. for example, a few MB audio / vidoe file
I went through almost the entire post to improve it, and tried to change the algortma. Please help me if there are any changes that can help me improve my 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";
char[] humanPassphrase = passwd.toCharArray();
byte[] salt = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xA, 0xB, 0xC, 0xD, 0xE,
0xF };
final int HASH_ITERATIONS = 100;
final int KEY_LENGTH = 128;
PBEKeySpec mykeyspec = new PBEKeySpec(humanPassphrase, salt,
HASH_ITERATIONS, KEY_LENGTH);
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);
byte[] iv = { 0xA, 1, 0xB, 5, 4, 0xF, 7, 9, 0x17, 3, 1, 6, 8, 0xC,
0xD, 91 };
IvParameterSpec IV = new IvParameterSpec(iv);
encryptcipher = Cipher.getInstance(CIPHERMODEPADDING);
decryptCipher = Cipher.getInstance(CIPHERMODEPADDING);
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 {
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);
}
cipherBytes = encryptcipher.doFinal(cipherBlock, 0);
fos.write(cipherBlock, 0, cipherBytes);
fos.close();
fis.close();
Log.i("encrpty", "done");
inputFile.delete();
}
catch (Exception ex) {
ex.printStackTrace();
}
return inputFile.getParent() + "/" + outFilename;
}
I kept in the comments the other algos that I tried but did not see any difference. Thank you very much for your help