client/server 中的 DES encryption/decryption 使用 openssl

DES encryption/decryption in client/server using openssl

我需要在服务端进行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);

客户端收到数据并解密。

但是问题是当我在客户端打印解密数据时,它会打印一些垃圾值和解密数据。我如何摆脱那些垃圾价值? Client/Server 工作正常,没问题。

我不想post这里的完整代码,它会变得混乱。我很确定问题出在 posted 代码中。

谢谢!

我觉得道理很简单

在服务器中,您使用 strlen() 获取内容长度,因此您忽略了字符串末尾的终止符 '\0'。你解密你的内容并打印它而忽略终止'\0'。所以你在解密消息的末尾打印内存中的垃圾。

您需要发送数据 ,包括使用 strlen(dataBuffer)+1 之类的方式终止“\0”,或者您需要 add 它接收到的内容。

2 旁注:

  1. DES算法是一个非常不安全的算法,永远不要使用它。
  2. 在套接字编程中,总是建议将数据长度与数据一起发送。比如先发送2个字节表示加密后的数据长度再发送数据。这样您就可以在客户端更好地管理数据。

您为过程提供了错误的长度。

尝试以下操作:

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] = '[=11=]';

/* Show the decrypted text */
printf("Decrypted text is:\n");
printf("%s\n", decryptedDataBuffer);