检查pdf文件上的密码而不打开

时间:2016-02-08 04:42:59

标签: c# itextsharp

我正在尝试使用暴力攻击方法在pdf文件上查找密码。我使用此方法使用 itextsharp

检查密码
public static bool IsPasswordValid(string pdfFullname, byte[] password) {
    try {
        PdfReader pdfReader = new PdfReader(pdfFullname, password);
        return true;
    } catch (BadPasswordException) {
        return false;
    }
}

有效。但是当PDF文件很大时需要很长时间。有没有办法检查密码而不将文件加载到内存?。

1 个答案:

答案 0 :(得分:2)

有几件事。

首先,在我的blog post here中,我发现使用构造函数重载使RandomAccessFileOrArray最快。我刚刚使用源代码测试(5.5.6.0),它仍然是基于字符串的路径方法(对于大文件)的两倍。但是,该构造函数重载标记为obsolete,实际上可能实际上会在更新版本中删除,因此您需要处理/使用它。

PdfReader pdfReader = new PdfReader(new RandomAccessFileOrArray(pdfFullname, true), password);

非常清楚,由于某种原因,特别删除了重载,因此您可能需要考虑不使用它。

其次,问题Is there a way check password without loading file to memory?实际上是误导性的。如果内存实际上是瓶颈,那么你会遇到更大的问题。我刚刚在80MB文件上使用System.IO.File.ReadAllBytes()进行了快速测试,将所有内容加载到内存中大约需要90毫秒,而我的计算机已有七年了。

实际的速度问题是iText需要找到PDF的trailer,它有一个指向/Encrypt字典的指针。因为iText旨在用于实际某些事情,所以它不会花费大量时间来优化这条路径,因为无论如何它最终都必须发生。如果你真的非常关心速度,这就是我要开始的地方。我建议您查看Adobe's spec以查看标准PDF加密的工作原理,它相对简单。还有great simplified description here

如果您的目标是破解,您应该能够编写一个非常粗略的密码猜测器来查找预告片,查找并找到/Encrypt密钥并处理/O/U键。如果您没有阅读规范,那么这里有很多“陷阱”,例如文档可以有多个trailer条目,还有密码的替代品等等,但这应该可以让你获得99%的常见PDF文件