Можно ли узнать пароль который запрашивает эта программа?

Программа запрашивает у пользователя пароль размером от 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 шт):

Автор решения: AlexGlebe

Функция convertKey - это хеш-функция, возвращает из пароля его хеш. Правильный пароль возвращает хеш = 105343298798. А неправильный - другое число. Хеш функции сделаны для сложного перебора паролей, и непрактичности этой тактики. Паролей с таким-же хеш значением огромное количество, так-что узнать какой из них оригинальный невозможно.

→ Ссылка