我一直在遵循教程“ 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
接下来,我稍微修改了您的代码以使用BufferedInputStream和BufferedOutputStream
no crypt 88 ms
AES ECB mode 855 ms
DES ECB mode 1419 MS
这表明时序对缓冲很敏感,并且AES比DES快.
提供程序名称为“ AndroidOpenSSL”