Aead算法、gcm、ccm介绍
一、Aead介绍
AEAD(authenticated encryption with associated data):关联数据的认证加密,顾名思义,除可提供对密文数据的隐私、完整性和真实性保证外,还可提供对未加密的关联数据的完整性保证。常用的关联数据通常包括消息的长度和消息的编码方式。 AEAD为AE的变种,可让receiver验证所收到消息中已加密和未加密信息的完整性。任何企图将有效加密信息与不同上下文结合的篡改都可通过AEAD发现。
AEAD的实现步骤为:
- 通过密钥key对消息加密,通过增加随机数来保证隐私;
- 计算一个认证标签,通过该认证标签可保证一条消息中加密和未加密的部分均未被篡改。
Aead实现方案:
- EtM (Encryption then MAC)
先加密,然后对密文进行 MAC 运算(一般用各种 HMAC),把二者拼接起来,发给接收方。 接收方先验证 MAC,如果验证通过,则证明密钥是正确的,然后执行解密运算。
- E&M (Encryption and MAC)
同时对原始数据执行加密和 MAC 运算,把二者拼接起来,发给接收方。 接收方先进行解密,然后对解密结果执行 MAC 运算,比对发来的 MAC,验证正确性。
- MtE (MAC then Encryption)
与 EtM 相反,先对原始数据执行 MAC 运算,与原始数据拼接后,执行加密算法,将密文发送给接收方。 接受方先进行解密,然后执行 MAC 运算,验证解密结果是否正确。
常见的Aead算法: 1.AES-128-GCM 2.AES-192-GCM 3.AES-256-GCM 4.ChaCha20-IETF-Poly1305 5.XChaCha20-IETF-Poly1305
二、gcm介绍
GCM(Galois/Counter Mode) GCM中的G就是指GMAC,C就是指CTR。 GCM可以提供对消息的加密和完整性校验,另外,它还可以提供附加消息的完整性校验。在实际应用场景中,有些信息是我们不需要保密,但信息的接收者需要确认它的真实性的,例如源IP,源端口,目的IP,IV,等等。因此,我们可以将这一部分作为附加消息加入到MAC值的计算当中。下图的Ek表示用对称秘钥k对输入做AES运算。最后,密文接收者会收到密文、IV(计数器CTR的初始值)、MAC值。 gcm流程示意图: GCM模式使用两个函数:带密钥的Hash函数GHASH,以及计数器每次增1 的CTR模式的GCTR。 1.GHASH GHASHH(X)函数将Hash密钥H和位串X作为输入,经过转化函数可表示成:
GHASHH(X) = (X1?Hm)⊕(X2?Hm-1)⊕…⊕(Xm-1?H2)⊕(Xm?H)
该式非常适合快速实现,如果使用相同的Hash密钥认证多个消息,那么H2,H3,…能够通过一次预计算来对所有消息进行认证,并且待认证的数据分组(X1,X2,…,Xm)能够并行处理,因为每组计算都相互独立。 2.GCRT inc32(S)函数对S的最右32位增1并取模232,其余位不变。 最后一次加密生成MSB,根据Xn’的长度截取后再与Xn’异或产生Yn’ 3.流程
三、ccm介绍
CCM是Cipher Block Chaining Message Authentication Code (CBC-MAC)和Counter模式(CTR)的组合。可以同时生存认证信息和对数据加密。CCM广泛用于互联网和物联网中对传输数据进行保护。而且很多MCU中都实现了对CCM的硬件支持,使用也比较方便。 在数据通信中,传输中的数据包由两部分构成:数据包头和用户数据(payload)。用户数据一般需要加密以防止窃听。但传输路上的设备(路由器、交换机等)往往需要参照数据包头以保证把数据包能正确地送到目的地,因此数据包头不能加密。网络通信中的风险除了窃听,还有恶意篡改、伪造等其他行为。因此为了保证收到的数据包没有被篡改,需要对整个数据、包括包头进行认证。
CCM加密过程的输入由三部分构成:
- 1、将要被加密和认证的数据,即明文消息P数据块
- 2、将要被认证,但是不需要加密的相关数据A,如协议头等。
- 3、临时量N,作为负载和相关数据的补充,对每条消息N取值唯一,以防止重放攻击等。
数据认证参数
认证过程还需要的参数
- 密钥K
- Nonce N,长度为:15-L。Nonce在一个密钥的使用周期内必须确保唯一。
- 明文信息m,其长度l(m)的范围为0≤l(m)<2^(8L),目的是其长度确保可以由L字节的长度域保存。
- 额外认证数据a(一般为数据包的报头),其长度为l(a),大小范围为:0≤l(a)<2^(64)。这部分数据只认证(Authenticate),不加密。因此也不包含在该模式的输出中。主要是用于认证明文的报头、或影响消息解析的上下文信息。
数据加密 需要进行加密计算的Counter域A_i根据以下方式生成:
Octet Number | Contents |
---|
0 | Flags | 1 … 15-L | Nonce N | 16-L … 15 | Counter i |
其中的Counter i域以most-significant-byte first order形式编码。第一个字节的Flags域由以下bit构成:
Bit Number | Contents |
---|
7 | Reserved (always zero) | 6 | Reserved (always zero) | 5…3 | Zero | 2…0 | L’=L-1,(L:长度域长度,L=1为保留值,禁止使用) |
加密计算后的结果表示为S_i:\
S_i := E( K, A_i ) for i=0, 1, 2, …
将上述加密后的结果S_1, S_2, S_3 … .组合成数据串,并取前l(m)个字节与明文数据m进行XOR操作,得到密文。注意:S_0不用于XOR操作。
最终的认证串的值U则利用S_0计算得到,如下所示:
U := T XOR first-M-bytes( S_0 )
四、相关知识点
以上为今天的算法分享,感谢阅读点赞。
|