Обратный оператор умножения в C ++ - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь отменить десериализацию приложения, и я в основном закончил, но я застрял в этой проблеме.Приложение по какой-либо причине декодирует 4-байтовые числа путем умножения его на ключ кодирования (или ключ декодирования в этом отношении)

int decoded_number = (encode_key * encoded_number);

Это работает для декодирования их номеров, однако меня больше интересуеткодирование чисел, поэтому я могу сериализовать данные.Я попытался кодировать число путем умножения декодированного числа на ключ кодирования

int encoded_number = (encode_key * decoded_number);

Однако, когда я сравниваю его с исходным закодированным числом, оно совершенно другое.Я также пытался закодировать число брутфорсом, и оно работает, но для его создания требуется вечность, что невозможно при сериализации большого числа чисел.

for (int i = INT_MIN; i < INT_MAX; i++){
  if (i * encode_key == decoded_number)
    return i; /* "i" is the encoded number */
}

На данный момент я понятия не имеючто еще попробовать.Мой код ниже:

#include <iostream>
using namespace std;

int encode_key = -381784151; /* Key I took from the application */
int encoded_numbers[2] = {-810310503, 1520670208}; /* Numbers I took from the app */

int bruteforce(int decoded_number){
    for (int i = -2147483648; i < 2147483647; i++){ /* min and max int*/
        if (encode_key * i == decoded_number){ /* brute comparison */
            return i;
        }
    }
}

int main()
{
    for (int i = 0; i < 2; i++){
        int encoded_number = encoded_numbers[i];
        int decoded_number = encode_key * encoded_number;
        int attempt_encode = encode_key * decoded_number;
        int brute_encode = bruteforce(decoded_number);

        cout << "STARTING WITH NUMBER" << i+1 << "\n";
        cout << "Encoded Number: " << encoded_number << "\n";
        cout << "Decoded Number: " << decoded_number << "\n";
        cout << "Attempt to Re-Encode (FAIL): " << attempt_encode << "\n";
        cout << "Bruteforce Encode (SLOW!): " << brute_encode << "\n\n";
    }
    return 0;
}

Нажмите здесь, чтобы запустить код в вашем браузере

1 Ответ

0 голосов
/ 05 февраля 2019

Спасибо @EricPostpischil за отличный ответ.Чтобы инвертировать умножение, все, что вам нужно сделать, это умножить декодированное число на обратное умножение ключа.Вот пример кода с решением.

#include <iostream>
using namespace std;

int encode_key = -381784151;
int encoded_numbers[2] = {-810310503, 1520670208};

int getinverse(int key){
    for (int i = -2147483648; i < 2147483647; i++){ /* min and max int*/
        if (key * i == 1){ /* brute comparison */
            return i;
        }
    }
}

int main()
{
    int inverse = getinverse(encode_key); /* Grab the multiplicative inverse of encode_key */

    for (int i = 0; i < 2; i++){
        int encoded_number = encoded_numbers[i];
        int decoded_number = encode_key * encoded_number;
        int attempt_encode = inverse * decoded_number; /* multiply inverse and decoded_number */

        cout << "STARTING WITH NUMBER" << i+1 << "\n";
        cout << "Encoded Number: " << encoded_number << "\n";
        cout << "Decoded Number: " << decoded_number << "\n";
        cout << "Attempt to Re-Encode (CORRECT!): " << attempt_encode << "\n\n";
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...