消息认证码是一种认证技术,它利用密钥来生成一个固定长度的端数据块,并将该数据块附加在消息之后。通信中,消息和MAC一起被发给接收方,接收方利用收到的信息及密钥进行计算,若得到新的MAC值和接受到的值相等,则认为
1)接收到的信息未被篡改:因攻击者没有密钥,故篡改信息之后,得不到对应的MAC值。(消息的完整性保护)
2)接收到的消息来自真正的发送方:攻击者没用密钥,不能生成MAC值。(保证信息的合法性)
通常有基于HASH函数的MAC,我们成为HMAC。以及基于分组密码的MAC,我们成为CMAC。
之前在openssl0.9.8中还不支持CMAC,而现在的最新版开始支持CMAC了,我目前下载了两个版本openssl-1.0.1c 及openssl-1.0.1e 中都支持。而HMAC在openssl-0.9.8 中就已经支持。下面首先简单介绍一下HMAC及CMCA的区别。
1,HMAC (keyed-hash message authentication code)
HAMAC 最主要的目的是用来保证消息的完整性。HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。HMAC 的生成如图所示(weiki):
2,CMAC
CMAC客服了DAA的缺点,CMAC的生成过程如下图:
3,openssl中的实现
openssl的crypto目录下有hmac和cmac两个目录分别实现了hmac和CMAC 其调用也非常简单,基本上按顺序调用下面几个函数即可,HMAC和CMAC调用基本类似。
CMAC_CTX *CMAC_CTX_new(void);
int CMAC_Init(CMAC_CTX *ctx, const void *key, size_t keylen,
const EVP_CIPHER *cipher, ENGINE *impl);
int CMAC_Update(CMAC_CTX *ctx, const void *data, size_t dlen);
int CMAC_Final(CMAC_CTX *ctx, unsigned char *out, size_t *poutlen);
void CMAC_CTX_free(CMAC_CTX *ctx);
4,opnenssl对认证加密的支持
认证加密指在通信中同时提供保密性和认证(完整性)的加密系统。常见的同时提供认证和加密的通用方案有如下四种:
1)HtE:先hash再加密
2)MtE:先MAC再加密
3)EtM:先加密在MAC
4)E&M:加密并且MAC
现在可以在openssl中发现evp_aes_***_ccm和evp_aes_***_gcm。这就是实现认证加密的两个方案。而CCM可以看成是E&M方案的改进。