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 旁注:
DES
算法是一个非常不安全的算法,永远不要使用它。
- 在套接字编程中,总是建议将数据长度与数据一起发送。比如先发送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);
我需要在服务端进行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 旁注:
DES
算法是一个非常不安全的算法,永远不要使用它。- 在套接字编程中,总是建议将数据长度与数据一起发送。比如先发送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);