Как записать файл на внешнее хранилище?

Я пытался зашифровать и сохранить файл в том же месте во внешнем хранилище с другим именем файла. Но способ, которым я пользовался, кажется неправильным. Пожалуйста, помогите кому-нибудь.

       public static void encrypt(SecretKey secretKey, String filePath, IvParameterSpec iv){
    try {

        String file = "";
        // Here you read the cleartext.
        FileInputStream fis = new FileInputStream(filePath);
        // This stream write the encrypted text. This stream will be wrapped by another stream.
        //String filePath2 = filePath+"enc";

        file = filePath.substring(0,filePath.length()-5)+"enc.jpeg";

        FileOutputStream fos = new FileOutputStream(file);
        Log.i(TAG, "Uri = "+file);

        // Create cipher
        Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        // Wrap the output stream
        CipherOutputStream cos = new CipherOutputStream(fos, cipher);

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

        // Flush and close streams.
        cos.flush();
        cos.close();
        fis.close();

    }catch(IOException e){
        e.printStackTrace();
    }catch (NoSuchAlgorithmException e){
        e.printStackTrace();
    }catch(NoSuchPaddingException e){
        e.printStackTrace();
    }catch(InvalidKeyException e){
        e.printStackTrace();
    }/*catch (InvalidAlgorithmParameterException e){
        e.printStackTrace();
    }*/
}

Файл манифеста, содержащий разрешения как на чтение, так и на запись.

1 ответ

Вы указываете "AES/ECB/NoPadding".

С ЕЦБ нет iv и, следовательно, нет необходимости предоставлять один по вызову encrypt метод. Режим ECB небезопасен, см. Режим ECB, прокрутите вниз до пингвина.

AES представляет собой блочный шифр и, как таковой, он зашифровывает порции размером с блок за раз, поэтому входные данные должны быть кратны размеру блока. Заполнение произошло прозрачно, но вы указали "NoPadding", поэтому размер входного файла, просто кратный размеру блока, для AES составляет 16 байтов. Вместо этого используйте заполнение PKCS#7 (некоторые обозначены как PKCS#5).

Самое простое решение - это использовать библиотеку, которая объединяет все элементы безопасного шифрования, включая получение пароля, случайное iv, заполнение, аутентификацию шифрования. Рассмотрим RNCryptor, он обеспечивает все это плюс управление версиями. См. RNCryptor README и RNCryptor-Spec для получения дополнительной информации.

Другие вопросы по тегам