我想使用 OpenSSL 在服务器和客户端之间进行数据传输。我想在 CBC 模式下使用 EVP 和 AES 来做到这一点。但是当我尝试在客户端解码第二条消息时,EVP_EncryptFinal_ex 返回 0。我的方案显示在图片上。
我认为,这种行为是因为我为一个 EVP 上下文调用了两次 EVP_EncryptFinal_ex(和 EVP_DecryptFinal_ex)。如何正确执行?
根据EVP 文档,您不能在调用EVP_EncryptUpdate()
后调用。 EVP_EncryptFinal_ex()
如果启用了填充(默认),则 EVP_EncryptFinal_ex() 加密“最终”数据,即保留在部分块中的任何数据。它使用标准块填充(又名 PKCS 填充),如下面的 NOTES 部分所述。将加密的最终数据写入应该有足够空间容纳一个密码块的地方。写入的字节数放在 outl 中。调用此函数后,加密操作完成,不应再调用 EVP_EncryptUpdate()。
相反,您应该通过调用再次设置密码 ctx 进行加密EVP_EncryptInit_ex()
。请注意,与EVP_EncryptInit()
, with不同EVP_EncryptInit_ex()
,您可以继续重用现有上下文,而无需在每次调用时分配和释放它。