OpenSSL EVP_DecryptFinal_ex在输出缓冲区的末尾生成垃圾

时间:2014-08-10 23:28:02

标签: c encryption openssl aes evp-cipher

我正在使用openssl函数解密一些数据,并且我对解密的最终结果有一些问题。

 EVP_DecryptInit_ex(ctx, EVP_aes_192_cbc(), NULL, myKey, myVector);

    int iPos = 0;

    EVP_DecryptUpdate(ctx, decryptedData, &outLength, cryptedData,216);

    INFO_NET_HEADER * header = (INFO_NET_HEADER)decryptedData;
    iPos += outLength;

    //...

    int  nStreamLength =  ((header->incoming_audio_len / 16 +1) *16) - 16; //adjusting the length to the block size, incoming_audio_len is a length of the plain audio stream non-crypted data

   char *rest =  malloc(nStreamLength+48);
   char *decryptedStream = malloc(nStreamLength+48);
   int size =  receiveRemaining(nStreamLength,rest);
   memcpy(decryptedStream,0,nStreamLength+48);

   EVP_DecryptUpdate(ctx, decryptedStream, &outLength, rest,size);

    EVP_DecryptFinal_ex(ctx, decryptedStream+outLength, &loutLength);

我正在按部分解密,首先我需要解密200个字节,因为它们包含我需要获取的一些名称和数据长度以及接收此数据。前200个字节和其余数据都使用相同的密钥加密。然后我拿取我需要解密的数据量来接收完整的流,我成功接收了那些,一切都很好但是在输出缓冲区中总是有一些垃圾,比如“somedataend \ x14 \ x14 \ x14 ......“等等,垃圾大小从14到16个字节长,这是EVP openssl函数的正常行为吗?

1 个答案:

答案 0 :(得分:0)

示例代码中没有显示,但我认为您在解密"部件时会放入EVP_CIPHER_CTX_set_padding来禁用填充#34;。解密密文的最后一部分时需要重新启用它,否则填充将保留。

还要注意你注意到最后返回的&loutLength。删除填充后,明文中剩余的字节数将少于所包含的密文。