es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Descifrar la operación XOR rotativa con una clave de 10 bytes en todos los bytes del paquete en C++.

Intentando descubrir cómo escribir algo en C++ que descifre un XOR giratorio en bytes de paquete que tendrán tamaños variables con una clave de 10 bytes conocida (la clave puede ser ascii o hex, lo que sea más fácil).

Por ejemplo:

Clave XOR de 10 bytes en hexadecimal: 41 30 42 44 46 4C 58 53 52 54

Clave XOR de 10 bytes en ascii: A0BDFLXSRT

Aquí está “This is my message in clear text” en hexadecimal que necesita ser descifrado con la clave anterior:

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

Necesito una forma de aplicar mi clave XOR sobre estos bytes de esta manera, de forma giratoria:

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

Cuando los XOReo juntos, obtengo los datos en formato legible nuevamente:

“This is my message in clear text”

He visto algunos ejemplos que toman toda la clave XOR y la aplican a cada byte, pero eso no es lo que necesito. Debe rotar de alguna manera sobre los bytes hasta que se alcance el final de los datos.

¿Hay alguien que pueda ayudar?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para descifrar un XOR rotativo con una clave conocida de 10 bytes en C++, puedes usar un bucle para iterar sobre cada byte en el mensaje encriptado y aplicar la operación XOR con el byte correspondiente de la clave rotativa, que está determinada por la posición en el bucle módulo la longitud de la clave. Aquí tienes un código de ejemplo para lograr esto:

    “`c++
    #include
    #include

    using namespace std;

    vector decryptMessage(vector encrypted, vector key) {
    vector
    decrypted;
    for (int i = 0; i < encrypted.size(); i++) {
    uint8_t decryptedByte = encrypted[i] ^ key[i % key.size()]; //aplicar el XOR con el byte de la clave rotativa
    decrypted.push_back(decryptedByte);
    }
    return decrypted;
    }

    int main() {
    vector encryptedMessage = {0x15, 0x58, 0x2B, 0x37, 0x66, 0x25, 0x2B, 0x73, 0x3F, 0x2D, 0x61, 0x5D, 0x27, 0x37, 0x35, 0x2D, 0x3F, 0x36, 0x72, 0x3D, 0x2F, 0x10, 0x21, 0x28, 0x23, 0x2D, 0x2A, 0x73, 0x26, 0x31, 0x39, 0x44};
    vector
    key = {0x41, 0x30, 0x42, 0x44, 0x46, 0x4C, 0x58, 0x53, 0x52, 0x54};
    vector
    decryptedMessage = decryptMessage(encryptedMessage, key);
    cout << “Mensaje descifrado: “;
    for (int i = 0; i < decryptedMessage.size(); i++) {
    cout << char(decryptedMessage[i]);
    }
    cout << endl;
    return 0;
    }
    “`

    La función decryptMessage recibe el mensaje encriptado y la clave como vectores de uint8_t (enteros sin signo de 8 bits) y devuelve el mensaje descifrado como un vector de uint8_t. El bucle itera sobre cada byte en el mensaje encriptado, y se usa el operador ^ para aplicar la operación XOR con el byte correspondiente de la clave rotativa. El resultado se agrega a un vector que contiene los bytes descifrados. Finalmente, el mensaje descifrado se imprime carácter por carácter.

    Ten en cuenta que este código asume que la longitud de la clave es menor o igual a la longitud del mensaje encriptado. Si la clave es más larga que el mensaje, tendrás que ajustar la longitud del bucle en consecuencia (por ejemplo, usando el operador módulo % con la longitud del mensaje en lugar de la longitud de la clave).

Comments are closed.