在小明和小芳的通信过程中,需要对通信内容进行保密,那就要对通信内容进行加密。所谓数据加密,简而言之,是指将明文(可读的数据)通过特定的算法转换为密文(不可直接读取的数据)的过程。这一转换过程需要用到一个或多个密钥,这些密钥是解密过程中恢复原始明文所必需的。
数据加密的分类
数据加密主要分为两大类:对称加密和非对称加密。近年来,还有一种结合两者优点的混合加密方法逐渐流行。
-
对称加密
含义 :对称加密,又称私钥加密,是指在加密和解密过程中使用相同密钥的加密方法。
应用场景:- 文件加密:个人或企业使用对称加密算法保护敏感文件,如财务报表、客户资料等,因为这些文件的加解密操作频繁,对称加密的高效性成为首选。
- 网络通信:虽然直接用于互联网通信的安全性较低(因为密钥分发困难),但在VPN(虚拟专用网络)和某些安全协议中,对称加密常被用作加密会话内容的手段,以提高传输效率。
- 数据库加密:对于需要频繁读写的大型数据库,对称加密因其高效性而被用于数据加密层,确保数据在存储和传输过程中的安全。
-
非对称加密
含义:非对称加密,又称公钥加密,使用一对密钥------公钥和私钥,公钥用于加密信息,私钥用于解密信息。应用场景:
- 数字签名:发送方使用自己的私钥对信息摘要进行加密,生成数字签名,接收方用发送方的公钥验证签名,确保信息的完整性和发送者的身份真实性。
- 密钥交换:非对称加密常用于安全地交换对称加密的密钥,如SSL/TLS协议中的握手过程,避免了对称密钥直接在网络上传输的风险。
- 数字证书:在电子商务、网上银行等领域,非对称加密用于创建和验证数字证书,确保交易双方的身份安全。
-
混合加密
含义:混合加密结合了对称加密的高效性和非对称加密的安全性,通常先用非对称加密安全地交换对称加密的密钥,然后用对称加密对实际数据进行加密。应用场景:
- 安全通信:如HTTPS协议,它利用TLS/SSL协议,首先通过非对称加密建立安全通道,然后在此通道内使用对称加密进行高效的数据传输。
- 云存储安全:云服务商采用混合加密技术,确保用户数据在上传、存储和下载过程中的安全,既保护了数据机密性,又提高了处理效率。
在本节中,我们重点介绍:对称加密和非对称加密。在此过程中,不介绍具体的加密算法,仅仅从应用者的角度进行介绍。
对称加密
对称加密,指加解密都使用相同秘钥的加密方法。对称加密算法又分为流密码算法和块密码算法。加密速度很快。
- 发送方:将要发送的明文,通过加密算法,设置加密的秘钥,生成明文对应的密文,再将密文在发送出去,尽管在通信过程中被劫持,也是密文。
- 接收方:将接收到的密文,通过与发送方相同的算法,设置与发送方相同的秘钥,进行密文的解密,从而得到相应的明文。
流密码算法
流密码是采用异或XOR运算的到密文,再进行一次异或XOR运算即可得到明文,如下图所示。
流密码算法基于设置的随机数种子(秘钥),生成伪随机秘钥流,与明文进行异或运算即可得到密文。
- 伪随机秘钥流的长度与明文的长度相同,以便与明文进行异或运算。
- 流密码算法需要随机数种子,这个种子就是秘钥,接受者解密也使用相同的随机数种子(秘钥)和相同的流密码算法,即可生成相同的伪随机数秘钥流,再与密文进行异或即可得到明文。
注意: 流密码算法中RC4算法已经证实不安全,不建议使用;ChaCha20算法目前还属于安全算法。
块密码算法
块密码算法,就是发送方要对明文进行分块加密后,再对所有分块组合在一起进行发送;在接收方对各个分块解密后,再将解密后的明文进行组合,形成完整的原始明文。
- 分块的块长度(分组长度),与秘钥的长度没有必然联系。常见的AES128, AES192, AES256中的数字是指的秘钥的长度bit位数;分组长度与具体算法相关,比如AES的分组长度固定是128bits(16Bytes)。
- 在某些分块加密算法模式下,如果明文的长度除以块长度,不是整数倍,需要对明文进行填充,保证数据长度是分块的长度的整数倍。
- 分块算法不是一次性运算完毕的,需要进行多次迭代才能完成。
ECB(Electronic CodeBook)模式
ECB模式是最简单的一种迭代模式,该模式存在安全性问题,不建议使用。
加密
- 将明文分成多个数据块,每个数据块长度相等,且长度等于分组长度。最后一个分块长度不足时,需填充为分块长度相同。
- 分块数据独立,可以并行的进行加密,然后再将分块密文组合在一起即为最终的密文。
- 分块密文与分块明文数据长度相等。
解密
- 将密文拆分为多个数据块,每个数据块的长度等于分组长度,并行的进行解密,再将解密后的明文组合在一起即为原始明文。
注意: 相同的明文和秘钥每次加密的结果都是相同的,这存在很多的安全问题。不建议使用。
CBC(Cipher Block Chaining)模式
CBC模式是一种比较常见的模式,且也是一个安全的对称分块加密模式。
加密
- 将明文分成多个数据块,每个数据块长度相等。最后一个分块长度不足时,需填充为分块长度相同。
- 第一个分块加密前,需要生成一个随机的初始化向量
IV
(Initialization Vector,长度与分组长度相等)。这个初始化向量与第一个分块进行异或XOR运算,在结合秘钥使用加密算法对异或XOR的运算结果进行加密,从而得到第一个分块的密文。 - 后续分块n,使用n-1块的密文替代IV与第n块明文进行异或,再使用秘钥加密,从而得到第n块的密文。因此,加密过程是一个串行加密的过程。
- 将所有分块密文组合在一起即为最终的密文。
- 分块密文与分块明文数据长度相等。
- 初始化向量IV会随着密文一起发送给接收者,且不会被加密。
解密
- 将密文拆分为多个数据块,每个分块的长度与分组长度相等。
- 将每块分块密文数据块,结合秘钥进行解密;第一个解密后的数据块与IV进行异或XOR运算;将密文与解密后的后级数据块进行异或XOR运算。每个解密和异或运算都能并行的运行。
- 将解密后分组明文组合在一起就是完整的明文。
注意:
- 初始化向量
IV
是一个随机数,需要保证是一个真随机,且长度与分组长度相等。 - 初始化向量
IV
必须每次都不一样,保证同样的明文和秘钥最终加密的密文都是不一样的,这样才能避免ECB模式面临的安全问题。 - 数据分块的加密过程,分块之间有关联关系,只要有个数据块稍有变化,就会导致最终结果不一样。
- 加密只能串行,解密可并行。
CTR(Counter)模式
CTR模式是流密码和块密码的结合,也是一个安全的对称分块加密模式。
加密
- 将密文分块,但是在最后一个分块时,可不填充。
- 生成一个秘钥流Nonce(随机值)+计数(根据分块个数以此累加),先通过算法对其进行加密,生成相应的密文。
- 用每个秘钥流生成的密文与每个分块明文进行异或XOR运算,得到分块的密文。
- 秘钥流Nonce(随机值)随密文一起发送给接收者,且不加密。
- 加密和异或XOR运算都可并行。
解密
- 将密文分块,但是在最后一个分块时,可不填充。
- 先根据发送者给的秘钥流Nonce(随机值)+计数,结合秘钥进行加密,生成每个分块的秘钥流的密文。
- 对每个分块密文与相应分块的秘钥流进行异或XOR运算,得到分块明文,组成完整的明文。
- 解密和异或XOR运算都可并行。
**注意:**每次的秘钥流都要生成不一样的,保证同样明文和秘钥加密的密文都不同,提高CTR的安全性。
总结
模式 | 特点 | 说明 |
---|---|---|
ECB模式 | 加解密可并行;需要填充 | 不安全,不推荐 |
CBC模式 | 加密串行,解密并行;加解密分块间有关联性;需要填充 | 安全,推荐 |
CTR模式 | 加解密可并行;加解密分块间无关联性;无需填充 | 安全,推荐 |
非对称加密
非对称加密,使用公钥-私钥进行加解密。有两种:
- 公钥加密,只能使用对应的私钥解密:秘钥交换;
- 私钥加密,只能使用对应的公钥解密:数字签名和数字证书。
私钥: 其实就是一个极其大且很随机的一个数,只能被持有者秘密保存,不能被泄漏,因此称为私钥。
公钥: 是由私钥推算出来的一个很大的数。只能从私钥推算出公钥,单向的推算。公钥可以公开为大家所熟知,因此称为公钥。
公钥加密,私钥解密
发送者使用公开的公钥进行加密,接收者将密文用私钥进行解密。因为公钥是可以公开分发的,这就解决了对称加密中秘钥分发困难的问题 。
私钥加密,公钥解密
发送者使用私有的私钥进行加密,接收者将密文用公钥进行解密。
因为公钥是大家所熟知的,因此发送者使用私钥加密的密文,公钥持有者都能解密。在这一过程中,加解密不是其主要用途,因为私钥只有相应私钥的持有者才能使用,因此私钥也代表了一种身份,只要是公钥能解密的信息,那就可以明确是由私钥持有者发送的信息。
基于以上所述,私钥加密,公钥解密主要用于数字签名和数字证书(后续章节介绍)。