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