1

为项目使用 libgcrypt,使用以下设置打开密码句柄:

GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_GCM, GCRY_CIPHER_CBC_MAC

根据 libgcrypt 文档:

GCRY_CIPHER_CBC_MAC:计算 CBC-MAC 密钥校验和。这与CBC模式相同,但只输出最后一个块。不能与 GCRY_CIPHER_CBC_CTS 同时使用。

从研究和阅读来看,“CBC_MAC”与 CMAC 不同。但是,如果 libgcrypt 支持 CMAC,我不能完全从文档中获得?有人可以澄清一下 CMAC 是否是 libgcrypt 中的一个选项吗?这里有一个模式列表,没有明确列出 CMAC:

https://www.gnupg.org/documentation/manuals/gcrypt/Available-cipher-modes.html

4

1 回答 1

1

是的,您似乎可以在以下位置找到它gcrypt.h

GCRY_MAC_CMAC_AES           = 201,

并在此处的文档中。您可以使用创建 MAC 上下文gcry_mac_open(有关详细信息,请参阅 gcrypt.pdf)。

您还可以在cipher.h其中找到您正在寻找的功能,但毫无疑问,使用上面的常量(而不是特定模式下的密码)创建 MAC 上下文会更好。

内部危险品:

/*-- cipher-cmac.c --*/
gcry_err_code_t _gcry_cmac_generate_subkeys
/*           */ (gcry_cipher_hd_t c, gcry_cmac_context_t *ctx);
gcry_err_code_t _gcry_cmac_write
/*           */ (gcry_cipher_hd_t c, gcry_cmac_context_t *ctx,
         const byte * inbuf, size_t inlen);
gcry_err_code_t _gcry_cmac_final
/*           */ (gcry_cipher_hd_t c, gcry_cmac_context_t *ctx);
void _gcry_cmac_reset (gcry_cmac_context_t *ctx);

我猜发生的事情是 libgcrypt 刚开始使用 CBC-MAC 作为一种特殊的密码模式,之后使用单独的上下文添加了其他 MAC。


请注意,GCM 是一种使用 GMAC 的身份验证模式,它比 CMAC 更快,因此使用 GCM 和 CMAC 来验证密文(再次)意义不大。如果您想依赖 CMAC(可以说它更安全),那么您也可以选择 AES-EAX 模式;它是使用 AES-CTR 和 AES-CMAC 作为原语构建的。

简而言之GCRY_CIPHER_CBC_MAC,不是必需的,也可能不应该使用;如果您有经过身份验证的密码,则已经提供了消息完整性/真实性。

于 2021-12-09T20:12:04.240 回答