[英]Android File Decryption and Encryption taking time
下载文件时,我已经在android中完成了加密和解密,但是我想提高文件解密时的时间性能。 我的问题是,当我下载任何文件时,我在那儿添加了加密,但是在此阶段,我正在显示Progress loader,因此看起来不错,但是当文件完全下载并尝试打开该文件时,这次它将对该文件解密花费太多时间。 这看起来很糟糕。 如何减少解密时间? 这是我的代码
加密码
byte data[] = new byte[1024];
String seed = "password";
byte[] rawKey = getRawKey(seed.getBytes());
SecretKeySpec skeySpec = new SecretKeySpec(rawKey, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
output = new CipherOutputStream(output, cipher);
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
publishProgress("" + (int) ((total * 100) / lenghtOfFile));
output.write(data, 0, count);
}
解密代码在这里:
String newPath = sdCardPath + "/" + dPdfName;
File f1 = new File(newPath);
if (!f1.exists())
try {
f1.createNewFile();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
InputStream fis = new FileInputStream(f);
OutputStream fos = new FileOutputStream(f1);
String seed = "password";
byte[] rawKey = getRawKey(seed.getBytes());
SecretKeySpec skeySpec = new SecretKeySpec(rawKey,
"AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
fis = new CipherInputStream(fis, cipher);
int b;
byte[] data = new byte[4096];
while ((b = fis.read(data)) != -1) {
// fos.write(cipher.doFinal(data), 0, b);
fos.write(data, 0, b);
}
fos.flush();
fos.close();
fis.close();
} catch (Exception e) {
// TODO: handle exceptionpri
e.printStackTrace();
}
获取行键方法:
private static byte[] getRawKey(byte[] seed) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(seed);
kgen.init(128, sr);
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
return raw;
}
意见建议:
1)将解密移至另一个asynctask并添加另一个进度指示器。
2)将最后进度指示器的10%保留给解密。 这实际上是我曾经做过的事情,但是我正在进行完整性检查(针对MD5哈希IIRC),而不是解密。
3)将解密移至下载异步任务,立即解密每个接收到的数据部分,并将解密时间隐藏在下载时间之后。
4)不确定这样做会更快,但是您可能有两个服务线程:一个正在下载文件,另一个正在解密文件。 最好不要在此处使用AsyncTask,因为它们在不同版本的Android上的行为可能有所不同(包括在单个线程上顺序执行,请参见AsyncTask在概念上确实存在缺陷,或者我只是错过了一些内容?)进行讨论,以及我的笔记https:// /stackoverflow.com/a/14602486/755804 )
还要注意,负责下载和解密的线程属于Model (在MVC意义上),并且不能归Activity所拥有,Activity是无法在屏幕转向之前存活的Controller : https : //stackoverflow.com/a/14603375/755804
如果您的下载时间很长,您可能会对恢复中断的下载感兴趣,因此最好从一开始就考虑一下。 修改简单的解决方案总是很容易,而多线程解决方案则相当复杂。 如果您传输许多文件,则可能会发生其中一个在传输过程中损坏的情况,并且您可能希望选择仅重新传输已损坏的文件。 您可能还需要完整性检查。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.