android-将字节从FileInputStream复制到CipherOutputStream(反之亦然)非常慢

我一直在遵循教程“ How do I encrypt and decrypt files using DES?”向现有的Android 4应用添加简单的文件加密.

一切工作正常,除了加密和解密非常非常慢.

以下两种方法几乎是完整的教程:

public static void encryptOrDecrypt(String key, int mode, InputStream is, OutputStream os) throws Throwable {
    DESKeySpec dks = new DESKeySpec(key.getBytes());
    SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
    SecretKey desKey = skf.generateSecret(dks);
    Cipher cipher = Cipher.getInstance("DES"); // DES/ECB/PKCS5Padding for SunJCE

    if (mode == Cipher.ENCRYPT_MODE) {
        cipher.init(Cipher.ENCRYPT_MODE, desKey);
        CipherInputStream cis = new CipherInputStream(is, cipher);
        docopy(cis, os);
    } else if (mode == Cipher.DECRYPT_MODE) {
        cipher.init(Cipher.DECRYPT_MODE, desKey);
        CipherOutputStream cos = new CipherOutputStream(os, cipher);
        docopy(is, cos);
    }
}

public static void docopy(InputStream is, OutputStream os) throws IOException {
    byte[] bytes = new byte[64];
    int numBytes;

    // Why is this taking so long?
    while ((numBytes = is.read(bytes)) != -1) {
        os.write(bytes, 0, numBytes);
    }

    os.flush();
    os.close();
    is.close();
}

非常简单和基本,但是解密/加密1 MB文件大约需要20-30秒.详细地说,是while循环在两个流之间复制字节,这太慢了.

将byte []的大小更改为较大的值(如65536)以一次读取更多字节不会改变任何内容.我认为一次读取更多字节将加快处理速度,但事实并非如此.

在没有加密的情况下在“正常”流之间复制数据不会花费很长时间.真的是这种昂贵的加密吗?我已经在其他平台上使用了类似的加密,而这样的延迟从来都不是问题.

本教程使用DES,但将算法更改为其他内容,例如AES也不更改任何内容.

有什么想法可以加快速度吗?

解决方法:

我基本上在运行Android 4.4.4的Google LG Nexus 5上进行了一些实验,使用您的代码并加密了一个1000000(百万)字节的文件,并读取了/ sdcard文件系统的内容.

no crypt 1421 ms
AES ECB mode 2577 ms
DES ECB 3214

接下来,我稍微修改了您的代码以使用BufferedInputStreamBufferedOutputStream

no crypt 88 ms
AES ECB mode 855 ms
DES ECB mode 1419 MS

这表明时序对缓冲很敏感,并且AES比DES快.

提供程序名称为“ AndroidOpenSSL”

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...