使用AES的OpenSSL数据传输

时间:2016-06-06 19:35:59

标签: security openssl aes cbc-mode

我想使用OpenSSL在服务器和客户端之间进行数据传输。我想在CBC模式下使用带有AES的EVP来实现。但是当我尝试在客户端解码第二条消息时,EVP_EncryptFinal_ex返回0。 我的计划如图所示。

Approximated scheme

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

1 个答案:

答案 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(),您可以继续重用现有的上下文,而无需在每次调用时分配和释放它。