简体   繁体   中英

How to encrypt and decrypt a pdf/doc file in Android

I am new to Android, and I am trying to encrypt and decrypt a file and want to display in Android device after decrypt.

Here I am downloading the file from the URL and storing in SD card and I don't now how to encrypt the file and then store in SD card and file size may be more then 20MB.

Code:

File downloadFile(String dwnload_file_path) {
    File file = null;
    try {
        String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
        File folder = new File(extStorageDirectory, "SampleFolder");
        folder.mkdir();

        file = new File(folder, dest_file_path);

        try{
            file.createNewFile();
        }catch (IOException e){
            e.printStackTrace();
        }
      
        URL url = new URL(dwnload_file_path);
        HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
        urlConnection.connect();

        InputStream inputStream = urlConnection.getInputStream();
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        int totalSize = urlConnection.getContentLength();

        byte[] buffer = new byte[MEGABYTE];
        int bufferLength = 0;
        while((bufferLength = inputStream.read(buffer))>0 ){
            fileOutputStream.write(buffer, 0, bufferLength);
        }
        fileOutputStream.close();
        //ToastManager.toast(this, "Download Complete. Open PDF Application installed in the device.");
    } catch (final MalformedURLException e) {
        //ToastManager.toast(this, "Some error occured. Press try again.");
    } catch (final IOException e) {
        //ToastManager.toast(this, "Some error occured. Press try again.");
    } catch (final Exception e) {
        //ToastManager.toast(this, "Failed to download image. Please check your internet connection.");
    }
    return file;
}

Here I am displaying the file in Android device but after decrypting the file, how can I display it?

Code:

File pdfFile = new File(Environment.getExternalStorageDirectory() + "/SampleFolder/" + "Sample."pref.getString(Constants.PrefConstants.PATH_NAME));
            File f = new File(pdfFile.toString());
            if(f.exists()) {
                    Uri path = Uri.fromFile(pdfFile);
                    Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
                    pdfIntent.setDataAndType(path, pref.getString(Constants.PrefConstants.PATH_NAME_APP));
                    //pdfIntent.setFlags(Intent. FLAG_ACTIVITY_CLEAR_TOP);
                    pdfIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                    startActivity(pdfIntent);
                } else {
                    //uiManager.execute(Constants.Commands.REQGET_INSTRUCTIONS_SCREEN,null);
                    ToastManager.toast(getApplicationContext(), "No data available...");
                }

How can I resolve this issue?

You need to use the SecretKeySpec library . Example of encrypt method

static void encrypt() throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {
    // Here you read the cleartext.
    FileInputStream fis = new FileInputStream("SampleFolder/yourfilename");
    // This stream write the encrypted text. This stream will be wrapped by another stream.
    FileOutputStream fos = new FileOutputStream("SampleFolder/yourencryptedfilename");

    // Length is 16 byte
    // Careful when taking user input!!! https://stackoverflow.com/a/3452620/1188357
    SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(), "AES");
    // Create cipher
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, sks);
    // 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();
}

For decrypt method see the link below. More details : How to encrypt file from SD card using AES in Android?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM