Home > Software engineering >  Decrypt rotating XOR with 10-byte key across packet bytes in C
Decrypt rotating XOR with 10-byte key across packet bytes in C

Time:12-04

Trying to figure out how to write something in C that will decrypt a rotating XOR to packet bytes that will be in varying sizes with a known 10 byte key (key can be ascii or hex, whatever is easier).

For example:

XOR 10-byte key in hex: 41 30 42 44 46 4c 58 53 52 54

XOR 10-byte key in ascii: A0BDFLXSRT

Here is "This is my message in clear text" in hex that needs to be decrypted with above key

15 58 2B 37 66 25 2B 73 3F 2D 61 5D 27 37 35 2D 3F 36 72 3D 2F 10 21 28 23 2D 2A 73 26 31 39 44

I need a way to apply my XOR key over the top of these bytes like this in a rotating fashion:

41 30 42 44 46 4c 58 53 52 54 41 30 42 44 46 4c 58 53 52 54 41 30 42 44 46 4c 58 53 52 54 52 54 15 58 2B 37 66 25 2B 73 3F 2D 61 5D 27 37 35 2D 3F 36 72 3D 2F 10 21 28 23 2D 2A 73 26 31 39 44

When I XOR these together, I get the data in readable format again:

"This is my message in clear text"

I've seen some examples that take the entire XOR key and apply it to each byte, but that's not what I need. It needs to somehow rotate over the bytes until the end of the data is reached.

Is there anyone who can assist?

CodePudding user response:

Use the % (modulus) operator!

using byte_t = unsigned char;

std::vector< byte_t > xor_key;
std::vector< byte_t > cipher_text;

std::string plain_text;
plain_text.reserve( cipher_text.size( ) );

for( std::size_t i = 0;
     i < cipher_text.size( );
       i )
{
    auto const cipher_byte = cipher_text[ i ];
    // i % xor_key.size( ) will "rotate" the index
    auto const key_byte = xor_key[ i % xor_key.size( ) ];
    // xor like usual!
    plain_text  = static_cast< char >( cipher_byte ^ key_byte );
}

CodePudding user response:

You just use a loop, and a modulus operation, to XOR one byte of the key, with one byte of the cypher text.

void decrypt(char *cypher, int length, char* key) {
    for (int i = 0; i < length; i  ) cypher[i] ^= key[i % 10];
}

By indexing the key with modulus (remainder) of 10, it will always have "rotating" values between 0 and 9.

  • Related