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

标签 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`

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

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

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

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

最佳答案

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

The enc program does not support authenticated encryption modes like CCM and GCM. The utility does not store or retrieve the authentication tag.



我想这回答了你的问题——这取决于你使用的是哪个版本的 OpenSSL。

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

使用 openssl enc 时,GCM 标签不会存储在输出文件中应用程序。您可以从以下单行中看到:
$ 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 来查看它。 .它没有做任何 EVP_CIPHER_CTX_ctrl()调用处理 GCM 标记,如 OpenSSL Wiki page on 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

关于encryption - openssl aes gcm 加密,带身份验证标签;命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51509530/

相关文章:

java - 使用与 Java 加密相同的公钥进行解密

c - 有没有办法用只有 pem 公钥文件或 pem 私钥文件的 RSA 进行加密和解密?

c - 如何导出使用 CryptoAPI 派生的 AES key

ios - iOS 中 256 block 大小的 AES 256 位加密

java - Pdfbox 签名和保护,无需保存在文件系统中

scala - 加密字符串时生成数字

ios - 在钥匙串(keychain)中存储用于加密密码的 key 的最佳位置在哪里?

openssl - 从现有证书生成 CSR

c++ - Openssl EVP "EVP_CTRL_GCM_GET_TAG"失败

java - 字符串加密有效,byte[]数组类型加密无效