Выпуск № 1324 от 06.06.2009, 01:05
Администратор рассылки: Dr_Andrew, Младший модератор
В рассылке: подписчиков - 626, экспертов - 141
В номере: вопросов - 1, ответов - 1
Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке: оценить выпуск >>
Вопрос № 168628: Здравствуйте. Пишу курсовую работу по программированию сетевых приложений, тема: "Распределенные вычисления. Подбор паролей к архивам". Серверную часть почти написал. Пароли будут подбираться перебором. Из конфигурационного файла считываетс...
Вопрос № 168628:
Здравствуйте. Пишу курсовую работу по программированию сетевых приложений, тема: "Распределенные вычисления. Подбор паролей к архивам". Серверную часть почти написал. Пароли будут подбираться перебором. Из конфигурационного файла считывается строка, содержащая символы, из которых будут получаться комбинации. Вопрос в том, как организовать этот перебор. Возможно удобнее сразу сделать функцию, возвращающую комбинации символов определенной длины, например из строки символов "abcdefg123456"
получать пароли длины 4 символа. Спасибо.
// Функция, которая будет использоваться для проверки
пароля // в данном случае просто печатает его bool checkFunction(string pass) { cout<<pass<<endl; return false; }
// Класс для перебора паролей class brute_force { typedef vector<string::iterator> indexesType; public: // Конструктор в качестве аргумента принимающий строку содержащую множество допустимых символов brute_force(string charset) :_charset(charset) { if(_charset.empty()) {
throw invalid_argument("charset is empty string"); } } // Запуск перебора // len - длина пароля // checkfunc - функция вызываемая для прверки пароля. Если вернула true перебор прекращается void run(size_t len,bool (checkfunc)(string pass)) { indexesType indexes(len,_charset.begin()); do { if(checkfunc(createPass(indexes))) { break; } } while (isNextAvailable(indexes)); } private: // Следующая комбинация //
Если false то перебрано все bool isNextAvailable(indexesType& indexes) { for (indexesType::reverse_iterator it=indexes.rbegin();it!=indexes.rend();++it) { if(++*it==_charset.end()) { *it=_charset.begin(); } else { return true; } } return false; } // Просто собирает пароль string createPass(const indexesType& indexes) { string pass; for(indexesType::const_iterator it=ind
exes.begin();it!=indexes.end();++it) { pass+=**it; } return pass; } string _charset; };
int main() { brute_force brf("abcdefg123456"); brf.run(4,checkFunction); system("PAUSE"); return 0; }
Если длина пароля не известна не сложно модифицировать класс, чтоб искал в определенных пределах.
Ответ отправил: Micren, Практикант
Ответ отправлен: 01.06.2009, 14:14
Оценка ответа: 5
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 250172
на номер 1151 (Россия) |
Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке: оценить выпуск >>
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.