简体   繁体   English

如何在Android中加密和解密pdf/doc文件

[英]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.我是 Android 新手,我正在尝试加密和解密文件,并希望在解密后在 Android 设备中显示。

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.在这里,我从 URL 下载文件并存储在 SD 卡中,我现在不知道如何加密文件然后存储在 SD 卡中,文件大小可能超过 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?在这里,我在 Android 设备中显示文件,但在解密文件后,如何显示它?

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 .您需要使用 SecretKeySpec 库。 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?更多详细信息: 如何在 Android 中使用 AES 从 SD 卡加密文件?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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