AEAD 使用关联数据的认证加密

3.发送密文C和标签T 。
接收者:
1.计算认证标签:T'=MAC(K2,C),比较T和T',相等则执行2步骤 。
2.计算明文:P=D(K1,C) 。
【AEAD使用关联数据的认证加密】使用关联数据的认证加密(AEAD)
关联数据:经认证加密处理的任何需要身份验证但不加密的数据 。(例如http请求行、头)
使用关联数据进行认证加密(用AEAD表示)是为了解决想对整个消息完成认证功能,而只对消息的部分实现加密的问题 。例如http报文中只加密body部分 。
加密:AEAD(K,P,A)=(C,A,T),身份认证标签依赖于P和A,且只有在C和A都没有被修改的情况下才会被认证为有效 。
解密:ADAD(K,C,A,T)=(P,A),可以看出无论是密文C损坏还是关联数据A损坏,都无法完成解密 。
如果想保证对同一明文输出的结果是不同的,可以加入nonce参与运算,即:
ADAE(K,P,A,N)
ADAD(K,C,A,T,N)=(P,A)
如果关联数据A为空,AEAD算法就是一个普通的认证加密;如果P是空的,可以当做MAC使用 。

AEAD  使用关联数据的认证加密

文章插图
AES-GCM
AES-GCM基于AES算法,采用了计数器模式(GCM,分组密码的一种工作方式),GCM是对CTR的改进 。
AES-GCM本质上是一种先加密后MAC的结构,其中的AES-CTR使用128比特密钥(K)和96比特nonce(N)进行加密,但它的计数器从1开始而不是0 。
原理如下图:(
表示与H进行多项式乘法)
过程(GHASH是一个通用哈希函数,对应于上图的一系列多项式乘法
):
1.将明文P分组,由密钥K计算认证密钥H=AES(K,0),计算M0=GHASH(H,A1) 。
2.计算C1=AES(K,N || 1)⊕ P1,M1=GHASH(H,C1⊕ M0)
3.计算C2=AES(K,N || 2)⊕ P2,M2=GHASH(H,C2⊕ M1),以此类推,计算到最后一个分组得到Mn 。
4.计算L=len(A) || len(C),计算ML=GHASH(H,L⊕ Mn)
5.计算T=AES(K,N || 0)⊕ ML
到此整个计算过程结束,其中len(A)指的是关联数据A的长度,len(C)指的是密文C的长度 。
GCM使用了- MAC 。它将值AES(K,N || 0)与名为GHASH的通用哈希函数的输出值进行异或 。
GCM没有直接使用K,以确保如果GHASH的密钥被泄露,主密钥K仍然是保密的 。H=AES(K,0),这个过程不可逆,即无法通过H来恢复K 。
多项式乘法
现在有两个多项式(1+X+X^2)和(X+X^3),需要计算它们的的乘积 。首先要对这两个多项式做普通的多项式乘法,计算结果如下(两个X^3项可以相互抵消):
使用模运算来压缩上述结果,即对多项式X+X2+X4+X5作模1+X3+X4运算,返回结果X2 。
因为多项式A+BC模B后等于A(A安全性
AES-GCM容易遭受nonce重放攻击 。如果在两次AES-GCM实现中使用相同的nonce(N),攻击者就可以获得身份认证密钥H,然后可以使用H为任何密文、关联数据或其组合伪造标签 。
标签(T)计算:T=GHASH(H,A,C) ⊕ AES(K,N || 0) 。