CCM和GCM

分组密码链接-消息认证码--CCM     Counter with CBC-MAC

  组成CCM的关键算法是AES加密算法、CTR工作模式和CMAC认证算法,在加密和MAC算法中共用一个密钥K。

  CCM加密过程的输入由三部分构成:

    1、将要被加密和认证的数据,即明文消息P数据块

    2、将要被认证,但是不需要加密的相关数据A,如协议头等。

    3、临时量N,作为负载和相关数据的补充,对每条消息N取值唯一,以防止重放攻击等。

  CCM和GCM_第1张图片

   CCM和GCM_第2张图片

  由计数器产生大量的Ctri

 

Galois/计数器模式--GCM     Galois/Counter Mode

   GCM基于并行化设计,可以提供高效的吞吐率和低成本、低延迟。其本质是消息在变型的CTR模式下加密,密文结果与密钥以及消息长度信息在GF(2128)域上相乘。该标准还同时制定了仅支持MAC的工作模式即GMAC。

  GCM模式使用两个函数:带密钥的Hash函数GHASH,以及计数器每次增1 的CTR模式的GCTR。

  1、GHASH

  CCM和GCM_第3张图片    

  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

   CCM和GCM_第4张图片

  inc32(S)函数对S的最右32位增1并取模232,其余位不变。

  最后一次加密生成MSB,根据Xn'的长度截取后再与Xn'异或产生Yn'

  3、整个认证函数结构

  CCM和GCM_第5张图片

  (1)令 H = E(K , 0128)

  (2)定义分组J0如下

    如果len(IV) = 96,则令J0 = IV || 031 || 1。

    如果len(IV) ≠ 96,则令 s = 128⌈len(IV)/128⌉ - len(IV)   

      并令J0 = GHASHH(IV || 0s+64 || [len(IV)64])    //[s+64+len(IV)]%64 = 0,说白了就是使输入满足刚好可分整数组的长度

  (3)令C = GCRTK(inc32(J0) , P)

  (4)令u = 128⌈len(C)/128⌉ - len(C)     v = 128⌈len(A)/128⌉ - len(A)   //目的也是为了满足分组长度

  (5)定义分组S如下

      S = GHSASHH(A || 0v || C || ou || [len(A)]64 || [len(C)64])

  (6)令 T = MSBt(GCTRK(J0 , S)),这里t是支持的MAC长度

 

你可能感兴趣的:(CCM和GCM)