Openssl 调用EVP_DecryptUpdate后是否可以设置AES-GCM标记?
在我看到的所有涉及使用AES-GCM()的OpenSSL EVP接口的代码片段中,代码大致如下所示:Openssl 调用EVP_DecryptUpdate后是否可以设置AES-GCM标记?,openssl,aes-gcm,Openssl,Aes Gcm,在我看到的所有涉及使用AES-GCM()的OpenSSL EVP接口的代码片段中,代码大致如下所示: EVP_DecryptInit(...); EVP_CIPHER_CTX_ctrl(..., EVP_CTRL_GCM_SET_TAG, ...); while (...) { EVP_DecryptUpdate(...); } success = EVP_DecryptFinal(...); 调用EVP\u DecryptUpdate后,使用EVP\u CTRL\u GCM\u set
EVP_DecryptInit(...);
EVP_CIPHER_CTX_ctrl(..., EVP_CTRL_GCM_SET_TAG, ...);
while (...) {
EVP_DecryptUpdate(...);
}
success = EVP_DecryptFinal(...);
调用EVP\u DecryptUpdate
后,使用EVP\u CTRL\u GCM\u set\u tag
设置标签是否合法?例如,如果传入的密文正在流式传输,并且标记位于流的末尾,这将非常方便
相关问题:EVP\u CTRL\u GCM\u SET\u TAG
是否有正式的文档记录
在调用EVP_DecryptUpdate后,使用EVP_CTRL_GCM_set_标记设置标记是否合法?例如,如果传入的密文正在流式传输,并且标记位于流的末尾,这将非常方便
目前很难说,但我猜不会。从OpenSSL的wiki页面:
在调用最终EVP_DecryptUpdate时执行标记验证,并通过返回值反映出来:没有调用EVP_DecryptFinal
GCM是一种在线模式,这意味着您可以对其进行流式传输。但是,EVP接口是通用的,它们支持其他经过身份验证的加密模式,如CCM。CCM模式要求预先确定标记的大小,因为它用于格式化标头。CCM是一种离线模式,因为纯文本标签的大小需要事先知道。我正在做一个飞跃,CCM限制所有其他类似模式
此外,OpenSSL是一个SSL/TLS库,而不是一个通用加密库。TLS协商密码套件和标签长度,作为握手协议的一部分。TLS没有您描述的用例,因此不需要OpenSSL来支持它
与此相关,“OpenSSL是一个SSL/TLS库”是库中有时缺少一些好东西的原因。这是一个治理问题
相关问题:EVP\u CTRL\u GCM\u SET\u标签是否在某处正式记录 这个问题的答案是否定的:
$ 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\U CTRL\U GCM\U SET\U标记,则您将看到文件扩展名为*.pod
。pod文件是手册页的来源
但是上面有一些wiki文档。Matt Caswell写的,他是OpenSSL开发者之一。尽管手册页是官方文档,但wiki在这种情况下也同样出色。我不知道答案,但我想分享我对这方面的调查 openssl wiki页面上的示例显示了以下顺序:
EVP_DecryptUpdate(...);
EVP_CIPHER_CTX_ctrl(..., EVP_CTRL_GCM_SET_TAG, ...);
EVP_DecryptFinal(...);
因此,您可能认为这是合法的,但在我的测试中只有一半有效:当我设置了ALTERTED tag时,调用EVP_DecryptFinal_ex表示错误(返回非1),但随后调用ERR_print_errors_cb不会显示任何错误。奇怪