5

我正在尝试使用opensslLinux 上的命令行程序获取文件的 AES HMAC。我一直在查看手册页,但不太清楚如何成功地制作 HMAC。enc我可以使用命令加密文件,openssl但是我似乎无法创建 HMAC。加密如下所示:

openssl enc -aes-256-cbc -in plaintext -out ciphertext

任何建议或教程都会很棒

4

2 回答 2

9

您可能会问关于CBC-MAC 的问题。为此,我认为您只需使用 IV 为 0 加密您的消息或文件,然后获取最后一个块(AES256-cbc 为 16 个字节)。 我发现一篇博客文章描述了如何使用 OpenSSL 做到这一点:

openssl enc -e -aes-256-cbc -K 0123456789ABCDEF -iv 0000000000000000 < file | tail -c 16 | od -A n
  • -K是您提供密钥的地方,如果您完全加密它,维基页面说它应该不同于您用来加密文件的密钥。
  • -iv显然提供了一个全零的 IV,这是 CBC-MAC 的关键。
  • tail -c 16获取最后一个 AES256-cbc 块,它是 16 字节长。
  • od是将其转换为十六进制,该网站说这很常见。否则,如果这更适用,od -A n您可以这样做base64,或者完全不使用它,只保留原始字节。

您不能获取文件的 AES HMAC,因为 AES256-cbc 是分组密码,而不是散列算法。AES256-cbc 用于加密和解密文件。HMAC 用于验证文件的完整性,其核心需要哈希算法,例如 SHA-1 或 MD5。

您是在尝试对文件进行签名或验证,还是对其进行加密?要签名,请查看OpenSSL dgst命令并使用简单的 HMAC,如 MD5 或 SHA-1,或者全力以赴并使用 DSS/DSA 对其进行数字签名。

另外,我相信使用分组密码作为 MAC 称为EMAC,但据我所知,OpenSSL 不做 EMAC。EMAC 只获取加密文件的最后一个块并对其进行加密以创建 MAC。

于 2010-04-09T22:47:08.570 回答
2

您可以使用 AES 密钥作为 HMAC 的输入来执行文件的 HMAC。

使用您想要的任何 AES 算法加密文件(在此示例中为 -aes-256-cbc);根据密码生成 AES 密钥(将“密码”更改为您的密码)并使用 -p 开关转储用于加密的盐、密钥和 iv。

openssl enc -e -k password -p -aes-256-cbc -in plaintext -out ciphertext
salt=A2402067B9BFD4A1
key=EB3A88115C30F26C3987F1AB2577DF5B58C80EBEEA623506517FAD843C64E1FC
iv =B382453BCBF579CE14C0726D343F40E2

使用您选择的哈希算法和用于加密文件的 AES 密钥创建任何对象/文件的 HMAC:

openssl dgst -hmac EB3A88115C30F26C3987F1AB2577DF5B58C80EBEEA623506517FAD843C64E1FC -sha256 ciphertext
HMAC-SHA256(ciphertext)= fa3fb9c9c743f35ba81793e2704c3fc9737cd2675011110cb1655ea7ceed2914

如果您需要验证 HMAC,请记住 AES 密钥以供以后使用。请注意,我不知道您要完成什么,也不能声称上述内容符合您的加密要求,但它确实展示了如何加密文件、获取加密密钥以及在 HMAC 计算中使用该加密密钥。

于 2014-02-14T00:38:24.577 回答