当前位置: 首页 > 知识库问答 >
问题:

如何用用户口令解密java中的128bit RC4 pdf文件如果同时使用用户口令和所有者口令进行加密

袁华清
2023-03-14

我有一个PDF文件锁定了所有者和用户密码。我没有所有者密码,但我有用户密码。

我正在使用iText解密文件

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();
  }
}

共有1个答案

吴修洁
2023-03-14

不幸的是,您必须更改的pdfreader的成员变量不是public。因此,您不能简单地设置它。

有问题的成员是受保护的。因此,您可以通过派生您自己的PDFReader子类来更改它,并在其中使用一个方法来进行更改。这一点在Bruno的回答中已经得到了证明,这里是针对非空用户密码的变体:

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();

附注:我知道这个答案对布鲁诺原来的答案几乎没有什么补充。我并没有试图把这个问题标记为那个答案的问题的重复,只是因为这个问题已经“离题”,而且那个答案中的许多链接也已经过时了。

 类似资料:
  • 我需要使用以下命令在JAVA中解密在UNIX中加密的文件: 我必须用java解密,就像在UNIX中一样 有人能给我一个java代码来做这个吗?

  • 问题内容: 我需要使用以下命令在JAVA中解密在UNIX中加密的文件: 我必须像在UNIX中一样在Java中解密 有人可以给我一个Java代码来执行此操作吗? 问题答案: OpenSSL通常使用自己的基于密码的密钥派生方法,该方法在中指定EVP_BytesToKey,请参见下面的代码。此外,它会在多行中隐式地将密文编码为base 64,以便在邮件正文中发送密文。 因此,结果是伪代码: 因此解密为:

  • 我在网上的某个地方发现这样一句话:“解释器是一个程序,它使用编程语言的基本指令集作为其机器语言来实现或模拟虚拟机。”在上述引用的上下文中,有人能解释一下解释器是如何实际完成高级指令的执行的吗?网上的教程只涉及抽象的方式,即一次只需要一行代码就可以执行。它是使用机器指令库还是如何使用?我很想知道这件事。

  • 本文向大家介绍如何在Linux上使用gpg命令加密和解密文件,包括了如何在Linux上使用gpg命令加密和解密文件的使用技巧和注意事项,需要的朋友参考一下 有很多选择可以保护您的数据。但是,GPG的另一个优势是可以优先加密您的数据并通过Internet安全地传输它们。本文介绍有关–如何在Linux上使用GPG命令加密和解密文件。 要获取有关GPG的更多信息,请使用以下命令– 样本输出应如下所示–

  • 我正在尝试从RESTAPI获取数据,他们还没有完全实现OAuth。他们只使用OAuth在您已经拥有访问令牌后使用的签名方法。我已获得消费者密钥 你能建议怎么做吗?

  • 当我加密一个提供用户和所有者密码的PDF文档时,我可以使用这两个密码中的任何一个打开文档。 文件是否在内部复制,并且每一份都用密码加密?从加密文档文件的大小看,文件中有两个加密文档并不明显。 PD:我知道PDF中用户和所有者密码之间的“用户体验”差异。