簡體   English   中英

Android文件解密和加密需要時間

[英]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是無法在屏幕轉向之前存活的Controllerhttps : //stackoverflow.com/a/14603375/755804

如果您的下載時間很長,您可能會對恢復中斷的下載感興趣,因此最好從一開始就考慮一下。 修改簡單的解決方案總是很容易,而多線程解決方案則相當復雜。 如果您傳輸許多文件,則可能會發生其中一個在傳輸過程中損壞的情況,並且您可能希望選擇僅重新傳輸已損壞的文件。 您可能還需要完整性檢查。

確保將數據緩沖區與加密的塊大小對齊。

有關示例,請參見: https : //stackoverflow.com/a/33171612/475496

使用這種方法極大地加快了我們的加密速度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM