Openssl 3.0.2.15 на сервере Ubuntu (текущий)
Итак, мой класс криминалистики работал над задачей, которую я использовал для bash, и мы обнаружили странную вещь. Если вы пытаетесь определить действительный пароль с помощью файла словаря, некоторые слова (не являющиеся паролем) приводят к ошибке (например, неверная расшифровка), а затем $? имеет значение 1. Хорошо, это работает с тестовым файлом. Найден правильный пароль и $? == 0. Но когда мы выполнили это с большим файлом словарных слов, произошла аномалия: некоторые слова последовательно (но без какой-либо закономерности, которую я вижу) возвращают 0. Это не пароль, но, тем не менее... Теперь, в командной строке, если я запускаю ту же самую команду, она завершится с ошибкой «плохое расшифрование» и $? == 1, но в скрипте возвращается 0.
Это согласовано, слова (слова) дают один и тот же результат независимо от того, где они находятся в файле словаря, их можно удалить и повторно ввести в файл, но они всегда возвращают 0 вместо 1, как большинство плохих слов. слова делают. Сюда входит фактический пароль, который также дает правильный результат. Правильный пароль правильно расшифровывает файл, но ложные срабатывания создают файл, который все еще зашифрован, хотя на самом деле он не работает. Итак, мой вопрос: есть ли какие-нибудь идеи, почему openssl может не выдавать ошибку неправильного расшифрования, когда пароль на самом деле не работает?
echo "Current Pword is $pword"
$(openssl enc -aes-256-cbc -pbkdf2 -d -in $2 -out $3 -pass pass:$pword)
if [ "$?" -eq 0 ]
then
echo "The password was found to be $pword \n"
echo "$pword\n" >> pwords.out
echo "The file was decrypted as $3\n"
exit 0
fi
это команда в скрипте bash. Как я уже сказал, он отлично работает с примером файла и найдет правильный пароль в большом файле словаря, но любопытно, почему он не всегда считает плохой пароль «плохим».
По запросу: Пароль к файлу «нитрификация». слова, которые генерируют ложные срабатывания (образец): abies, abkar, Bathylimnetic, Cairds, dodecatoic, и этот список можно продолжить.
Некоторые слова, которые дают отрицательные результаты: бешенство, а, нитрификация, ааа, абалиенация, абатон и так далее. Я не вижу закономерности.
Любые комментарии приветствуются.
Сценарий BASH должен определить пароль для файла, если он существует, как указано в openssl. Код работает нормально, но выдает много ложных срабатываний.
Вместо этого иногда кажется, что слово является правильным паролем, даже если это не так.
Я не понимаю комментарий. Команда работает нормально; это упражнение по программированию, а не секретный вопрос. Может быть, уточните, о чем вы спрашиваете: «Вы уверены»? Что-то не так с инструкцией, что вызывает проблемы с результатами?
$(openssl...) создаст подоболочку и передаст результаты (stdout) обратно в командную строку, где указанный вывод будет рассматриваться как команда; в большинстве (если не во всех?) ваших случаях ничего не передается обратно на стандартный вывод (из openssl), поэтому на верхнем уровне нечего выполнять, поэтому вы не получаете никаких предупреждений; попробуйте $(echo hi), и вы должны получить сообщение об ошибке: -bash: hi: command not foundвызов подоболочки не приносит никакой пользы (в данном случае), поэтому вы получите немного лучшую производительность, не вызывая подоболочку, т. е. удалите $( ...) => openssl enc -aes-256-cbc -pbkdf2 -d -in $2 -out $3 -pass pass:$pword; еще лучше, поскольку вас интересует только код возврата, рассмотрите возможность перенаправления всех stdout/stderr на /dev/null (т. е. openssl enc -aes-256-cbc -pbkdf2 -d -in $2 -out $3 -pass pass:$pword >/dev/null 2>&1)
не могли бы вы дополнить вопрос небольшой выборкой плохих слов, которые а) порождают $?=0 и б) порождают $?=1? вы также можете убедиться, что получаете те же результаты $?, когда удаляете оболочку подоболочки ($(....))
@dwhite: Эта ссылка поможет вам ответить на вопрос о command_substitution: en.wikipedia.org/wiki/Command_substitution
Результат один и тот же с подстановкой команд ($()) и без нее.
pass:$pword и pass:"$pword" дают одинаковый результат. Аналогично, подмена команды или нет.
Еще одно примечание: я также попробовал напрямую использовать If для проверки результата следующим образом и получил те же результаты: if openssl enc -aes-256-cbc -pbkdf2 -d -in $2 -out /dev/null -pass "pass: $pword" &> /dev/null;





(0) Это не проблема программирования или разработки и, следовательно, оффтоп, но моя информация не помещается в комментарии. Я удалю, если это уместно.
(1) сценарий отличается от командной строки: этого никогда не должно происходить. Если вы можете выделить полный пример, который показывает это (зашифрованный ввод, пароль, точная команда в сценарии и та же команда в командной строке) с неконфиденциальными (т. е. тестовыми) данными, опубликуйте его. (Зашифрованные данные являются двоичными, поэтому для их публикации используйте либо защитный формат, например base64 или hex, либо сайт, который обрабатывает двоичные данные, например, Pastebin.)
(2) ложные срабатывания: т. е. openssl enc -d иногда имеет статус 0 и НЕ говорит «неверное расшифрование», даже если пароль неправильный. ЭТО ОЖИДАЕМО. enc -d, как правило, не имеет возможности проверить или узнать, что вы используете неправильный пароль и, следовательно, ключ (и IV/nonce, где это применимо, что и есть здесь). Что он может проверить для некоторых режимов (включая CBC), так это то, что расшифрованное (PKCS5/7) заполнение допустимо, если заполнение используется, что здесь по умолчанию (и вообще для CBC оно должно быть).
Когда вы расшифровываете неправильный пароль и ключ (и IV/nonce), получается то, что для всех практических целей является случайными двоичными данными. (Фактически одна и та же операция — итерация примитива шифрования с произвольным ключом — фактически использовалась в качестве генератора случайных чисел (RNG) или генератора случайных битов (RBG) в некоторых проектах, особенно для высокопроизводительного оборудования начального уровня, где дополнительные схемы могут стоить значительных денег.) Примерно в 1/250 случаев (точнее, 1/2^8 + 1/2^16 + 1/2^24... 1/2^128) эти случайные данные будут сопоставьте спецификацию PKCS5/7 для допустимого заполнения, и enc *CBC -d будет «успешен»; в противном случае (около 99,6% случаев) enc *CBC -d пометит ошибку (хотя, если зашифрованный текст состоял из более чем одного блока, он все равно будет записывать расшифрованный мусор для всех блоков, кроме последнего).
Обратите внимание, что в режиме шифрования с проверкой подлинности неверные расшифровки будут надежно обнаружены. Но openssl enc не поддерживает режимы шифрования с аутентификацией (и вроде как не может из-за способа потоковой передачи вывода).
Я думаю, что 2 звучит так, как будто он на правильном пути и объясняет, почему это происходит. Что касается 1, я был бы более чем рад отправить вам файлы и тому подобное. В них нет ничего чувствительного. Мне удалось сгенерировать ответ о неправильном расшифровке в командной строке для тех же слов, которые привели к возврату 0 из версии сценария. Если вы хотите просмотреть файлы, дайте мне знать, и я это организую.
Итак, я провел еще один тест с файлом и сбросил все успешные слова, и знаете что? 1473 слова из файла в 370 107 слов были указаны как 0 или хорошие пароли. Если посчитать, это 0,00387 или 1/250 времени. Всем спасибо.
Вы уверены, что хотите выполнить (
$(openssl ...)) вывод вашей команды openssl?