加密持续时间过长 android

encryption lasts too long android

我已经按照以下方式加密和解密了 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

请推荐其他加密方式或部分加密

您使用如此小的字节缓冲区是否有原因?

byte[] d = new byte[8];

我建议您尝试调整数组大小,例如

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

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

这应该会提高性能。

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

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

对于您的要求:

How can I use decrypting not on all file but partially on some selected bytes?

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