In: Computer Science
Your country is at war and your enemies are using a secret code to communicate. You have managed to intercept a message that reads as follows: ,vtaNm a_"dabp!! The message is 16 characters long. The message is encrypted using the enemy’s secret code. You have just learned that the encryption algorithm is to take the original message, treat each group of 4 bytes like an integer, add a secret key to the integer, then copy the resulting number to the encrypted message treating it like four characters. For example, if the original string is “HI THERE” and the secret key is the number 2, then the algorithm would:
Take the first four characters, which are the first four bytes, which are “HI T”.
If these four bytes are typecast to a 4 byte int (the size of an int on most machines) then it has the value 1411402056.
Add the secret key of 2 to the value resulting in the value 1411402058
Typecast the 1411402058 back as a 4 character string, resulting in “JI T” (basically it just increases the leftmost character by 2 in the ASCII code)
The process is repeated for the next group of 4 characters, “HERE”:
These four bytes are typecast to a 4 byte int which is the value 1163019592
Add the secret key of 2 to the value resulting in the value 1163019594
Typecast 1163019594 back as a 4 character string, resulting in “JERE” The entire encrypted string would be “JI TJERE”
In the case of ,vtaNm a_"dabp!! you have figured out that the secret key is a number between 1 and 500.
Write a function that decrypts an encrypted message using a key that input as a parameter. From main, call the function with numbers between 1 and 500 for the key, printing out the resulting decrypted text each time. When you hit the correct key you will get a message that makes sense and have cracked the code! You should implement your function/program with pointers that uses typecasting to map back and forth between (char *) and (int *) as appropriate. What is the secret key and the decrypted message?
UPDATE: converted to C++
Well commented program in C++:
#include<iostream>
#include<string.h>
using namespace std;
int main(){
string encrpt_msg = ",vtaNm a_\"dabp!!";
char curr_block[4];
//looping for all secret keys 1 to 500
for(int i = 1; i <= 500; i++){
//decoding the msg for secret key i
char decrpt_msg[16];
//reading the encrpt_msg in blocks of 4
for(int j = 1; j <= 16; j++){
curr_block[(j - 1) % 4] = encrpt_msg[j - 1];
//when we have a block of 4
if(j % 4 == 0){
//converting the block to int
int *temp = (int*)curr_block;
//subtracting secret key from int
*temp = *temp - i;
//converting int back to char
char* temp1 = (char*)temp;
for(int k = 0; k < 4; k++){
decrpt_msg[j - 4 + k] = temp1[k];
}
}
}
decrpt_msg[16] = '\0';
cout<<"Key: "<<i<<"\tDecrypted msg: "<<decrpt_msg<<endl;
}
return 0;
}
Output:
The secret key is: 491
decrypted msg: Attack at dawn!!
If this helps you, do upvote as it motivates us a lot!