【问题标题】:Android File Decryption and Encryption taking timeAndroid文件解密和加密需要时间
【发布时间】:2014-07-04 07:52:01
【问题描述】:

文件下载时我已经在android中完成了加密和解密 但我想提高文件解密时的时间性能。 我的问题是当我下载任何文件时,所以我在那里添加了加密,但在这个阶段我正在显示进度加载器,所以它看起来不错,但是当文件完全下载并尝试打开该文件时,这次它会解密该文件花费太多时间。 这看起来很糟糕。如何减少解密时间?这是我的代码

加密代码

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;
}

【问题讨论】:

标签: java android encryption


【解决方案1】:

建议:

1) 将解密移至另一个异步任务并添加另一个进度指示器。

2) 保留最后,比如说,10% 的进度指示器用于解密。这实际上是我曾经做过的,但我是在做完整性检查(针对 MD5 哈希 IIRC),而不是解密。

3) 将解密移至下载异步任务,立即解密每个接收到的数据部分,从而将解密时间隐藏在下载时间之后。

4) 不确定这会更快,但您可能有两个服务线程:一个下载文件,另一个解密文件。最好不要在这里使用 AsyncTask,因为它们在不同版本的 Android 上可能表现不同(包括在单个线程上顺序执行,讨论见Is AsyncTask really conceptually flawed or am I just missing something?,以及我的注释​​https://stackoverflow.com/a/14602486/755804)

还要注意,负责下载和解密的线程属于 Model(在 MVC 意义上),并且不能由作为 Controller 的 Activity 所有 不能超过屏幕转:https://stackoverflow.com/a/14603375/755804

如果您的下载需要很长时间,您可能有兴趣恢复中断的下载,最好从一开始就考虑它。修改简单的解决方案总是更容易,而多线程解决方案则相当复杂。如果您传输多个文件,其中一个可能会在传输过程中损坏,您可能需要一个选项来仅重新传输损坏的文件。您可能还需要完整性检查。

【讨论】:

    【解决方案2】:

    确保将数据缓冲区与加密的块大小对齐。

    示例见:https://stackoverflow.com/a/33171612/475496

    使用这种方法大大加快了我们的加密速度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      相关资源
      最近更新 更多