提高加密AES安卓的速度

时间:2013-12-24 09:48:49

标签: java android encryption cryptography aes

我为手机上的加密文件开发了一个Android应用程序。通过搜索,我找到了这个主题:How to encrypt file from SD card using AES in Android?

该方法工作正常,但加密文件的速度很慢...... 在这一行:byte [] d = new byte [8];为什么只有8个字节?我们不能设定更高的价值吗?

另外,您知道一种快速加密文件的方法吗?我听说过用于本机代码实现的crypto ++,但是如何在我的应用程序上实现JNI?

谢谢,

编辑:加密功能

public void encrypt (String RSAPrivateKey, String Key, byte[] iv, String zipname, ZipEncryptAsyncTask task) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException
    {
        FileInputStream     fis     = new FileInputStream   (zipname + ".temp");
        FileOutputStream    fos     = new FileOutputStream  (zipname);
        SecretKeySpec       sks     = new SecretKeySpec     (Base64.decode(Key, Base64.DEFAULT), "AES");
        IvParameterSpec     ivspec  = new IvParameterSpec   (iv);
        Cipher              cipher  = Cipher.getInstance    ("AES/CBC/PKCS5Padding");

        fos.write(String.valueOf(RSAPrivateKey.getBytes().length).getBytes());
        fos.write(RSAPrivateKey.getBytes());

        cipher.init(Cipher.ENCRYPT_MODE, sks, ivspec);
        CipherOutputStream cos = new CipherOutputStream(fos, cipher);

        long size = 0;
        byte[] d = new byte[8];
        for(int b; (b = fis.read(d)) != -1; )
        {
            cos.write(d, 0, b);
            task.doProgress((size += 8));
        }

        cos.flush();
        cos.close();
        fis.close();

        new File(zipname + ".temp").delete();
    }

2 个答案:

答案 0 :(得分:1)

作为替代方案,您可以考虑更改正在使用的密码模式。必须逐块串行使用CBC模式。计数器模式(CTR)可以与同时加密的不同块并行运行。当然,并行处理会产生开销,您需要重新编写代码,但如果缓冲区大小调整没有给您足够的速度增益,那么它可能是下一个尝试的选项。

答案 1 :(得分:0)

正如@CodesInChaos所说,一种方法是增加缓冲区的大小。 现在我做一个基准测试,确定缓冲区的最佳大小,并使用最佳值。