raniam Ответов: 1

Первые 16 символов расшифровки-это мусор, остальные расшифрованы правильно!


Привет,

Я выполняю функции шифрования/дешифрования в клиентском / серверном приложении.

сервер отправляет зашифрованное значение клиенту.
ЗАПИСКА: Та часть, где я копирую зашифрованное значение в char *, решила проблему отправки значения клиенту с отсутствующим первым символом.


const char * Enc_Message2 = AES_Encrypt(Message2, Shared_Session_Key_S, I_V);
	cout<<"\n\nENCRYPTED MESSAGE2 {S,nb,ns}:";
	cout<<"\n============================="<<"\r\n"<<Enc_Message2;
	//cout<<"\n\nSIZE OF ENCRYPTED MESSAGE2: "<<sizeof(Enc_Message2);
	//cout<<"\n\nSIZE OF ENCRYPTED MESSAGE2 {S,nb,ns}: "<<sizeof(Enc_Message2);

	int e = strlen(Enc_Message2);
	char * enc_msg2 = new char[e+1];
	strcpy(enc_msg2, Enc_Message2);

	s5 =clientSock->SendString(enc_msg2);
	 if (s5 != true) {
		std::cout << clientSock->lastErrorText() << "\r\n";
		return;	}



Затем клиент получает значение правильно и начинает его расшифровывать, но первые 16 символов являются мусором, а остальная часть расшифрованного значения является правильной.

const char * Recieved_Enc_Msg2 = 0;
	 Recieved_Enc_Msg2 = socket.receiveString();
		if (Recieved_Enc_Msg2 == 0 ) {
		std::cout << socket.lastErrorText();
		return;
	}
	std::cout<<"\n\nRECIEVED MESSAGE2: "<<"\r\n"<<Recieved_Enc_Msg2;

	 const char * Dec_Msg2 = AES_Decrypt(Recieved_Enc_Msg2, s_sessionKey, iv);
	 cout<<"\n\nDECRYPTED MESSAGE2: "<<"\r\n"<<Dec_Msg2;


ниже приведен процесс расшифровки AES:

nst char * Client_Side::AES_Decrypt(const char * Enc_Msg2, const char * Client_sessionKey, const char * i_v)
  {
	CkCrypt2 decrypt;

	 bool success = decrypt.UnlockComponent("****************");
	if (success != true) {
		std::cout << decrypt.lastErrorText() << "\r\n";
		//return;
	}

	//  Decrypt something...
	decrypt.put_CryptAlgorithm("aes");
	decrypt.put_KeyLength(128);
	decrypt.put_CipherMode("cbc");
	decrypt.SetEncodedKey(Client_sessionKey,"base64");
	decrypt.SetEncodedIV(i_v,"base64");
	decrypt.put_EncodingMode("base64");

	//  Use an IV that is the MD5 hash of the session key...
/*	const char *iv = 0;
	iv = decrypt.hashStringENC(shared_secret_key_S);

	//  AES uses a 16-byte IV:
	cout << "Initialization Vector:" << "\r\n";
	cout << iv << "\r\n";   */


	const char * Decrypted_Message2 ;
	//Decrypted_Message1 = decrypt.decryptEncoded(rec_enc_msg1);
	Decrypted_Message2 = decrypt.decryptStringENC(Enc_Msg2);

	cout <<"\n\nLength"<< strlen(Decrypted_Message2);
	return Decrypted_Message2;
 }


Что я уже пробовал:

1-попробовал скопировать const char * в новый char *, не получилось.

1 Ответов

Рейтинг:
0

Jochen Arndt

Вы возвращаете указатель на расшифрованное сообщение, которое больше не является действительным:

const char * Client_Side::AES_Decrypt(/*...*/)
{
    CkCrypt2 decrypt;
    // ...
    const char * Decrypted_Message2 ;
    //Decrypted_Message1 = decrypt.decryptEncoded(rec_enc_msg1);
    Decrypted_Message2 = decrypt.decryptStringENC(Enc_Msg2);
    // ...
    return Decrypted_Message2;
}

CkCrypt2 выделит внутренний буфер для расшифрованной строки, которая возвращается функцией decrypt. При возвращении из вашей функции CkCrypt2 пример decrypt выходит за пределы области действия, вызывается деструктор, и буфер освобождается. Таким образом, значение, возвращаемое вашей функцией, по-прежнему указывает на адрес буфера, но содержимое памяти не определено.


Кроме того, ваша сетевая передача по меньшей мере подозрительна:

Как это происходит socket.receiveString() обнаруживает конец полученной строки?
Является clientSock->SendString() отправка строки с нулевым завершением или используется какой-то протокол, содержащий длину строки?


raniam

Привет,
Я уже добавил следующие строки в конце функции AES_Decrypt и все еще не работал

int g = strlen(Decrypted_Message2);
char * DEC_msg2 = новый символ[g+1];
strcpy(DEC_msg2, Decrypted_Message2);

вернуться DEC_msg2;

Jochen Arndt

Тогда у вас есть и другие ошибки.

Насколько я помню, вам уже было сказано проверить шифрование / автономность без сетевой передачи. Сделайте это и проверьте свою сетевую передачу с помощью обычной строки.

В качестве альтернативы проверьте, идентична ли зашифрованная строка, полученная клиентом, тем, которые отправляются, просто распечатав их оба.

Для проверки шифрования / дешифрования используйте известные ссылочные строки. Они обычно доступны для различных методов. Это покажет вам, если шифрование, дешифрование или и то, и другое не удается.

Это сузит круг поисков неудачи.

Обнаружение ошибок путем чтения кода здесь гораздо сложнее, чем сидеть перед IDE, которая предоставляет функции отладки и где некоторые тесты могут быть реализованы быстро.

Ошибка, разрешенная в моем решении, была очевидна. Но другие просто требуют отладки или использования методов тестирования, таких как использование известных справочных данных. Но это должны сделать вы. Или вы находите кого-то, кто делает это для вас после того, как дадите ему полный код. Но КП-не самое подходящее место для этого, потому что мы здесь неоплачиваемые добровольцы.