openssl aes gcm 加密,带身份验证标签;命令行

use*_*812 5 encryption openssl aes aes-gcm

我正在尝试使用 'openssl' th/ 命令行以 AES-GCM 模式加密文件

openssl enc -aes-256-gcm -p -iv 000000000000000000000000 -K 00000000000000000000000000000000000000000000000000000000000000 -nosalt -in file.raw -out file.enc`
Run Code Online (Sandbox Code Playgroud)

加密有效,但我找不到检索生成的 GCM 标签的方法。 有没有办法得到它?

在本文档(链接)中,我发现“请注意,现在甚至可以使用 CCM 或 GCM 等身份验证模式”,但仍然没有信息如何做到这一点。

或者是否有任何其他标准的 macos 工具可以完成相同的工作?


PS:我很感兴趣通过常用分布式命令行工具的方式来做到这一点,这不是关于编写自己的实用程序的问题

Rei*_*eek 4

注意:正如用户 dave_thompson_085 在下面指出的那样,答案其余部分的结果与当前版本的 OpenSSL 无关。我不小心使用了 LibreSSL openssl阅读该enc工具的当前版本的OpenSSL 文档,其中包含以下句子

enc 程序不支持 CCM 和 GCM 等经过身份验证的加密模式。该实用程序不存储或检索身份验证标签。

我想这回答了您的问题 - 取决于您使用的 OpenSSL 版本。


openssl原始答案,通过 macOS 附带的LibreSSL 获得:

使用应用程序时,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
Run Code Online (Sandbox Code Playgroud)

输出的大小与输入的大小完全相同,任何地方都没有标签字节。

您还可以通过检查enc.c 的实现来查看它。它不会执行任何EVP_CIPHER_CTX_ctrl()调用来处理 GCM 标记,如OpenSSL Wiki 页面上有关 EVP 验证的加密和解密 的说明。换句话说,标签数据丢失了。

使用 解密时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
Run Code Online (Sandbox Code Playgroud)