我正在开发一个简单的应用程序,其中有客户端(C)和服务器(S)。
客户端从std输入获取文本,对其进行加密,然后将其发送到服务器。
因为,我不知道来自用户的文本是否是8字节的倍数(我正在使用des), 在我的加密功能中,我总是打电话: EVP_EncryptUpdate
然后: EVP_EncryptFinal_ex
int encrypt(EVP_CIPHER_CTX *x, char * in, char * buf_out )
{
int text_len;
int loutU;
int loutF;
text_len = strlen(in) + 1; // i.e : adding '\0'
if( EVP_EncryptUpdate(x, (unsigned char *)buf_out, &loutU, ( unsigned char*) in, text_len) == 0 )
return -1;
if( EVP_EncryptFinal_ex(x, (unsigned char *) &buf_out[loutU], &loutF) == 0 )
return -1;
return loutU + loutF;
}
一切正常但仅适用于第一条消息。
例如,如果我发送第一条消息: “12345678”(即8字节),并作为第二条消息: “你好”。 我的服务器将打印为第二条消息: “0x08 0x08 0x08 0x08 0x08 0x08 0x08 0x08 Hello”。
0x08 8次是客户端EVP_EncryptFinal_ex添加的填充。
另一个例子: 如果第一条消息是“prova daje”。 而“你好”作为第二名。 服务器将打印为第二条消息: “je 0x05 0x05 0x05 0x05 0x05你好” 请注意,je和0x05为5次是第一条消息的一部分,的确如下: “prova da”是8个字节,“je'\ 0'”是3个字节,所以0x05是填充。
我该如何避免这种情况? 我希望第一条和第二条消息之间没有依赖关系。
我每次都必须致电clean_up
吗?
编辑: 我解决了,因为我打电话给EVP_EncryptFinal_ex我必须调用EVP_init才能重用 背景。