参考:https://blog.csdn.net/T0mato_/article/details/53160772
相关概念解释:
AES:
设AES加密函数为E,则 C = E(K, P),其中P为明文,K为密钥,C为密文。也就是说,把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C。
AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同。
AES算法属于典型的对称算法。
AES算法具体步骤参考: https://blog.csdn.net/gulang03/article/details/81175854
CTR ( CounTeR 计数器模式):
计数模式(CTR模式)加密是对一系列输入数据块(称为计数)进行加密,产生一系列的输出块,输出块与明文异或得到密文。对于最后的数据块,可能是长u位的局部数据块,这u位就将用于异或操作,而剩下的b-u位将被丢弃(b表示块的长度)。CTR解密类似。这一系列的计数必须互不相同的。
IV:
Initialization Vector, 初始化向量,一般是加密过程初始化产生的随机向量。加密和解密过程需要同一组IV。
MAC:
密文的收发双发需要提前共享一个秘钥。密文发送者将密文的MAC值随密文一起发送,密文接收者通过共享秘钥计算收到密文的MAC值,这样就可以对收到的密文做完整性校验。当篡改者篡改密文后,没有共享秘钥,就无法计算出篡改后的密文的MAC值。
在AES_GCM算法中,MAC又称作TAG
GCM:
GCM ( Galois/Counter Mode) 指的是该对称加密采用Counter模式,并带有GMAC消息认证码。
下图的解释:
Ek | 使用秘钥k对输入做对称加密运算 |
XOR | 异或运算 |
Mh | 将输入与秘钥h在有限域GF(2^128)上做乘法 |
算法详细步骤:
AES_GCM 算法加密过程:
1. AES加密输入:
- IV值 (一般随机产生)
- 密钥
- 明文
- 附加消息Aad: 附加消息不是明文内容, 作AES加密时作为输入,对产生MAC值产生影响.可有可无
2. 算法对明文进行分段,并通过输入的密钥分别与分段的明文作AES对称加密运算, 生成密文
3. 对上一步的每段加密结果, 以及附加消息进行Mh运算. 得到的结果生成MAC值作为验证信息, 再GCM算法中又叫做TAG值
AES_GCM 算法解密过程:
1. AES解密输入:
- IV值 (与加密过程所用的IV值相同)
- 密钥
- 密文
- 附加消息Aad: 与加密过程所用的IAad值相同
- 加密产生的TAG
2. 分别用密钥, 对每段密文进行解密
3. 对Aad和解密结果进程Mh计算生成TAG, 和加密产生的TAG进行比对可以验证加/解密过程的完整性