zoukankan      html  css  js  c++  java
  • CCM和GCM

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

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

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

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

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

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

      

       

      由计数器产生大量的Ctri

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

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

      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、整个认证函数结构

      

      (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长度

  • 相关阅读:
    Linux用过的命令集合
    Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第十一集之安装FastDFS】
    Linux常见目录的作用
    Linux安装Tomcat-Nginx-FastDFS-Redis-Solr-集群——【第十集之Nginx反向代理原理】(有参考其他文章)
    Python socket编程之三:模拟数据库循环发布数据
    Python socket编程之二:【struct.pack】&【struct.unpack】
    Python socket编程之一:
    分时图设计
    统计一段时期内股票的涨幅情况
    iOS开发之手势识别汇总
  • 原文地址:https://www.cnblogs.com/block2016/p/5635462.html
Copyright © 2011-2022 走看看