我一直在遵循教程"如何使用DES加密和解密文件?“添加一个简单的文件加密到一个现有的安卓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();
}
非常简单和基本,但是对一个1MB文件进行解码/加密需要20到30秒的时间。详细地说,是复制两个流之间字节的时间循环,速度太慢了。
将byte[]的大小更改为更大的值,如65536,以便同时读取更多的字节并不会改变任何事情。,我认为一次读取更多的字节会加快进程,但事实并非如此。
在没有加密的“普通”流之间复制数据并不需要那么长时间。这么贵的密码真的很贵吗?我在其他平台上也使用过类似的加密,这样的延迟从来都不是问题。
本教程使用DES,但将算法更改为不同的方法,例如AES也不会改变任何东西。
有什么办法让我加快速度吗?
发布于 2014-09-01 20:57:55
我在运行Android4.4.4的Google 5上运行了一些实验,基本上使用您的代码并加密一个1000000字节(100万字节)的文件,从/sdcard文件系统中读取和写入文件。
no crypt 1421 ms
AES ECB mode 2577 ms
DES ECB 3214
接下来,我稍微修改了代码,以使用BufferedInputStream和BufferedOutputStream。
no crypt 88 ms
AES ECB mode 855 ms
DES ECB mode 1419 MS
这表明时间对缓冲是敏感的,AES比DES更快。
提供程序名为“AndroidOpenSSL”
发布于 2014-09-01 21:44:47
您可能会遇到一些进程阻塞输入文件的问题。若要测试是否存在此问题,请计算应读取的文件的最后一部分和要读取的完整缓冲区的数量。用for循环替换while,如果文件大小/缓冲区大小有余数,则添加额外的读和写。
https://stackoverflow.com/questions/25607270
复制相似问题