12. 消息认证码(MAC)
- 针对消息认证的可能攻击:泄露、通信量分析、伪装、内容(序列、计时)修改、发送(接收)方否认。
- 定义消息认证码:消息和密钥的函数,它生成一个定长的值作为认证符。
- HMAC: M A C = H ( S o ∣ ∣ H ( S i ∣ ∣ M ) ) MAC =H(S_o || H(S_i || M)) MAC=H(So∣∣H(Si∣∣M))
- CMAC:消息填充、子密钥生成、消息加密、哈希值计算
- 认证加密的概念:同时提供通信==保密性和认证(完整性)==的加密系统
- CCM:
- 步骤
- 消息分块与填充
- 计算MAC
- 加密
- 计算认证标签
- 特点:
- 实现简单
- 速度快
- 安全性高
- 步骤
- GCM:
- 特点
- 加密速度快
- 保证数据完整性
- 安全性高
- 步骤
- 初始化向量和计数器
- 加密
- 计算认证标签
- 特点
- 密钥封装的概念及用途:
- 用哈希函数或消息认证码生成随机数的方式:
12.1 消息认证要求
消息认证可以验证收到的消息确实来自发送方,并且未被修改。
针对网络通信的攻击:
- 泄露:消息透露给没有合适密钥的人或程序。
- 通信量分析:
- 对面向连接的应用:连接的频率和持续时间可被确定。
- 对面向连接或无连接的环境:双方的消息数量和长度可被确定。
(消息认证解决)
-
伪装:欺诈源 向网络插入一条消息 给接收方用作欺诈应答。
-
消息修改:
- 内容修改:对消息内容的修改。
- 序列修改:对消息序列修改。(插入、删除、重排)
- 计时修改:对消息的延时或重放
-
否认:
- 发送方否认(数字签名解决)
- 接收方否认(数字签名以及协议)
12.2 消息认证码
算法基本思想: M A C = C ( K , M ) MAC = C(K,M) MAC=C(K,M) (K为共享密钥,M为消息,C为MAC函数)
算法步骤:
- A将发给B的消息和A、B之间的共享密钥K通过MAC函数 M A C = C ( K , M ) MAC = C(K,M) MAC=C(K,M) 生成MAC值。
- A将消息和MAC值明文(或加密后获得的密文)一并发送给B。
- B接收到后用K对消息进行相同的函数 M A C = C ( K , M ) MAC = C(K,M) MAC=C(K,M) 得出结果。
- 两次计算的MAC值相等,表明:
- 消息未被篡改。
- 发送方可信。
- 消息顺序正确。
MAC函数和加密函数区别:
- MAC算法不要求可逆,加密算法要求可逆。
- MAC函数为多对一函数。
- 定义域为:任意长的消息。 值域:所有可能的MAC和密钥。
12.3 HMAC(Hash MAC)
使用单向散列函数构造消息认证码。(HMAC-SHA-256,HMAC-SHA-512)
安全性依赖于哈希函数的强度。
算法步骤:
- 密钥填充:
- 在密钥 K K K 左边填充 0,得到 b 位的 K + K^+ K+ 。
- $ S_i = K^+ \oplus ipad$ . ( i p a d ipad ipad 为 00110110 重复 b/8 次的结果)
- 将消息 M M M 附在 S i S_i Si 后面形成 ( S i ∣ ∣ M ) (S_i ||M) (Si∣∣M)。
- 通过哈希函数 H H H 得到 H ( S i ∣ ∣ M ) H(S_i || M) H(Si∣∣M)。
- $ S_o = K^+ \oplus opad$ . ( o p a d opad opad 为 01011100 重复 b/8 次的结果)
- 通过哈希函数 H H H 得到 H ( S o ∣ ∣ H ( S i ∣ ∣ M ) ) H(S_o || H(S_i || M)) H(So∣∣H(Si∣∣M))。
12.4 CMAC(Cipher MAC)
基于密码的消息认证码。(AES、DES、3DES)
算法步骤:
- 消息填充:若消息长度不是块大小的整数倍,将额外数据填充到消息末尾,1000…000。
- 子密钥生成:使用密钥 K K K 和加密算法生成子密钥。
- 加密消息块:使用相应的子密钥和前一步得到的中间值 M i M_i Mi 加密。
- 计算哈希值:使用最后一个 M n M_n Mn 计算最终哈希值。
子密钥生成*:使用密钥
K
K
K 和加密算法生成子密钥。
3. 加密消息块:使用相应的子密钥和前一步得到的中间值
M
i
M_i
Mi 加密。
4. 计算哈希值:使用最后一个
M
n
M_n
Mn 计算最终哈希值。