首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将字节从FileInputStream复制到CipherOutputStream (反之亦然)非常慢

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

Stack Overflow用户
提问于 2014-09-01 13:49:00
回答 2查看 940关注 0票数 3

我一直在遵循教程"如何使用DES加密和解密文件?“添加一个简单的文件加密到一个现有的安卓4+应用程序。

一切都很好,除了加密和解密非常非常慢。

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

代码语言:javascript
运行
复制
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();
}

非常简单和基本,但是对一个1MB文件进行解码/加密需要20到30秒的时间。详细地说,是复制两个流之间字节的时间循环,速度太慢了。

将byte[]的大小更改为更大的值,如65536,以便同时读取更多的字节并不会改变任何事情。,我认为一次读取更多的字节会加快进程,但事实并非如此。

在没有加密的“普通”流之间复制数据并不需要那么长时间。这么贵的密码真的很贵吗?我在其他平台上也使用过类似的加密,这样的延迟从来都不是问题。

本教程使用DES,但将算法更改为不同的方法,例如AES也不会改变任何东西。

有什么办法让我加快速度吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-01 20:57:55

我在运行Android4.4.4的Google 5上运行了一些实验,基本上使用您的代码并加密一个1000000字节(100万字节)的文件,从/sdcard文件系统中读取和写入文件。

代码语言:javascript
运行
复制
no crypt 1421 ms
AES ECB mode 2577 ms
DES ECB 3214

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

代码语言:javascript
运行
复制
no crypt 88 ms
AES ECB mode 855 ms
DES ECB mode 1419 MS

这表明时间对缓冲是敏感的,AES比DES更快。

提供程序名为“AndroidOpenSSL”

票数 3
EN

Stack Overflow用户

发布于 2014-09-01 21:44:47

您可能会遇到一些进程阻塞输入文件的问题。若要测试是否存在此问题,请计算应读取的文件的最后一部分和要读取的完整缓冲区的数量。用for循环替换while,如果文件大小/缓冲区大小有余数,则添加额外的读和写。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25607270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档