1.为什么引入AEAD?

        常见的对称加密算法,在解密过程中无法确认密钥是否正确的。这就意味着,密文可以用任何密钥执行解密运算,得到一组疑似密文;由于不知道密钥是否正确,故也不能确定解密出来的明文数据是否正确。因此,需要在对称加密算法上增加一层验证机制,常见思路为使用加密算法进行加密保证机密性,使用摘要算法计算MAC保证完整性和真实性,这就涉及到摘要计算和加密计算的前后顺序和参与计算的数据、密钥等,使用起来略微麻烦。

        那有没有方式只使用了一个密码算法就能实现上述功能,当然可以,这就是AEAD(Authenticated encryption with associated data)。(RFC 5116:An Interface and Algorithms for Authenticated Encryption)

        AEAD包含如下算法:AEAD_AES_128\256_GCM、AEAD_AES_128\256_CCM

2.AES_GCM

        GCM全称Galois/Counter Mode,服务对称密码体制,分组大小为128位;它使用CTR的一种变体(GCTR)来保证数据的机密性(用于加密),使用伽罗华域(即有限域)下定义的hash函数(GHASH)来保证数据的完整性。

        如果GCM的输入被限制为不进行加密,那么就只会对输入数据进行完整性和身份验证,这就是所谓的GMAC。

        AES_GCM的两大功能就是认证加密(Authenticated Encryption )和认证解密(Authenticated Decryption)。

2.1 认证加密

        认证加密功能需要四个输入:

  • 明文,简称P;
  • 额外认证数据(AAD),简称A;
  • 初始向量(IV)
  • 密钥Key

        对于IV,建议将实现限制为96位长度,以提升操作性、效率和设计的简单性。

        认证加密输出包括密文(C)和认证tag(T),其中Tag长度可以为2、4、6、8、10、12、14、16。

        总体流程如下图:

  • INCs表示特定单调递增函数,公式如下:

  • GCTRk表示对给定Key的加密块进行GCTR加密;
  • GHASHk表示对数据进行GHASH计算

        步骤如下: 

  1. 对128位“0”字符串进行加密得到Hash subkey,即上图H;
  2. 根据IV长度,计算预预处理计数块J_{0}
  3. J_{0}经过inc32计算后作为输入与P一起进行GCTR计算得到密文C;
  4. 根据标准对A||0V||C||0u||[len(A)]64||[len(A)]64进行GHASH计算,得到S;
  5. 将S、J_{0}作为输入进行GCTR计算,得到最终的Tag;
  6. 根据截取要求对Tag进行截断,最终输出C、T。

2.2 认证解密

        认证加密需要两个输入:密文(C)和认证Tag(T),输出为明文P或者是特定错误码,例如无效Tag不予解密。

        总体流程如下:

        GCM解密过程如下:

  1. 对128位“0”字符串进行加密得到Hash subkey,即上图H;
  2. 根据IV长度,计算预预处理计数块J_{0}
  3. 根据标准对A||0V||C||0u||[len(A)]64||[len(A)]64进行GHASH计算,得到S;
  4. 将S、J_{0}作为输入进行GCTR计算,得到Tag与输入Tag进行比对,如果不一致就返回FAIL,不进行解密;否则进入第四步;
  5. J_{0}经过inc32计算后作为输入与C一起进行GCTR计算得到明文P,最终输出明文P。

 

 

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐