对称加密算法概念
在密码学中,加密算法按照实现方式可分为对称加密算法和非对称加密算法。
对称加密算法指的是加密方和解密方使用相同的密钥进行加密和解密,即双方使用共同的密钥。在对称加密算法使用的过程中,数据发送方将明文数据通过密钥进行加密生成密文数据,将密文数据发送给接收方,接收方收到密文数据后,通过密钥进行解密,将其恢复成明文数据。这就要求接收方要首先知道密钥,这需要发送方先将密钥通过安全方式发给接收方,通常会使用非对称加密例如ECDH算法来传输密钥(非对称密钥会在下章讲解)。
目前最常用的对称加密算法就是AES算法,当然还有RC算法等,但物联网方面不太常用,其他的例如des算法已经被攻破,渐渐退出历史舞台。
对称加密算法优缺点
对称加密算法的优点是算法计算量小,加解密速度快,效率高。缺点是数据传送前,发送方和接收方必须先协商好密钥,发送方将密钥发送给接收方,并保存好,一旦密钥泄露,数据就不再安全了。因此对称加密算法的密钥传输和密钥管理才是关键。
一个系统的安全性不在于它的算法对于对手来说是保密的,而是应在于它所选择的密钥对于对手来说是保密的。系统的安全性不依赖于算法的保密性,而依赖于密钥的安全性。
对称加密算法单次只能处理固定长度的分组数据,例如AES-128算法单次只能加密或解密128位数据,即16个字节,而实际应用场景中需要加密或解密的消息长度并不一定是16字节,为了解决这种问题,需要引入分组密钥模式和消息填充方法。
分组密码模式
如果要加密的消息超过了对称加密算法规定的固定长度,需要对明文消息进行分组处理,不同的分组密码模式有着不同的计算过程,安全性也存在差异。本节将介绍几种常用的模式,分别为ECB模式、CBC模式、CTR模式。
ECB模式
ECB模式称为密码本模式,是最简单的分组密码模式,其思想就是将明文数据进行分组加密,以aes-128为例,每组为16个字节,不足则通过填充方法进行补齐(填充方法下面会讲到),加密结果为密文分组,每个分组之间项目独立,每组的明文与密文之间存在着一一对应关系。ECB模式虽然非常简单,但是由于存在明显的缺点,所以在实际项目中往往不会使用。
CBC模式
CBC模式称为密码分组链接模式,每一组的明文在加密前与之前的分组进行异或操作,由于第一个分组明文前面没有密文分组,所以需要准备一个与密文分组长度相等的比特序列来代替密文分组,这个比特序列被称为初始化向量,通常简写为IV。 CBC模式在实际项目中是非常常用的。CBC模式如果消息长度不是分组的整数倍,也是需要进行消息填充的。
CTR模式
CTR模式称为计数器模式,CTR模式使用与分组长度相同的技术支持参与运算,典型的实现方法是通过对逐次累加的计数器进行加密来生成密钥流,通过加密计数器得到的密钥流与明文分组进行异或运算,得到密文分组。
CTR模式是不需要对明文进行填充的,并且CTR模式只需要加密算法,而不需要解密算法,这点与上面的ECB和CBC模式相比有很大的优势,因为CTR模式的本质是对计数器加密,而不是对数据加密。
消息填充方案
分组密码模式中ECB、CBC模式都要求输入明文长度为分组密码长度的整数倍。当加密明文长度不是分组密码长度的整数倍时,需要对明文进行填充。在实际应用中,常用的填充方案是PKCS7。
PKCS7填充方法非常简单,以AES-CBC算法为例,分组长度为16字节,若待加密明文长度为28个字节,则需要在明文末尾填充4个字节的0x04,使其达到分组长度的整数倍;若待加密数据恰好为16字节,需要在明文后面额外填充16字节,并将其全部填充为16。
模式 | 优点 | 缺点 | 备注 |
---|---|---|---|
ECB模式(密码本模式) | 简单快速、支持并行加解密 | 密文分组相互独立,通过删除、替换密文分组可以修改明文。 不能抵御重放攻击。 |
不应使用 |
CBC模式(分组链接模式) | 安全性高,即使获取到秘钥也不能单独解密某一组数据 | 加密不支持并行计算 | 推荐使用 |
CTR模式 (计数器模式) | 不需要填充 不需要解密算法 可随机访问任意分组 支持并行计算,效率较高 |
主动攻击者反转密文分组中的某些比特时,明文分组中对应的比特也会被反转 | 推荐使用 |