深入了解AES_GCM算法
常见的对称加密算法,在解密过程中无法确认密钥是否正确的。这就意味着,密文可以用任何密钥执行解密运算,得到一组疑似密文;由于不知道密钥是否正确,故也不能确定解密出来的明文数据是否正确。因此,需要在对称加密算法上增加一层验证机制,常见思路为使用加密算法进行加密保证机密性,使用摘要算法计算MAC保证完整性和真实性,这就涉及到摘要计算和加密计算的前后顺序和参与计算的数据、密钥等,使用起来略微麻烦。
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计算
步骤如下:
- 对128位“0”字符串进行加密得到Hash subkey,即上图H;
- 根据IV长度,计算预预处理计数块,
- 经过inc32计算后作为输入与P一起进行GCTR计算得到密文C;
- 根据标准对A||0V||C||0u||[len(A)]64||[len(A)]64进行GHASH计算,得到S;
- 将S、作为输入进行GCTR计算,得到最终的Tag;
- 根据截取要求对Tag进行截断,最终输出C、T。
2.2 认证解密
认证加密需要两个输入:密文(C)和认证Tag(T),输出为明文P或者是特定错误码,例如无效Tag不予解密。
总体流程如下:
GCM解密过程如下:
- 对128位“0”字符串进行加密得到Hash subkey,即上图H;
- 根据IV长度,计算预预处理计数块;
- 根据标准对A||0V||C||0u||[len(A)]64||[len(A)]64进行GHASH计算,得到S;
- 将S、作为输入进行GCTR计算,得到Tag与输入Tag进行比对,如果不一致就返回FAIL,不进行解密;否则进入第四步;
- 经过inc32计算后作为输入与C一起进行GCTR计算得到明文P,最终输出明文P。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)