【问题标题】:openssl aes gcm encryption with authentication TAG; command lineopenssl aes gcm 加密与认证标签;命令行
【发布时间】:2019-01-01 17:16:51
【问题描述】:

我正在尝试使用 '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:我对通过常用的分布式命令行工具来做这件事很感兴趣,这不是关于编写自己的实用程序的问题

【问题讨论】:

  • 你在最后一段总结了为什么这个问题是题外话——它与编程无关。试试超级用户。

标签: encryption openssl aes aes-gcm


【解决方案1】:

出于好奇,您是如何让 GCM 工作的?

根据支持的密码下的OpenSSL man page

enc 程序不支持经过身份验证的加密模式,例如 CCM 和 GCM,未来将不支持此类模式。

【讨论】:

    【解决方案2】:

    很久没有发布了,但是对于其他人来说:

    说到“常用的命令行工具”,AES GCM 不可用。最接近的可能是AESCRYPT,它具有文档文件格式和多种语言实现的优势。有关详细信息,请参阅 aescrypt.com。

    【讨论】:

      【解决方案3】:

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

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

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


      原始答案,使用 macOS 自带的 LibreSSL openssl 获得:

      使用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
      

      【讨论】:

      • 查看第 341 行,您会看到该版本 (1.0.2n) 提供了一条错误消息。只有通过补丁 g 的 1.0.1 版本存在错误行为——至少在上游;发行版可能不同。 Neardupe stackoverflow.com/questions/27561605/… 另见github.com/openssl/openssl/issues/471
      • 啊,感谢@dave_thompson_085 指出这一点。我没有意识到我在测试时使用的是LibreSSL 2.3.1 版本。我已经更新了我的答案。
      • 嗯...版本控制确实令人困惑。原来我看错了文档。谢谢大家。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      • 2017-10-06
      • 2011-07-05
      • 1970-01-01
      • 2013-01-07
      相关资源
      最近更新 更多