注意:正如用户 dave_thompson_085 在下面指出的那样,答案其余部分的结果与当前版本的 OpenSSL 无关。我不小心使用了 LibreSSLopenssl
。阅读当前版本OpenSSL 文档enc tool https://www.openssl.org/docs/man1.1.0/apps/openssl-enc.html,它包含以下句子
enc 程序不支持经过身份验证的加密模式,例如
CCM 和 GCM。该实用程序不存储或检索身份验证
标签。
我想这回答了您的问题 - 取决于您使用的 OpenSSL 版本。
原始答案,通过 LibreSSL 获得openssl
macOS 附带:
使用时,GCM 标记不会存储在输出文件中openssl enc
应用程序。您可以从下面的一行字中看到这一点:
$ echo -n 'abcdefghijklmnop' | openssl enc -aes-256-gcm -K 0 -iv 0 | hexdump -C
00000000 af c5 23 59 28 06 0c 06 6e 24 ae bf d7 9d f2 68 |..#Y(...n$.....h|
00000010
输出的大小与输入的大小完全相同,任何地方都没有标签字节。
您还可以通过检查实现来看到它enc.c https://github.com/openssl/openssl/blob/OpenSSL_1_0_2n/apps/enc.c#L648。它不做任何事EVP_CIPHER_CTX_ctrl()
调用来处理 GCM 标签,如中所述有关 EVP 验证加密和解密的 OpenSSL Wiki 页面 https://wiki.openssl.org/index.php/EVP_Authenticated_Encryption_and_Decryption。换句话说,标签数据丢失了。
解密时使用aes-256-gcm
,该工具本身也会忽略标签的缺失。一个消息bad decrypt
被发射到stderr
但这似乎来自与应用程序不同的层,应用程序愉快地打印结果:
$ echo -n 'abcdefghijklmnop' | openssl enc -aes-256-gcm -K 0 -iv 0 | openssl enc -aes-256-gcm -K 0 -iv 0 -d
bad decrypt
abcdefghijklmnop