2

在我看到的所有涉及使用 AES-GCM 的 OpenSSL EVP 接口的代码片段中(示例),代码大致如下所示:

EVP_DecryptInit(...);
EVP_CIPHER_CTX_ctrl(..., EVP_CTRL_GCM_SET_TAG, ...);
while (...) {
  EVP_DecryptUpdate(...);
}

success = EVP_DecryptFinal(...);

在调用EVP_CTRL_GCM_SET_TAG 之后设置标签是否合法EVP_DecryptUpdate?例如,如果传入的密文正在流式传输,并且标签位于流的末尾,这将很方便。

相关问题:在EVP_CTRL_GCM_SET_TAG某处有正式记录吗?

4

2 回答 2

2

在调用 EVP_DecryptUpdate 之后使用 EVP_CTRL_GCM_SET_TAG 设置标签是否合法?例如,如果传入的密文正在流式传输,并且标签位于流的末尾,这将很方便。

目前很难说,但我猜不是。从 OpenSSL 的 wiki 页面EVP Authenticated Encryption and Decryption

标签验证在您调用最终 EVP_DecryptUpdate 时执行,并由返回值反映:没有调用EVP_DecryptFinal.

GCM 是一种在线模式,这意味着您可以流式传输它。但是,EVP 接口是通用的,它们支持其他经过身份验证的加密模式,例如 CCM。CCM 模式需要预先确定标签的大小,因为它用于格式化标头。CCM 是一种离线模式,因为需要事先知道纯文本的标记大小。我正在实现 CCM 限制所有其他类似模式的飞跃。

此外,OpenSSL 是一个 SSL/TLS 库,而不是通用加密库。作为握手协议的一部分,TLS 协商密码套件和标签长度。TLS 没有您描述的用例,因此 OpenSSL 没有支持它的操作要求。

相关的,“OpenSSL 是一个 SSL/TLS 库”是库中有时缺少一些好东西的原因。这是一个治理问题。


相关问题: EVP_CTRL_GCM_SET_TAG 是否正式记录在某处?

这个问题的答案是否定的:

$ cd openssl-src
$ grep -IR EVP_CTRL_GCM_SET_TAG *
include/openssl/evp.h:# define     EVP_CTRL_GCM_SET_TAG      EVP_CTRL_AEAD_SET_TAG
$

如果 EVP_CTRL_GCM_SET_TAG记录在案,那么您会看到文件扩展名为*.pod. pod 文件是手册页的来源。

但是上面有一些 wiki 文档。Matt Caswell 编写了它,他是 OpenSSL 开发人员之一。尽管手册页是官方文档,但在这种情况下 wiki 也同样出色。

于 2017-03-14T23:15:44.287 回答
2

我不知道答案,但我想分享我对此的调查。

openssl wiki 页面https://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption上的示例显示了此序列:

EVP_DecryptUpdate(...);
EVP_CIPHER_CTX_ctrl(..., EVP_CTRL_GCM_SET_TAG, ...);
EVP_DecryptFinal(...);

因此,您可能认为这是合法的,但在我的测试中只成功了一半:当我设置更改标签时,对 EVP_DecryptFinal_ex 的调用表示错误(返回非 1),但随后对 ERR_print_errors_cb 的调用没有显示任何错误。诡异的。

于 2019-01-15T13:53:28.480 回答