Определить, защищен ли файл rar паролем

Я хотел бы иметь возможность определить, является ли начальная часть (в идеале первый МБ или около того) файла защищенным паролем rar-файлом. Мне не просто нужно знать, является ли это файлом rar, мне нужно убедиться, что файл защищен паролем.

Это возможно? Я знаю, что формат rar является проприетарным форматом, но возможно ли это?

Изменить: я хотел бы сделать это, изучив содержимое файла с помощью javascript или perl. У него не должно быть доступа к rar-библиотеке.

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


person GoldenNewby    schedule 26.02.2012    source источник
comment
Половина ответа: libmagic 5.08 не помогает различать защищенные паролем архивы, возможно, сообщить об ошибке? Заголовок RAR задокументирован по адресу kthoom.googlecode.com/hg/docs/unrar.html, удачного взлома   -  person daxim    schedule 27.02.2012
comment
Спасибо, что откопали для меня документацию!   -  person GoldenNewby    schedule 27.02.2012


Ответы (2)


Мои эксперименты дали мне следующую подпрограмму:

sub is_rarfile_protected {
   my ($rar_filename) = @_;
   open my $rar_fh, '<', $rar_filename or die $!, "\n";
   sysread $rar_fh, my $mark, 25;
   return ord (substr $mark, -1) & 0b100; 
}

... который работает для меня до сих пор.

К сожалению, у меня не установлен Rar, поэтому я не могу проверить, будет ли он работать со всеми зашифрованными паролем rar-файлами (включая многотомные и т. д.) или нет.

person raina77ow    schedule 27.02.2012
comment
Я проверил его примерно на 5 различных файлах rar, и он дал противоречивые результаты. - person GoldenNewby; 27.02.2012
comment
Можете ли вы рассказать немного больше о результатах? - person raina77ow; 27.02.2012
comment
2 файла, которые я зашифровал (с включенным шифрованием списка файлов), возвращают 0, один возвращает 4. Кажется, он постоянно возвращает 4 для файлов с шифрованием (но шифрование списка отключено). - person GoldenNewby; 27.02.2012
comment
Арх. Возможно ли, чтобы вы предоставили общий доступ к файлу с включенным шифрованием списка файлов? - person raina77ow; 27.02.2012
comment
Знаешь, я думаю, у меня все получилось. Ваш метод работает безупречно, если сами файлы зашифрованы, и чуть меньше половины времени, если листинг также зашифрован. Последовательно будет установлен шестнадцатеричный 10-й байт (отличный от нуля), если все зашифровано. - person GoldenNewby; 27.02.2012

Вы всегда можете попробовать это

Для тех, кто не может perlmonks:

Re: Определить, защищен ли файл паролем

Рубасов:

Если вы не хотите реализовывать специфический тест формата файла для каждого из ваших расширений, вы можете заглянуть в случайность ваших данных. Любая хорошо разработанная схема шифрования приведет к случайным зашифрованным данным (чтобы противостоять статистическому анализу). Но если шифрование плохо спроектировано, это вам не сильно поможет.

Имейте в виду, что у этого подхода есть серьезные оговорки: если ваши данные могут быть реальными/псевдослучайными или сжатыми данными, то они также будут выглядеть как куча случайных битов, так что, например, вы не сможете отличить простой файл от зашифрованный файл rar/zip. (И не забывайте, что простые на вид форматы документов могут использовать внутреннее сжатие.)

Для конкретной реализации найдите тест хи-квадрат на CPAN (я не смотрел, но я почти уверен, что вы найдете какую-то реализацию) и попробуйте поэкспериментировать с ним, может ли он быть достаточно хорош для вашей цели.

person Blackle Mori    schedule 26.02.2012
comment
Поскольку RAR действительно является сжатым форматом, этот подход обречен на провал. - person daxim; 27.02.2012