使用openssl在客户端/服务器中进行DES加密/解密

3
需要在服务器上执行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个回答

4

您提供的长度不正确。

请尝试以下操作:

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);

3
我认为原因很简单。
在服务器中,您使用 strlen() 来获取内容长度,因此忽略了字符串末尾的终止符 '\0'。您解密内容并打印它时也忽略了该终止符 '\0'。因此,您会打印出解密消息末尾内存中的垃圾数据。
您需要通过类似于使用 strlen(dataBuffer)+1 的方式发送包括终止符 '\0' 在内的数据,或者您需要将其添加到接收到的内容中。
两个附注:
1. DES 算法是非常不安全的算法,永远不要使用它。 2. 在套接字编程中,建议始终在数据旁边发送数据长度。例如,发送 2 个字节表示加密数据长度,然后发送数据。这样,您可以更好地管理客户端数据。

1
DES被认为是不安全的,因为它的密钥长度很短 - 64位,实际上只有56位有效。但是,采用三倍长密钥的3DES被认为是非常安全的。 - малин чекуров
@малинчекуров 是的,3DESDES 更好,但据我所记,它仍然比 AES256 等算法差很多。但无论如何,我们都同意他不应该使用 DES。 :) - Afshin
1
3DES 作为块密码本身无法被当前技术破解。3DES 的主要问题在于其较小的块大小,这使得 Sweet32 等生日攻击成为可能 - 您必须每 32GB 更换密钥。但这并不意味着您必须忘记它,确实有一天必须用 AES 替换它,但是今天仍然有应用场景。 - малин чекуров
1
@малинчекуров,其实没有什么理由继续使用3DES。它已经被许多常见的加密库弃用,没有像AES那样的硬件加速,并且需要特殊的实现工作来避免像你所概述的攻击。这就像建议使用马和马车一样。当然,它可以把你从A点带到B点,但你不想使用汽车吗? - Luke Joshua Park

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接