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.

¿Cómo es posible que enviar un mensaje cifrado RSA a través de un flujo de archivos impida que RSA_private_decrypt funcione en C++?

Utilizando OpenSSL, estoy descifrando un mensaje encriptado utilizando:

RSA_private_decrypt(encryption_len, (unsigned char*)encryptedMSG, (unsigned char*)decrypt, privateRSA, RSA_PKCS1_OAEP_PADDING);

Este código funciona ^^^. Sin embargo, surge un problema al enviar el encryptedMSG a través de un fstream. La decodificación del encryptedMSG original funciona, pero cuando lo envío a través de un fstream ya no funciona.

Para verificar que encyptedMSG mantiene su valor, lo envié a través de un fstream y el archivo receptor lo envía de vuelta inmediatamente. Comparé el encryptedMSG con el encryptedMSG recibido utilizando strcmp() y cout para verificar que son los mismos. Pero cuando intento decodificar el encryptedMSG recibido, no funciona, mientras que el encryptedMSG original sí. ¿Por qué?

El siguiente fragmento de código es el siguiente:

1) El archivo original envía encryptedMSG a través de ifstream
2) El archivo receptor lee encryptedMSG usando ofstream
3) El archivo receptor envía encryptedMSG de vuelta al archivo original usando ifstream
4) El archivo original verifica que receivedEncryptionMSG es idéntico a encryptedMSG utilizando strcmp()

5) Son idénticos, así que intenta realizar RSA_private_decrypt utilizando receivedEncryptionMSG, lo cual no funciona

6) Intenta realizar RSA_private_decrypt utilizando encryptedMSG, lo cual sí funciona

He intentado diferentes formas de asignar memoria a receivedEncryptedMsg desde el fstream utilizando malloc, la longitud del contenido del stream y un número codificado.

Las 3 formas producen un arreglo de caracteres idéntico al EncryptedMSG original y verificado por medio de cout y strcmp. Sin embargo, cuando uso receivedEncryptedMSG, no funciona. ¿Por qué?

ofstream pipe;
pipe.open ("thePipe");
pipe << encryptedMSG

Otro archivo lee el fstream y envía el encryptedMSG de vuelta:

//Lee en un arreglo de caracteres
ifstream in("thePipe");
string content((std::istreambuf_iterator<char>(in)), istreambuf_iterator<char>());
char contents[content.length()];
strcpy(contents, content.c_str());

//Envía de vuelta el arreglo de caracteres `encryptedMSG`
ofstream pipe;
pipe.open ("thePipe");
pipe << contents;
pipe.close();

El archivo original lee el encryptedMSG utilizando el mismo método que antes:

ifstream receiveEnc("thePipe");
string receivedEncryptionMSGString((std::istreambuf_iterator<char>(receiveEnc)), istreambuf_iterator<char>());
char* receivedEncryptionMSG = (char *)malloc(RSA_size(publicRSA));
strcpy(receivedEncryptionMSG, receivedEncryptionMSGString.c_str())

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema podría estar en la forma en que se asigna memoria al receivedEncryptionMSG. La función RSA_size devuelve el tamaño del módulo en bytes, que puede no ser el mismo que la longitud del mensaje cifrado en bytes. Por lo tanto, asignar memoria utilizando RSA_size podría resultar en una asignación de memoria insuficiente, lo que provocaría problemas al descifrar usando RSA_private_decrypt.

    En su lugar, se recomienda asignar memoria según la longitud del mensaje cifrado y luego copiar el contenido de contents utilizando memcpy. Esto se puede hacer de la siguiente manera:

    “`c++
    // Leer el mensaje cifrado desde el archivo
    ifstream receiveEnc(“thePipe”);
    string receivedEncryptionMSGString((std::istreambuf_iterator(receiveEnc)), istreambuf_iterator());

    // Asignar memoria para receivedEncryptedMSG
    char* receivedEncryptionMSG = new char[receivedEncryptionMSGString.length() + 1];

    // Copiar el contenido de la cadena al arreglo de caracteres
    memcpy(receivedEncryptionMSG, receivedEncryptionMSGString.c_str(), receivedEncryptionMSGString.length() + 1);

    // Descifrar utilizando receivedEncryptedMSG
    RSA_private_decrypt(receivedEncryptionMSGString.length(), (unsigned char)receivedEncryptionMSG, (unsigned char)decrypt, privateRSA, RSA_PKCS1_OAEP_PADDING);

    // Liberar la memoria asignada
    delete[] receivedEncryptionMSG;
    “`

    Tenga en cuenta que se utiliza new char[] para asignar memoria en lugar de malloc, ya que esto es lo recomendado para asignar memoria dinámica en C++. Además, asegúrese de liberar la memoria después de su uso para evitar fugas de memoria.

Comments are closed.