1

我正在开发一个简单的应用程序,其中有一个客户端(C)和一个服务器(S)。

客户端从标准输入中获取文本,对其进行加密,然后将其发送到服务器。

因为,我不知道来自用户的文本是否是 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 个字节),作为第二条消息:“hello”。我的服务器将打印第二条消息:“0x08 0x08 0x08 0x08 0x08 0x08 0x08 0x08 Hello”。

0x08 8 次是客户端 EVP_EncryptFinal_ex 添加的填充。

另一个例子:如果第一条消息是“prova daje”。和“你好”作为第二个。服务器将打印为第二条消息:“je 0x05 0x05 0x05 0x05 0x05 hello”请注意,je 和 0x05 5 次是第一条消息的一部分,实际上:“prova da”是 8 个字节,“je'\0'”是 3 个字节,所以 0x05 是填充。

我怎样才能避免这种情况?我希望第一条和第二条消息之间没有依赖关系。

clean_up每次都要打电话吗?


编辑:我解决了,因为我调用了 EVP_EncryptFinal_ex 我必须调用 EVP_init 才能重用上下文。

4

0 回答 0