【问题标题】:DES encryption/decryption in client/server using openssl使用 openssl 在客户端/服务器中进行 DES 加密/解密
【发布时间】:2018-05-14 18:36:04
【问题描述】:

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

客户端接收数据并解密。

但是问题是当我在客户端打印解密数据时,它会打印一些垃圾值以及解密数据。我如何摆脱那些垃圾值?客户端/服务器工作正常,没有问题。

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

谢谢!

【问题讨论】:

    标签: c encryption openssl client-server des


    【解决方案1】:

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

    尝试以下方法:

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

    【讨论】:

      【解决方案2】:

      我认为原因很简单。

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

      您需要发送数据包括终止'\0',例如使用strlen(dataBuffer)+1,或者您需要将其添加到接收的内容中。

      2 旁注:

      1. DES 算法是一个非常不安全的算法,切勿使用它。
      2. 在套接字编程中,总是建议将数据长度与数据一起发送。例如,发送 2 个字节显示加密数据长度,然后发送数据。因此,您可以在客户端更好地管理数据。

      【讨论】:

      • DES 被认为是不安全的,因为它的密钥长度很短 - 64 位,实际上是 56 位。但是具有三重密钥长度的 3DES 被认为是非常安全的。
      • @малинчекуров 是的,3DES 更好,但我记得,它仍然比AES256 差得多。但无论如何,我想我们都同意他不应该使用DES。 :)
      • 3DES 作为分组密码本身不能用当前技术破解。 3DES 的主要问题是它的块大小很小,这使得像 Sweet32 这样的生日边界攻击适用——你必须每 32GB 更改一次密钥。这并不意味着您必须忘记它,肯定有一天它必须被 AES 取代,但它今天仍然有它的应用程序。
      • @малинчекуров 没有任何理由继续使用 3DES。它已经被许多常见的加密库弃用,没有硬件加速(像 AES 那样),并且需要特殊的实施工作来避免像你概述的攻击这样的事情。这就像建议使用马车。当然,它可以让您从 A 到 B,但您不想使用汽车吗?
      猜你喜欢
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 2011-11-15
      • 2014-07-12
      • 1970-01-01
      相关资源
      最近更新 更多