为项目使用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
发布于 2021-12-09 20:12:04
是的,看来你可以在gcrypt.h上找到它
GCRY_MAC_CMAC_AES = 201,在文档这里中。您可以使用gcry_mac_open创建MAC上下文(详见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被添加到一个单独的上下文中。
请注意,GCM是一种使用GMAC的身份验证模式,比CMAC更快,因此使用GCM和CMAC对密文进行身份验证(同样)没有什么意义。如果您希望依赖CMAC (可以使用参数表示它更安全),那么您也可以选择AES-EAX模式;它是使用AES-CTR和AES-CMAC作为原语构建的。
简而言之,GCRY_CIPHER_CBC_MAC不是必需的,而且可能不应该使用;如果您有一个经过身份验证的密码,那么消息的完整性/真实性就已经提供了。
https://stackoverflow.com/questions/70295611
复制相似问题