我已經以下教程「How do I encrypt and decrypt files using DES?」爲一種簡單的文件加密添加到現有的Android 4+應用程序。複製字節CipherOutputStream(或反之亦然)非常慢
一切工作正常,除了加密和解密是非常,非常緩慢。
以下兩種方法都非常完整教程:
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();
}
相當簡單和基本的,但它需要約20-30秒,DE /加密1 MB的文件。詳細地說,它是在兩個流之間複製字節的while循環非常慢。
字節[]的大小更改爲65536像一個更大的價值,同時讀取多個字節不會改變任何東西。我認爲一次讀更多的字節會加快這個過程,但事實並非如此。
在沒有加密的「普通」流之間複製數據並不需要很長時間。這真的是加密這是昂貴的?我在其他平臺上使用過類似的加密技術,這種延遲從來都不是問題。
本教程使用DES,但將算法更改爲不同的內容,例如AES也不會改變任何東西。
任何想法,我可以加快這一點?
如果你刪除加密並只使用'doCopy(is,os)''會發生什麼? – CodesInChaos 2014-09-01 14:23:39
如果我使用doCopy(is,os)''is'是一個簡單的(無密碼)'FileInputStream'和'os'簡單的(無密碼)'FileOutputStream',我當前測試文件的完整副本大約需要150ms 。如果包含CipherStream,則使用相同文件的操作最多需要15000ms。因此,顯然延遲是由CipherStream引起的。但爲什麼?加密/解密需要時間,但這很多? – 2014-09-01 14:57:18
即使在移動CPU上,正確的加密實現應該至少比此快100倍。 – CodesInChaos 2014-09-01 15:00:14