簡體   English   中英

如果用用戶密碼和所有者密碼加密,如何用用戶密碼解密Java中的128bit RC4 pdf文件

[英]How to decrypt 128bit RC4 pdf file in java with user password if it is encrypted with user as well as owner password

我有一個用所有者和用戶密碼鎖定的PDF文件。 我沒有所有者密碼,但有用戶密碼。

我正在使用iText解密文件

那么我該如何解密PDF文件。

public class Decrypt {

  public static final String SRC = "D:\\GitCodeBase(Master)\\pdf\\src\\main\\resources\\encrypt\\abc.pdf";
  public static final String DEST = "D:\\GitCodeBase(Master)\\pdf\\src\\main\\resources\\decrypt\\def.pdf";

  public static void main(String[] args) throws Exception {
      PdfReader.unethicalreading = true;
      PdfReader reader = new PdfReader(SRC,"abc123".getBytes());
      PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(DEST));
      stamper.close();
      reader.close();
  }
}

不幸的是,使用您的代碼和示例文件,我無法重現該問題:代碼執行時不會引發異常。

但是它也沒有執行您想要的操作:結果文件仍被加密。 因此,這里有一些信息。


如果您從頭到尾都閱讀Bruno的答案 ,您會發現您的代碼用於在iText 5.3.5之前解密PDF文件。 同時,盡管如此,加密仍然保留。 嚴格來說,這確實是更正確的,畢竟所有代碼都沒有要求iText放棄加密。

因此,在當前的iText 5版本(我使用的是當前的5.5.12-SNAPSHOT維護版本)中,您需要做更多的工作, 您必須愚弄iText認為PDF沒有像Bruno所說的那樣被加密 。他的答案。

不幸的是,您必須更改的PdfReader成員變量不是public 因此,您不能簡單地設置它。

有關成員protected 因此,您可以通過派生自己的PdfReader子類並使用其中的方法進行更改來進行更改。 布魯諾的答案對此進行了證明,這里是非空用戶密碼的一種變體:

class MyReader extends PdfReader {
    public MyReader(final String filename, final byte password[]) throws IOException {
        super(filename, password);
    }
    public void decryptOnPurpose() {
        encrypted = false;
    }
}

public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    MyReader.unethicalreading = true;
    MyReader reader = new MyReader(src, "abc123".getBytes());
    reader.decryptOnPurpose();
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    stamper.close();
    reader.close();
}

另外,您也可以使用反射:

PdfReader.unethicalreading = true;
PdfReader reader = new PdfReader(inputStream, "abc123".getBytes());

Field encryptedField = PdfReader.class.getDeclaredField("encrypted");
encryptedField.setAccessible(true);
encryptedField.set(reader, false);

PdfStamper stamper = new PdfStamper(reader, outputStream);
stamper.close();
reader.close();

DecryptUserOnly.java測試方法testDecryptAbc


PS:我知道這個答案幾乎不會增加Bruno的原始答案 我之所以沒有將這個問題標記為該答案的重復項,僅僅是因為它已被“關閉為題外話”,並且與此同時,該答案中的許多鏈接都已過時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM