Android从CipherInputStream读取文件而不重写文件

时间:2017-08-21 01:27:54

标签: android encryption

是否有人知道如何读取解密文件而不将其重写为原始文件?

下载文件后,文件自动加密。当我想打开文件时,文件将首先被解密,但问题是如何从CipherInputStream读取文件,这样就不需要将文件转换回原文件。

void decrypt(File file1, String nama) throws IOException, NoSuchAlgorithmException,
        NoSuchPaddingException, InvalidKeyException {

    md5 hash = new md5();
    String sapi = hash.md5(nama);

    FileInputStream fis = new FileInputStream(file1+ "/" + sapi);

    FileOutputStream fos = new FileOutputStream(file1 + "/decrypted.json");

    SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(),
            "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, sks);
    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();

}

我可以打开解密文件,但如果我使用上面的代码,它将在加密文件和原始文件之间复制。

1 个答案:

答案 0 :(得分:1)

FileOutputStream fos = new FileOutputStream(file1 + "/decrypted.json"); 

将作为第一个参数传入的File对象写入decrypt方法

decrypt(File file1 ...

这也是您正在阅读的文件对象。 因此,当您执行fos.write(d, 0, b);时,您正在写回该File对象,该对象与您正在读取的对象相同。

所以要么写入不同的文件,要么根本不写任何东西。 新的FileOutputStream方法可以采用文件名而不是文件对象,如所述here相关的摘录状态

  

FileOutputStream(String name,                   boolean append)

     

创建文件输出流以使用指定的文件写入文件   名称。如果第二个参数为true,则将写入字节   文件的结尾而不是开头。一个新的FileDescriptor   创建对象以表示此文件连接。

     

首先,如果有安全管理器,则调用其checkWrite方法   以名字为参数。

     

如果文件存在但是是目录而不是常规文件,那么   不存在但无法创建,或无法打开任何其他   之所以抛出FileNotFoundException。

所以也许你想要FileOutputStream fos = new FileOutputStream("/decrypted.json", true|false)

将第二个参数设置为true或false,具体取决于您是否要将文件追加或覆盖?

为您的问题提供一个精确的解决方案有点困难,因为您没有明确说明您想要的结果是什么,所以我做了一些可能错误的假设,但无论哪种方式,上述方法都可以帮助您找到所需的解决方案