[英]How to encrypt & decrypt using Camellia 128bit in Android JAVA code?
[英]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.