Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Лысков Игорь Витальевич
Статус: Младший модератор
Рейтинг: 285
∙ повысить рейтинг >>
Micren
Статус: Практикант
Рейтинг: 280
∙ повысить рейтинг >>
_Ayl_
Статус: 4-й класс
Рейтинг: 181
∙ повысить рейтинг >>

∙ / КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 1324 от 06.06.2009, 01:05
Администратор рассылки: Dr_Andrew, Младший модератор
В рассылке: подписчиков - 626, экспертов - 141
В номере: вопросов - 1, ответов - 1

Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке:
оценить выпуск >>

Вопрос № 168628: Здравствуйте. Пишу курсовую работу по программированию сетевых приложений, тема: "Распределенные вычисления. Подбор паролей к архивам". Серверную часть почти написал. Пароли будут подбираться перебором. Из конфигурационного файла считываетс...



Вопрос № 168628:

Здравствуйте. Пишу курсовую работу по программированию сетевых приложений, тема: "Распределенные вычисления. Подбор паролей к архивам". Серверную часть почти написал. Пароли будут подбираться перебором. Из конфигурационного файла считывается строка, содержащая символы, из которых будут получаться комбинации. Вопрос в том, как организовать этот перебор. Возможно удобнее сразу сделать функцию, возвращающую комбинации символов определенной длины, например из строки символов "abcdefg123456" получать пароли длины 4 символа. Спасибо.

Отправлен: 31.05.2009, 20:52
Вопрос задал: Басёнов Евгений Станиславович, Посетитель
Всего ответов: 1
Страница вопроса >>


Отвечает Micren, Практикант :
Здравствуйте, Басёнов Евгений Станиславович.
Можно перебор организовать так.
Код:

#include <iostream>
#include <string>
#include <vector>
#include <stdexcept>

using namespace std;

// Функция, которая будет использоваться для проверки пароля
// в данном случае просто печатает его
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 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!



    Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке:
    оценить выпуск >>

    подать вопрос экспертам этой рассылки >>

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров >>

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.0 beta от 24.05.2009

    В избранное