C++ 中的反转乘法运算符
Reversing multiplication operator in c++
我正在尝试反转应用程序的反序列化器,我已经基本完成了,但我被困在这个问题上。该应用程序,无论出于何种原因,通过将其乘以编码密钥(或与此相关的解码密钥)来解码 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;
}
感谢@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;
}
我正在尝试反转应用程序的反序列化器,我已经基本完成了,但我被困在这个问题上。该应用程序,无论出于何种原因,通过将其乘以编码密钥(或与此相关的解码密钥)来解码 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;
}
感谢@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;
}