Шифрование / дешифрование DES на клиенте / сервере с использованием openssl - PullRequest
0 голосов
/ 14 мая 2018

Мне нужно выполнить шифрование DES на сервере, отправить шифрование клиенту и расшифровать его на клиенте.

Сервер:

const EVP_CIPHER *c = EVP_des_cbc(); 
EVP_CIPHER_CTX  *x = malloc(sizeof(EVP_CIPHER_CTX));
EVP_CIPHER_CTX_init(x);

EVP_EncryptInit (x, c, key, iv);        // initlizing encryption

EVP_EncryptUpdate (x, encryptedDataBuffer, &encryptedDataLength, dataBuffer, strlen(dataBuffer));
EVP_EncryptFinal (x,  encryptedDataBuffer + encryptedDataLength,  &encryptedDataLength);

write(client_sock , encryptedDataBuffer , encryptedDataLength);
printf("Encrypted Data Sent to Client\n");

Здесь сервер шифрует данные и отправляет ихклиенту.Пока все хорошо.

Клиент:

serverDataLength = recv(sockfd , dataBuffer , MAXDATASIZE , 0);
printf("Encrypted Data is Received\n");

const EVP_CIPHER *c = EVP_des_cbc();    
EVP_CIPHER_CTX *x = malloc(sizeof(EVP_CIPHER_CTX));
EVP_CIPHER_CTX_init(x);

EVP_DecryptInit(x, c, key, iv);
EVP_DecryptUpdate(x,  decryptedDataBuffer, &sizeOfDecryptedBuffer , dataBuffer,  serverDataLength);
EVP_DecryptFinal(x, decryptedDataBuffer+sizeOfDecryptedBuffer, &sizeOfDecryptedBuffer);

printf("\n\nDecrypted Data: %s\n", decryptedDataBuffer);

Клиент получает данные и расшифровывает их.

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

Я не хочу размещать здесь полный код, он будет запутан.Я почти уверен, что проблема где-то в опубликованном коде.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Вы указали неправильные длины для процедур.

Попробуйте выполнить следующее:

int ciphertext_len;

EVP_EncryptUpdate (x, encryptedDataBuffer, &encryptedDataLength,     dataBuffer, strlen(dataBuffer));
ciphertext_len = encryptedDataLength;

EVP_EncryptFinal (x,  encryptedDataBuffer + encryptedDataLength,  &encryptedDataLength);
ciphertext_len += encryptedDataLength;


int plaintext_len;

EVP_DecryptUpdate(x,  decryptedDataBuffer, &sizeOfDecryptedBuffer , dataBuffer,  ciphertext_len);
plaintext_len = sizeOfDecryptedBuffer;

EVP_DecryptFinal(x, decryptedDataBuffer+sizeOfDecryptedBuffer, &sizeOfDecryptedBuffer);
plaintext_len += sizeOfDecryptedBuffer;

Теперь распечатайте расшифрованные данные:

/* Add a NULL terminator. We are expecting printable text */
decryptedDataBuffer[plaintext_len] = '\0';

/* Show the decrypted text */
printf("Decrypted text is:\n");
printf("%s\n", decryptedDataBuffer);
0 голосов
/ 14 мая 2018

Я думаю, что причина проста.

На сервере вы используете strlen() для получения длины контента, поэтому вы проигнорировали завершение '\ 0' в конце вашей строки.Вы расшифровываете свой контент и распечатываете его, игнорируя завершающий символ '\ 0'.Таким образом, вы выводите мусор из памяти в конце дешифрованного сообщения.

Вам нужно отправить данные , включая завершение '\ 0' , с помощью чего-то вроде strlen(dataBuffer)+1, или вам нужно добавьте к полученному содержимому.

2 примечание:

  1. DES алгоритм является очень небезопасным алгоритмом, НИКОГДА используйте его.
  2. При программировании сокетов всегда рекомендуется отправлять длину данных вместе с данными.Например, отправьте 2 байта, которые показывают длину зашифрованных данных, а затем отправьте данные.Таким образом, вы можете намного лучше управлять данными на клиенте.
...