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”

上一篇:Thrift教程初级篇——thrift安装环境变量配置第一个实例


下一篇:Jquery $.getJSON()设置同步