加密持续时间过长的android

时间:2015-07-17 09:56:22

标签: android encryption aes

我已经加密并解密了20 MB的文件

public boolean decryptFile() {

    long millis=Calendar.getInstance().getTimeInMillis();
    try{
        String path=Environment.getExternalStorageDirectory().getAbsolutePath();

    InputStream fis = new FileInputStream(path+"/Download/circus.pbf");
    File outfile = new File(path+"/Download/circus.zip");
    int read = 0;
    if (!outfile.exists())
        outfile.createNewFile();

    FileOutputStream fos = new FileOutputStream(outfile);

    IvParameterSpec ive = new IvParameterSpec(key2.getBytes("UTF-8"));

    SecretKeySpec skeySpec = new SecretKeySpec(key1.getBytes("UTF-8"),
            "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ive);
    CipherInputStream cis = new CipherInputStream(fis, cipher);
    int b;
    byte[] d = new byte[8];
    while ((b = cis.read(d)) != -1) {
        fos.write(d, 0, b);
    }
    fos.flush();
    fos.close();
    cis.close();
        Log.e("Decryption:", (Calendar.getInstance().getTimeInMillis() - millis) / (1000 + 0.0) + " sec");
        return true;

}
    catch(IOException ex){
        ex.printStackTrace();
    }
    catch(InvalidAlgorithmParameterException ex){
        ex.printStackTrace();
    }
    catch(NoSuchPaddingException ex){
        ex.printStackTrace();
    }
    catch(InvalidKeyException ex){
        ex.printStackTrace();
    }
    catch(NoSuchAlgorithmException ex){
        ex.printStackTrace();
    }
    return false;
}


public boolean encryptFile()  {
    long millis= Calendar.getInstance().getTimeInMillis();

    // Here you read the cleartext.
    try {

        String path=Environment.getExternalStorageDirectory().getAbsolutePath();
        InputStream fis = new FileInputStream(path+"/Download/circus.zip");

        /*File folder=new File(dir);
        folder.mkdir();*/

        File outfile = new File(path+"/Download/circus.pbf");
        int read = 0;
        if (!outfile.exists())
            outfile.createNewFile();

        FileOutputStream encfos = new FileOutputStream(outfile);


        IvParameterSpec ive = new IvParameterSpec(key2.getBytes("UTF-8"));

        SecretKeySpec skeySpec = new SecretKeySpec(key1.getBytes("UTF-8"),
                "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, ive);

        // Wrap the output stream
        CipherOutputStream cos = new CipherOutputStream(encfos, cipher);
        // Write bytes
        int b;
        byte[] d = new byte[8];
        while ((b = fis.read(d)) != -1) {
            cos.write(d, 0, b);
        }

        cos.flush();
        cos.close();
        fis.close();
        Log.e("Encryption:",(Calendar.getInstance().getTimeInMillis()-millis)/(1000+0.0)+" sec");
        return true;
    }
    catch(IOException ex){
        ex.printStackTrace();
    }
    catch(InvalidAlgorithmParameterException ex){
        ex.printStackTrace();
    }
    catch(NoSuchPaddingException ex){
        ex.printStackTrace();
    }
    catch(InvalidKeyException ex){
        ex.printStackTrace();
    }
    catch(NoSuchAlgorithmException ex){
        ex.printStackTrace();
    }
    return false;
}

我有325秒的解密时间。它太长了。如何在所有文件上使用解密,而在部分选定的字节上使用解密

E/Decryption:﹕ 325.862 sec

请推荐一些其他加密方法或部分加密

2 个答案:

答案 0 :(得分:3)

你有没有理由使用这么小的字节缓冲区?

  

byte [] d =新字节[8];

我建议您使用数组大小​​,例如

byte[] d = new byte[16 * 1024];

byte[] d = new byte[1024 * 1024];

这应该可以提高性能。

答案 1 :(得分:1)

数据必须加密有多安全?如果您真的想要一个巨大的性能提升,您可以使用ECB模式而不是CBC进行加密,但请注意,这将不太安全,因为具有完全相同字节的两个块将作为完全相同的加密块输出,因为相同的密钥是使用

ECB和CBC之间的主要区别在于ECB使用相同的密钥加密每个块,因此可以加密并行中的所有块,其中CBC要求前一个块的结果作为加密算法的输入。

根据您的要求:

  

如何在所有文件上使用解密,但部分在某些选定的字节上使用?

我想指出,这将允许潜在的黑客检索明文信息,而明文信息又可用于从加密块中推断信息。他们可以更轻松地猜测'下一个单词序列。并将其与加密值进行比较。你最好使用ECB。性能提升甚至可能允许增加密钥大小(您当前的密钥大小从问题中不明确)。