0

我想使用 OpenSSL 在服务器和客户端之间进行数据传输。我想在 CBC 模式下使用 EVP 和 AES 来做到这一点。但是当我尝试在客户端解码第二条消息时,EVP_EncryptFinal_ex 返回 0。我的方案显示在图片上。

近似方案

我认为,这种行为是因为我为一个 EVP 上下文调用了两次 EVP_EncryptFinal_ex(和 EVP_DecryptFinal_ex)。如何正确执行?

4

1 回答 1

1

根据EVP 文档,您不能在调用EVP_EncryptUpdate()后调用。 EVP_EncryptFinal_ex()

如果启用了填充(默认),则 EVP_EncryptFinal_ex() 加密“最终”数据,即保留在部分块中的任何数据。它使用标准块填充(又名 PKCS 填充),如下面的 NOTES 部分所述。将加密的最终数据写入应该有足够空间容纳一个密码块的地方。写入的字节数放在 outl 中。调用此函数后,加密操作完成,不应再调用 EVP_EncryptUpdate()。

相反,您应该通过调用再次设置密码 ctx 进行加密EVP_EncryptInit_ex()。请注意,与EVP_EncryptInit(), with不同EVP_EncryptInit_ex(),您可以继续重用现有上下文,而无需在每次调用时分配和释放它。

于 2016-06-06T20:26:59.723 回答