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:我很感兴趣通过常用分布式命令行工具的方式来做到这一点,这不是关于编写自己的实用程序的问题
注意:正如用户 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)