raniam Ответов: 2

Функция расшифровки возвращает мусор ! ! !


Привет,

Я выполняю процесс шифрования/дешифрования AES (используя функции шифрования Chilkat AES).
Результат шифрования выполняется плавно и передается от клиента на сервер.

Проблема заключается в функции дешифрования, каждый раз, когда функция пытается расшифровать полученный зашифрованный результат, она возвращает мусор!!!!
Хотя я убедился, что необходимые параметры (используемые в функции шифрования) верны, такие как вектор инициализации, общий секретный ключ и даже свойства одинаковы.

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

ниже приведена функция шифрования, которая работает правильно:

const char * Client_Side::AES_Encrypt(const char * msg1, const char * C_sessionKey, const char * ivector)
{
   CkCrypt2 crypt;

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


	//  Encrypt something...
	crypt.put_CryptAlgorithm("aes");
	crypt.put_KeyLength(128);
	crypt.put_CipherMode("cbc");
	crypt.SetEncodedKey(C_sessionKey,"base64");
	crypt.SetEncodedIV(ivector,"base64");
	crypt.put_EncodingMode("base64");


	//  Encrypt some text:
	const char *cipherText64 = 0;
	cipherText64 = crypt.encryptStringENC(msg1);
	std::cout <<"\n\nENCRYPTED MESSAGE1: "<< cipherText64 << "\r\n";
        return cipherText64;}



ниже приведен код расшифровки, который возвращает мусор:

const char * Server_Side::AES_Decrypt(const char * Enc_Msg1, const char * SrvSessionKey
																  ,const char * iv)
  {
	CkCrypt2 decrypt;

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


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


	std::cout<<"\nKEY: "<<SrvSessionKey;
	std::cout<<"\nIV: "<< iv;
	std::cout<<"\nMESSAGE TO BE DECRYPTED:"<<"\r\n"<<Enc_Msg1;


	const char * Decrypted_Message1 = 0;
	Decrypted_Message1 = decrypt.decryptStringENC(Enc_Msg1);
	std::cout <<"\n\nDecrypted_Message1:"<<"\r\n"<<Decrypted_Message1;
	std::cout <<"\n\nLength"<< strlen(Decrypted_Message1);
	return Decrypted_Message1;
 }


Пожалуйста, мне нужна помощь с этим.

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

1-я пробовал поставить функцию дешифрования в основную, но все равно не получилось.
2-Убедитесь, что вектор инициализации и общий секретный ключ идентичны.
3-изменен режим кодирования в обеих функциях, не работает.
4-triedd, генерирующий общий секретный ключ в рамках одной и той же функции дешифрования, не сработал.

2 Ответов

Рейтинг:
1

KarstenK

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

Взгляните на это пример кода из Chilkat чтобы найти свои ошибки.

Совет: используйте некоторые тестовые данные верифицировать ваша реализация.


Рейтинг:
0

Patrice T

Цитата:
Проблема заключается в функции дешифрования, каждый раз, когда функция пытается расшифровать полученный зашифрованный результат, она возвращает мусор!!!!

Откуда вы знаете, что проблема заключается в функции дешифрования ?
Тот факт, что функция шифрования возвращает зашифрованную строку, не означает, что зашифрованная строка верна.

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

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

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]

Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.


raniam

можно ли запустить отладчик на двух разных проектах одновременно?, так как клиент и сервер должны работать вместе.

Patrice T

Да, запустите 1 отладчик на клиенте и 1 на сервере.

Philippe Mori

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

Для целей тестирования вы можете использовать жестко закодированные значения, поэтому вам не нужен весь клиентский код.

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

raniam

Я пробовал запускать оба отладчика одновременно на C++ Builder XE3, но это не сработало.
Вы были правы, проблема была на стороне клиента, в котором происходит шифрование.
Я исправил эту проблему, сгенерировав ключ сеанса и IV в одной и той же функции клиентского сокета, вместо того чтобы иметь свои собственные функции. затем я выполнил процесс шифрования.