Android AES-128加密/解密文件非常慢。我怎样才能提高速度

时间:2015-01-18 21:47:33

标签: android encryption cryptography aes bouncycastle

我正在开发一款能够保护VaultyKeep safe等图片和视频的Android应用。我正在尝试使用AES-128加密/解密技术来存储图像和视频。我通过分别拍摄尺寸为5.13,4.76和5.31的3个样本图像来尝试它。但加密消耗的时间分别为25秒,22秒,27秒,解密时间分别为31秒,30秒,34秒。我在HTC One X上测试它。

这样的速度对我的应用程序来说不可行,因为用户可以快速滚动和查看图像而不会中断。您能否建议我如何提高性能(速度)或者我应该切换到其他算法?您能否建议我使用其他技术快速加密/解密图像和视频,而不会过多地影响安全性。

我尝试了VaultyKeep safe,而且速度非常快。据说Vaulty使用的是AES-256,但在加密和查看图像方面仍然非常快速且反应灵敏。 vaulty如何快速使用AES-256?

我正在使用的代码是:

 static void encrypt(String filename) throws IOException, NoSuchAlgorithmException,
        NoSuchPaddingException, InvalidKeyException {

    // Here you read the cleartext.
    File extStore = Environment.getExternalStorageDirectory();
    startTime = System.currentTimeMillis();
    Log.i("Encryption Started",extStore + "/5mbtest/"+filename);
    FileInputStream fis = new FileInputStream(extStore + "/5mbtest/"+filename);
    // This stream write the encrypted text. This stream will be wrapped by
    // another stream.



    FileOutputStream fos = new FileOutputStream(extStore + "/5mbtest/"+filename+".aes", false);

    // Length is 16 byte
    SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(),
            "AES");
    // Create cipher
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
    cipher.init(Cipher.ENCRYPT_MODE, sks);
    // Wrap the output stream
    CipherOutputStream cos = new CipherOutputStream(fos, cipher);
    // Write bytes
    int b;
    byte[] d = new byte[8];
    while ((b = fis.read(d)) != -1) {
        cos.write(d, 0, b);
    }
    // Flush and close streams.
    cos.flush();
    cos.close();
    fis.close();
    stopTime = System.currentTimeMillis();
    Log.i("Encryption Ended",extStore + "/5mbtest/"+filename+".aes");
    Log.i("Time Elapsed", ((stopTime - startTime)/1000.0)+"");
}

static void decrypt(String filename) throws IOException, NoSuchAlgorithmException,
        NoSuchPaddingException, InvalidKeyException {
    File extStore = Environment.getExternalStorageDirectory();
    Log.i("Decryption Started",extStore + "/5mbtest/"+filename+".aes");
    FileInputStream fis = new FileInputStream(extStore + "/5mbtest/"+filename+".aes");

    FileOutputStream fos = new FileOutputStream(extStore + "/5mbtest/"+"decrypted"+filename,false);
    SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(),
            "AES");
    // Create cipher
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
    cipher.init(Cipher.DECRYPT_MODE, sks);
    startTime = System.currentTimeMillis();
    CipherInputStream cis = new CipherInputStream(fis, cipher);
    int b;
    byte[] d = new byte[8];
    while ((b = cis.read(d)) != -1) {
        fos.write(d, 0, b);
    }

    stopTime = System.currentTimeMillis();

    Log.i("Decryption Ended",extStore + "/5mbtest/"+"decrypted"+filename);
    Log.i("Time Elapsed", ((stopTime - startTime)/1000.0)+"");

    fos.flush();
    fos.close();
    cis.close();
}

2 个答案:

答案 0 :(得分:8)

使代码运行缓慢的一件事是缓冲区的大小:

byte[] d = new byte[8];

如果你想让它快速运行,你应该将它提高几个数量级。鉴于您的文件大小,我建议使用至少1 MB,但现在您可以实际将其设置为几MB,即使在Android上也是如此。尝试将其更改为:

byte[] d = new byte[1024 * 1024];

让我们知道提高速度有多少。

答案 1 :(得分:5)

使用@MikeLaren建议的更大缓冲区,并将FileOutputStream包裹在BufferedOutputStream.解密时,将FileInputStream包裹在BufferedInputStream中。或者两种情况都做到:没有伤害。

不需要英雄缓冲区大小,如兆字节:8k或32k就足够了。