Можно ли узнать пароль который запрашивает эта программа?
Программа запрашивает у пользователя пароль размером от 8 до 16 символов, затем с паролем производит какие-то действия и отвечает либо "Fail!", либо "Success!". Нужно узнать, какой пароль нужно ввести, чтобы она вывела "Success!" на экран; можно менять сам код, не затрагивая алгоритм преобразования пароля, но основная задача - не просто сделать так, чтобы программа вывела положительный результат, а узнать сам пароль. Даже не знаю, с чего начать, хоть хорошо, что исходный код есть:
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
bool testSizeKey(const string& key)
{
return (key.size() >= 8 && key.size() <= 16);
}
bool testNum(const long long int& num)
{
return (num == 105343298798);
}
string inputKey()
{
string key;
cout << "Введите пароль: ";
getline(cin, key);
return key;
}
long long int convertKey(const string& key)
{
int* table = new int[key.size()];
long long int rand_num = 1;
for (int i = 0; i < (int)key.size(); i++)
{
table[i] = key[i];
}
for (int i = 2; i < (int)key.size(); i++)
{
if (table[i] < table[i - 1]) table[i] = table[i - 2] * table[i - 1] - table[i];
else table[i] = table[i - 2] - table[i - 1] + table[i];
}
for (int i = 0; i < (int)key.size(); i++)
{
for (int j = 0; j < (int)key.size(); j++)
{
switch (j % 3)
{
case 0:
if (i == (int)key.size() - 3)
rand_num += table[j] + 7 * table[i];
else
rand_num -= table[j] + 8;
break;
case 1:
if (i == (int)key.size() - 1)
rand_num -= table[j] + 2 * table[i];
else
rand_num += table[j] + 3;
break;
case 2:
if (i == (int)key.size() - 5)
rand_num += table[j] + 4 * table[i];
else
rand_num -= table[j] + 6;
break;
}
for (int k = 0; k < key.size(); k++)
{
rand_num -= table[k];
}
}
}
delete[] table;
return rand_num;
}
int main()
{
setlocale(LC_ALL, "Russian");
string this_key = inputKey();
long long int data;
while (!testSizeKey(this_key))
{
cout << "Размер пароля: от 8 до 16 символов!\n";
cout << "Нажмите любую клавишу...";
_getch();
system("cls");
this_key = inputKey();
}
if (testSizeKey(this_key))
{
data = convertKey(this_key);
if (testNum(data)) cout << "\nSuccess!\n";
else cout << "\nFail!\n";
cout << "Нажмите любую клавишу...";
_getch();
}
return 0;
}
Не особо понимаю, зачем нужно это число (105343298798) и откуда оно вообще взялось, скорее всего зацепка кроется в нём, я прав? Буду благодарен за любую помощь!
Ответы (1 шт):
Функция convertKey - это хеш-функция, возвращает из пароля его хеш. Правильный пароль возвращает хеш = 105343298798. А неправильный - другое число. Хеш функции сделаны для сложного перебора паролей, и непрактичности этой тактики. Паролей с таким-же хеш значением огромное количество, так-что узнать какой из них оригинальный невозможно.