我正在使用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函数的正常行为吗?
最佳答案
在示例代码中没有看到,但是我认为您在解密“部件”时已放入EVP_CIPHER_CTX_set_padding
以禁用填充。解密密文的最后一部分时,您需要重新启用它,否则填充将保留。
还要注意,您要注意最后返回的&loutLength
。删除填充后,纯文本中剩余的字节数将少于包含的密文。