2016-02-08 2 views
0

Я пытаюсь применить метод перебора грубой силы, чтобы найти пароль в файлах PDF. Я использую этот метод для проверки пароля с помощью itextsharpПроверьте пароль в PDF-файле без открытия

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

Он работает. Но очень долгое время, когда размер файла PDF большой. Есть ли способ проверить пароль без загрузки файла в память ?.

+1

Попробуйте [этот перегруженный конструктор] (http://api.itextpdf.com/itext/com/itextpdf/text/pdf/PdfReader.html#PdfReader%28com.itextpdf.text.pdf.RandomAccessFileOrArray,%20byte [] ,% 20boolean% 29). – kuujinbo

+0

@kuujinbo Это очень полезно. но по-прежнему имеют некоторое время между небольшим и большим файлом. –

ответ

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? фактически вводит в заблуждение. Если бы память была на самом деле узким местом, у вас были бы гораздо большие проблемы. Я просто сделал быстрый тест, используя System.IO.File.ReadAllBytes() в 80-мегабайтном файле, и потребовалось около 90 миллисекунд, чтобы загрузить все в память, а моему компьютеру семь лет.

Реальная проблема скорости заключается в том, что iText должен найти trailer PDF, который имеет указатель на словарь /Encrypt. Поскольку iText предназначен для использования на самом деле do что-то с PDF-файлом, он не тратит много времени на оптимизацию этого пути, потому что это произойдет в конечном итоге, несмотря ни на что. Если вы действительно, действительно заботитесь о скорости, я начну. Я бы рекомендовал проверить Adobe's spec, чтобы увидеть, как работает стандартное шифрование PDF, это относительно просто. Также есть great simplified description here.

Если ваша цель трещит вы должны быть в состоянии написать очень сырой пароль Guesser, который выглядит для трейлера, ищет и найти ключ /Encrypt и обрабатывать /O и /U ключей. В этом есть много «gotchas», если вы не читали спецификацию, например, документы могут содержать несколько записей trailer, есть альтернативы паролям и т. Д., Но это, вероятно, должно получить вам 99% общих PDF-файлов.

Смежные вопросы