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

Apache PDFBox-无法解密PDF

卜和悌
2023-03-14
package com.test;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.encryption.AccessPermission;
import org.apache.pdfbox.pdmodel.encryption.StandardDecryptionMaterial;
import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy;

public class PdfEncDecTest {

    static String pdfPath = "G:\\files\\filed5b3.pdf";
    public final static String PDF_OWNER_PASSWORD = "cd1j";
    public final static String PDF_USER_PASSWORD = "";  

    public static void main(String[] args) throws Exception {

        PDDocument document = PDDocument.load(pdfPath);
        AccessPermission ap = new AccessPermission();
        ap.setCanPrint(true);
        ap.setCanExtractContent(false);
        ap.setCanExtractForAccessibility(false);
        StandardProtectionPolicy spp = new StandardProtectionPolicy(PDF_OWNER_PASSWORD, PDF_USER_PASSWORD, ap);
        document.protect(spp);
        document.save(pdfPath+".pdf");
        document.close();

        PDDocument doc = PDDocument.load(pdfPath+".pdf");
        if(doc.isEncrypted()) {
            StandardDecryptionMaterial sdm = new StandardDecryptionMaterial(PDF_OWNER_PASSWORD);
            doc.openProtection(sdm); // org.apache.pdfbox.exceptions.CryptographyException: Error: The supplied password does not match either the owner or user password in the document.
            doc.decrypt(PDF_OWNER_PASSWORD); // the same like above
        }
        doc.close();
    }

}
Exception in thread "main" org.apache.pdfbox.exceptions.CryptographyException: Error: The supplied password does not match either the owner or user password in the document.
    at org.apache.pdfbox.pdmodel.encryption.StandardSecurityHandler.prepareForDecryption(StandardSecurityHandler.java:265)
    at org.apache.pdfbox.pdmodel.encryption.StandardSecurityHandler.decryptDocument(StandardSecurityHandler.java:156)
    at org.apache.pdfbox.pdmodel.PDDocument.openProtection(PDDocument.java:1595)
    at org.apache.pdfbox.pdmodel.PDDocument.decrypt(PDDocument.java:942)
    at com.test.PdfEncDecTest.main(PdfEncDecTest.java:29)

我已经将示例项目放入GitHub:https://github.com/marioosh-net/pdfbox

共有1个答案

吴唯
2023-03-14

您需要用户密码。

    if (doc.isEncrypted())
    {
        StandardDecryptionMaterial sdm = new StandardDecryptionMaterial(PDF_USER_PASSWORD);
        doc.openProtection(sdm);
        // don't call decrypt() here
    }

即使用户密码不为NULL,也可以执行此操作。用户密码是普通人认为的加密,所有者密码是安全权限的加密。

编辑:对不起,我的答案是错误的,虽然它是有帮助的。您可以使用用户密码(您可能获得受限权限)或所有者密码(您将获得完全权限)打开PDF。可能发生的情况是存在一个与40bit密钥匹配所有者密码的bug(这是默认值)。目前正在调查此错误,请参阅PDFBOX-2456并搜索“MD5”。

 类似资料:
  • 我需要解密用AES加密的传入请求,我尝试使用共享示例但无法找到正确的参数集 加密:AES/CBC/PKCS5添加AES/CBC/PKCS5 初始化向量:长度为16的空字节数组 测试密钥:1234567890123456 纯文本:abcdefghigklmnopqrstuvwxyz0123456789 加密:8Z3dZzqn05FmiuBLowExK0CAbs4TY2GorC2dDPVlsn/tP

  • 6)当我尝试解密消息时,我得到两个“gpg:[不知道]:无效数据包”消息,解密失败:

  • 问题内容: 我正在使用以下代码加密和解密数据。现在,我想从Node JS加密数据,并想从Go lang解密数据。但是我无法使用GO语言实现它。 从头开始,我试图像下面这样解码,但我无法实现。 有人可以帮我解决这个问题吗? 问题答案: 您应该使用而不只是字符串到字节。 操场上的解决方案:https : //play.golang.org/p/qi_6S1J_dZU 与您的js结果相比 测试结果是相同

  • 我面临AES填充问题。我使用的是Alcides Soares FIlho(用C#生成128位字符串)中建议的代码。请注意,我的加密侧码是。。。 另外,我传递给明文的值是“Z4YAZZSQ 001F295E2589AWAN HANS”。加密正在进行。但解密失败了。 解密侧码 我应该能拿回“Z4YAZZSQ 001F295E2589AWAN HANS” 但出现以下错误“填充无效,无法删除”请建议解决方

  • 我正在使用JavaScript和Node.js处理一个消息传递项目。创建用户时,服务器使用node.js库生成RSA键区。私钥使用用户密码加密。在webapp上,当用户A向用户B发送消息时,使用用户B的公钥对数据进行加密。当用户B接收到消息时,使用他们的私钥和密码对消息进行解密。 我的问题是,虽然应用程序似乎可以加密数据,但我无法解密数据。抛出的错误消息实际上是“无法解密数据”,这是没有帮助的。

  • 节点模块: Java类:主要方法现在只是用于测试,稍后将被删除。