android AES加密/解密

时间:2012-05-16 13:37:27

标签: android performance aes

我设法编写了进行文件加密/解密的功能。 但它的速度非常慢,特别是随着文件大小的增加。例如,几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;
}

我一直在评论我试过的其他算法,但没有看到任何区别。 非常感谢您的帮助

1 个答案:

答案 0 :(得分:2)

描述你的代码,但你可能做了太多的IO。使您的buffer更大,它不必与密码块大小相同。至于实际的加密速度,它主要取决于CPU,所以你不能真正改变它。您可以尝试使用本机代码(OpenSSL等),看看是否有所作为。