adobe reader如何在不知道密码的情况下获取内容

Posted

技术标签:

【中文标题】adobe reader如何在不知道密码的情况下获取内容【英文标题】:How do adobe reader get the content without knowing the password 【发布时间】:2013-12-13 07:38:21 【问题描述】:

最近,我从朋友那里得到了一个 PDF 文件,我用我的 Adob​​e Reader X 打开它,我在标题栏上看到了一个安全的注释。我找到这个文件的属性,它说这个文件的安全方法是“密码安全”,PDF版本是1.7 8级。我不能在不知道这个文件密码的情况下编辑它。

由于阅读器 X 在没有询问我密码的情况下打开文件,内容不应该被加密,阅读器 X 只是遵循一个协议,它告诉它不允许人们编辑文件。所以如果有人写了一个不遵循协议的程序,密码就没有用了。然后我对这个问题感到困惑,是否可以编写那个程序?如果不是,我一定是错的,pdf的内容必须加密。

但另一个问题是:Adobe Reader 是如何在不知道密码的情况下获取内容的?

非常感谢。

PS:我找到了一些 PDF 密码删除程序,并在这个 PDF 文件上尝试了它们,它们都不起作用,这就是我将文件格式的版本放在问题中的原因。另外,我只能用 Adob​​e Reader X 及更高版本打开这个文件。所以我认为 Adob​​e 已经改变了加密算法。

【问题讨论】:

很难谈论您拥有但未提供的特定文件。话虽如此,这听起来像是使用默认密码作为用户密码的普通 PDF 安全性。也许它只是使用了一种加密算法,这种加密算法最近才被引入到带有 Adob​​e 扩展的 PDF 中,因此你发现的密码删除程序还不知道。 密码用于加密文件中的每个对象,因此 Adob​​e 无法在没有密码的情况下打开它。所以它必须是默认值。请记住,有 2 个密码(用户和所有者)。 【参考方案1】:

正如您正确指出的那样,该文档没有得到有效加密 - 它是一种 DRM,即使用已知密钥对其进行混淆/加密,他们希望每个能够读取它的软件都会应用这些限制。 (可能会在软件中应用大量律师。)

也就是说,iTextPDF 库 (download here) 有一个名为 unethicalreadingpublic static boolean 和 the documentation 声明“如果您决定更改此静态参数的值,iText 开发人员概不负责。”

我不确定 iTextPDF 是否支持 PDF 1.7(这就是您的密码删除程序不起作用的原因 - 它们只支持旧格式),但如果支持,以下软件将解析未受保护的 PDF 文件或你提供一个密码,然后写一个新的。如果您决定更改main()方法的第一行中某个参数的某个赋值,我概不负责...

import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;


public class PDFOpener 

    /**
     * @param args
     * @throws IOException 
     * @throws DocumentException 
     */
    public static void main(String[] args) throws IOException, DocumentException 
        PdfReader.unethicalreading = false;

        if (args.length == 0 || args.length > 3 || !args[0].endsWith(".pdf"))  
            usage();
        

        String infile = args[0];
        String outfile = args.length >= 2 ?
                args[1] : infile.substring(0, infile.length()-4) + ".open.pdf";

        System.err.println("Reading: " +infile);
        System.err.println("Writing: " +outfile);
        PdfReader reader = null;
        if (args.length == 3) 
            reader = new PdfReader(args[0], args[2].getBytes(Charset.forName("UTF-8")));
         else 
            reader = new PdfReader(args[0]);
        

        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outfile));
        stamper.close();
    

    private static void usage() 
        System.err.println("Usage: pdfopener infile.pdf [outfile.pdf] [password]");
        System.exit(1);
    


您需要同时下载 iText 和“额外的 jars”,并将它们放在类路径中的某个位置。

【讨论】:

我发现了这个 ISO 32000-2 标准,这可能是它的原因。 iso.org/iso/catalogue_detail.htm?csnumber=63534

以上是关于adobe reader如何在不知道密码的情况下获取内容的主要内容,如果未能解决你的问题,请参考以下文章

用adobe reader 打开一个pdf文档,点击了文档里链接到本文档的链接,如何回到上一个位置

如何永久更改 Adob​​e Acrobat Reader DC 中的荧光笔颜色?

如何在不知道 C 中的旧密码的情况下设置用户帐户密码?

如何在不使用其 Streaming 服务器的情况下实施 Adob​​e HTTP Streaming 规范

如何将 DLL 注入 Adob​​e Reader X

如何在保存 PDF 表单时阻止 Adob​​e Reader 询问“另存为”(即只允许“保存”)?