我设法编写了进行文件加密/解密的功能。 但它的速度非常慢,特别是随着文件大小的增加。例如,几MB长的音频/视频文件
我已经完成了几乎所有的帖子来改进它,并试图改变algorthms。 如果有任何变化可以帮助我提高绩效,请帮助我。
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;
}
我一直在评论我试过的其他算法,但没有看到任何区别。 非常感谢您的帮助
答案 0 :(得分:2)
描述你的代码,但你可能做了太多的IO。使您的buffer
更大,它不必与密码块大小相同。至于实际的加密速度,它主要取决于CPU,所以你不能真正改变它。您可以尝试使用本机代码(OpenSSL等),看看是否有所作为。