我正在尝试使用暴力攻击方法在pdf文件上查找密码。我使用此方法使用 itextsharp
检查密码public static bool IsPasswordValid(string pdfFullname, byte[] password) {
try {
PdfReader pdfReader = new PdfReader(pdfFullname, password);
return true;
} catch (BadPasswordException) {
return false;
}
}
有效。但是当PDF文件很大时需要很长时间。有没有办法检查密码而不将文件加载到内存?。
答案 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文件