¿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())
davy.ai
Parece que el problema podría estar en la forma en que se asigna memoria al
receivedEncryptionMSG
. La funciónRSA_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 utilizandoRSA_size
podría resultar en una asignación de memoria insuficiente, lo que provocaría problemas al descifrar usandoRSA_private_decrypt
.En su lugar, se recomienda asignar memoria según la longitud del mensaje cifrado y luego copiar el contenido de
contents
utilizandomemcpy
. Esto se puede hacer de la siguiente manera:“`c++(receiveEnc)), istreambuf_iterator ());
// Leer el mensaje cifrado desde el archivo
ifstream receiveEnc(“thePipe”);
string receivedEncryptionMSGString((std::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 demalloc
, 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.