加密算法是用于将可读数据(称为明文)转换为不可读数据(称为密文)的数学函数。这个过程称为加密,目的是保护数据的机密性,防止未经授权的访问。解密则是将密文转换回明文的过程,只有拥有正确密钥的人才能进行解密。
加密算法可以分为多种类型,主要包括以下几类:
1. 对称加密算法 (Symmetric-key Algorithms)
- 特点: 加密和解密使用相同的密钥。
- 优点: 加密速度快,效率高。
- 缺点: 密钥管理困难,需要安全地共享密钥。
- 常见算法:
- AES (Advanced Encryption Standard): 目前最常用的对称加密算法,安全性高,速度快。
- DES (Data Encryption Standard): 较老的算法,密钥长度较短,安全性较低,已被AES取代。
- 3DES (Triple DES): 对DES的改进,使用三个密钥进行加密,安全性比DES高,但速度较慢。
- RC4 (Rivest Cipher 4): 流加密算法,速度快,但存在安全漏洞,不推荐使用。
- ChaCha20: 流加密算法,速度快,安全性高,逐渐取代RC4。
- Blowfish: 块加密算法,速度快,安全性高,开源。
2. 非对称加密算法 (Asymmetric-key Algorithms)
- 特点: 加密和解密使用不同的密钥,一个公钥和一个私钥。
- 优点: 密钥管理方便,不需要提前共享密钥。
- 缺点: 加密速度慢,效率低。
- 常见算法:
- RSA (Rivest-Shamir-Adleman): 最常用的非对称加密算法,可用于加密和数字签名。
- ECC (Elliptic Curve Cryptography): 基于椭圆曲线数学的加密算法,安全性高,密钥长度较短,适合移动设备。
- DSA (Digital Signature Algorithm): 用于数字签名,不用于加密。
- ElGamal: 基于离散对数问题的加密算法,常用于密钥交换。
3. 哈希算法 (Hash Algorithms)
- 特点: 将任意长度的数据转换为固定长度的哈希值(也称为摘要或指纹)。
- 优点: 单向函数,无法从哈希值反推出原始数据。
- 缺点: 不能用于加密,主要用于数据完整性校验和密码存储。
- 常见算法:
- SHA-256 (Secure Hash Algorithm 256-bit): 常用的哈希算法,安全性高。
- SHA-512 (Secure Hash Algorithm 512-bit): 比SHA-256更安全的哈希算法。
- SHA-3 (Secure Hash Algorithm 3): 新一代哈希算法,安全性高。
- MD5 (Message Digest Algorithm 5): 较老的哈希算法,存在安全漏洞,不推荐使用。
- bcrypt: 用于密码哈希的算法,安全性高。
- scrypt: 用于密码哈希的算法,安全性高。
加密算法的应用场景:
- 数据传输安全: 加密网络通信(HTTPS, TLS/SSL),保护在线交易、电子邮件等。
- 数据存储安全: 加密硬盘、数据库、云存储等,防止数据泄露。
- 身份验证: 使用数字签名验证身份,防止伪造。
- 密码存储: 使用哈希算法存储密码,防止密码泄露。
- 数字版权管理 (DRM): 保护数字内容,防止盗版。
选择合适的加密算法:
选择合适的加密算法需要考虑以下因素:
- 安全性: 算法的强度和抗攻击能力。
- 速度: 加密和解密的速度。
- 密钥管理: 密钥的生成、存储和分发。
- 应用场景: 不同的应用场景对算法的要求不同。
HTTPS 的“四次握手”实际上指的是 TLS/SSL 握手过程,它发生在 TCP 三次握手之后,是建立安全 HTTPS 连接的关键步骤。这个过程并非严格意义上的“四次握手”,更准确地说是多次消息交换,但为了方便理解,通常将其简化为四个主要阶段。
TLS/SSL 握手过程的四个主要阶段(简化版):
-
Client Hello (客户端问候):
- 客户端(浏览器)向服务器发送一个
Client Hello
消息。 - 这个消息包含:
- TLS/SSL 版本: 客户端支持的 TLS/SSL 版本列表 (例如 TLS 1.2, TLS 1.3)。
- 随机数 (Client Random): 客户端生成的随机数,用于后续密钥生成。
- 加密套件列表 (Cipher Suites): 客户端支持的加密算法列表,包括对称加密算法、非对称加密算法和哈希算法。
- 其他扩展信息: 例如,会话恢复信息等。
- 客户端(浏览器)向服务器发送一个
-
Server Hello (服务器问候):
- 服务器收到
Client Hello
消息后,会向客户端发送一个Server Hello
消息。 - 这个消息包含:
- 选择的 TLS/SSL 版本: 服务器选择的 TLS/SSL 版本,通常是客户端支持的最高版本。
- 随机数 (Server Random): 服务器生成的随机数,用于后续密钥生成。
- 选择的加密套件 (Cipher Suite): 服务器从客户端提供的列表中选择的加密套件。
- 服务器证书 (Server Certificate): 服务器的数字证书,包含服务器的公钥和身份信息。
- 其他扩展信息: 例如,会话恢复信息等。
- 服务器收到
-
Authentication and Key Exchange (身份验证和密钥交换):
- 客户端验证服务器证书: 客户端会验证服务器证书的有效性,包括:
- 证书链: 验证证书是否由受信任的根证书颁发机构 (CA) 签名。
- 证书有效期: 验证证书是否在有效期内。
- 证书域名: 验证证书中的域名是否与请求的域名匹配。
- 密钥交换:
- RSA 密钥交换 (传统方式): 客户端生成一个预主密钥 (Pre-master Secret),使用服务器的公钥加密后发送给服务器。服务器使用私钥解密得到预主密钥。
- Diffie-Hellman (DH) 或 Elliptic-Curve Diffie-Hellman (ECDH) 密钥交换 (更安全的方式): 客户端和服务器通过 DH 或 ECDH 算法协商生成一个共享的秘密,无需传输预主密钥。
- 生成主密钥 (Master Secret): 客户端和服务器都使用 Client Random、Server Random 和预主密钥 (或 DH/ECDH 共享秘密) 生成主密钥。
- 生成会话密钥 (Session Keys): 客户端和服务器都使用主密钥生成会话密钥,包括加密密钥和 MAC 密钥。
- 客户端验证服务器证书: 客户端会验证服务器证书的有效性,包括:
-
Change Cipher Spec and Finished (更改密码规范和完成):
- Change Cipher Spec: 客户端和服务器分别发送
Change Cipher Spec
消息,通知对方后续通信将使用协商好的加密套件和会话密钥。 - Finished: 客户端和服务器分别发送
Finished
消息,使用会话密钥加密,并包含之前所有握手消息的哈希值,用于验证握手过程的完整性。
- Change Cipher Spec: 客户端和服务器分别发送
简化总结:
- 客户端说:“你好,我支持这些加密方式。” (Client Hello)
- 服务器说:“你好,我选择这个加密方式,这是我的证书。” (Server Hello)
- 客户端验证证书,并和服务器协商一个秘密,双方用这个秘密生成密钥。 (Authentication and Key Exchange)
- 双方说:“我们都准备好用密钥加密通信了。” (Change Cipher Spec and Finished)
重要概念:
- TLS/SSL 版本: TLS (Transport Layer Security) 是 SSL (Secure Sockets Layer) 的后继者,目前常用的是 TLS 1.2 和 TLS 1.3。
- 加密套件 (Cipher Suite): 定义了加密算法、密钥交换算法和哈希算法的组合。
- 数字证书: 用于验证服务器身份,包含服务器的公钥和身份信息。
- 会话密钥: 用于加密后续数据传输的对称密钥。
TLS 1.3 的改进:
TLS 1.3 对握手过程进行了简化,减少了消息交换的次数,提高了握手速度,并增强了安全性。例如,TLS 1.3 默认使用 ECDHE 密钥交换,并移除了对旧的加密算法的支持。
1. DES (Data Encryption Standard) 的原理
DES 是一种对称块加密算法,它将 64 位的数据块加密成 64 位的密文块。DES 的核心是 16 轮的 Feistel 网络,每一轮都使用不同的子密钥。
- 主要步骤:
- 初始置换 (Initial Permutation, IP): 将 64 位明文块进行置换,重新排列位的顺序。
- 16 轮 Feistel 网络:
- 将 64 位数据块分成左右两部分,每部分 32 位。
- 每一轮都使用一个 48 位的子密钥。
- Feistel 函数 (F 函数): 将右半部分数据进行扩展、与子密钥异或、通过 S 盒进行替换、再进行置换,得到的结果与左半部分数据异或,作为新的右半部分。原来的右半部分作为新的左半部分。
- 重复 16 轮。
- 左右交换 (Swap): 将 16 轮后的左右两部分交换。
- 逆初始置换 (Inverse Initial Permutation, IP⁻¹): 将置换后的 64 位数据进行逆置换,得到最终的 64 位密文。
- 密钥生成:
- DES 使用 56 位密钥(实际上是 64 位,但其中 8 位用于奇偶校验,不参与加密)。
- 密钥经过一系列置换、循环移位和选择,生成 16 个 48 位的子密钥,用于每一轮的加密。
- Feistel 函数 (F 函数) 细节:
- 扩展 (Expansion): 将 32 位数据扩展为 48 位。
- 异或 (XOR): 将扩展后的 48 位数据与 48 位子密钥进行异或。
- S 盒替换 (Substitution): 将 48 位数据分成 8 个 6 位块,每个 6 位块通过一个 S 盒替换为 4 位数据。S 盒是非线性的,是 DES 安全性的关键。
- P 盒置换 (Permutation): 将 S 盒替换后的 32 位数据进行置换。
DES 的缺点:
- 密钥长度短: 56 位密钥长度较短,容易受到暴力破解攻击。
- 已被破解: 由于密钥长度短,DES 已被认为是不安全的,不推荐使用。
2. AES (Advanced Encryption Standard) 的原理
AES 是一种对称块加密算法,它支持 128 位、192 位和 256 位三种密钥长度,对应的块大小为 128 位。AES 的核心是基于 Rijndael 算法的迭代加密过程。
- 主要步骤:
- 密钥扩展 (Key Expansion): 将密钥扩展成多轮加密所需的轮密钥。
- 初始轮密钥加 (AddRoundKey): 将明文与第一轮轮密钥进行异或。
- 多轮加密 (Rounds): 根据密钥长度,进行 10 轮 (128 位密钥)、12 轮 (192 位密钥) 或 14 轮 (256 位密钥) 加密。每一轮包含以下步骤:
- 字节替换 (SubBytes): 使用 S 盒对每个字节进行非线性替换。
- 行移位 (ShiftRows): 将状态矩阵的每一行进行循环移位。
- 列混淆 (MixColumns): 对状态矩阵的每一列进行线性变换。
- 轮密钥加 (AddRoundKey): 将状态矩阵与轮密钥进行异或。
- 最后一轮加密 (Final Round): 最后一轮加密不包含列混淆步骤。
- 密钥扩展细节:
- 使用密钥调度算法,将原始密钥扩展成多轮加密所需的轮密钥。
- 每一轮都使用不同的轮密钥。
- 字节替换 (SubBytes) 细节:
- 使用 S 盒对每个字节进行非线性替换。
- S 盒是一个 16x16 的查找表,提供了非线性变换,是 AES 安全性的关键。
- 行移位 (ShiftRows) 细节:
- 将状态矩阵的每一行进行循环移位。
- 第一行不移动,第二行左移 1 个字节,第三行左移 2 个字节,第四行左移 3 个字节。
- 列混淆 (MixColumns) 细节:
- 对状态矩阵的每一列进行线性变换。
- 使用一个固定的矩阵与每一列进行矩阵乘法。
- 轮密钥加 (AddRoundKey) 细节:
- 将状态矩阵与轮密钥进行异或。
AES 的优点:
- 密钥长度灵活: 支持 128 位、192 位和 256 位密钥,安全性高。
- 安全性高: 经过严格的密码分析,目前没有发现有效的攻击方法。
- 性能高: 可以在硬件和软件中高效实现。
- 广泛应用: 是目前最常用的对称加密算法。
总结:
- DES: 是一种较老的对称块加密算法,基于 Feistel 网络,密钥长度短,已被破解,不推荐使用。
- AES: 是一种现代的对称块加密算法,基于 Rijndael 算法,密钥长度灵活,安全性高,性能好,是目前最常用的对称加密算法。
好的,我们来深入了解一下 SHA (Secure Hash Algorithm) 和 MD5 (Message Digest Algorithm 5) 这两种常用的哈希算法。
1. MD5 (Message Digest Algorithm 5)
- 特点:
- MD5 是一种广泛使用的哈希算法,它将任意长度的输入数据(消息)转换为一个固定长度的 128 位哈希值(也称为消息摘要或指纹)。
- MD5 算法是单向的,也就是说,从哈希值反推出原始数据在计算上是不可行的。
- MD5 的计算速度相对较快。
- 工作原理:
- 填充 (Padding): 将输入数据填充至 512 位的整数倍。
- 初始化缓冲区: 使用四个 32 位的初始值初始化缓冲区。
- 循环处理: 将填充后的数据分成 512 位的块,对每个块进行 64 轮的运算,每轮运算都使用不同的函数和常数。
- 输出哈希值: 将最终的缓冲区值连接起来,得到 128 位的哈希值。
- 应用场景:
- 数据完整性校验: 校验文件是否被篡改,例如,下载文件后计算 MD5 值,与官方提供的 MD5 值进行比较。
- 密码存储: 对用户密码进行哈希处理,存储哈希值而非明文密码。
- 数字签名: 在数字签名过程中,先对数据进行哈希处理,然后对哈希值进行签名。
- 安全性问题:
- 碰撞攻击: MD5 算法存在碰撞漏洞,即可以找到两个不同的输入数据,它们的 MD5 哈希值相同。
- 不适用于密码存储: 由于碰撞漏洞,MD5 不再适用于密码存储,应该使用更安全的哈希算法,例如 bcrypt 或 scrypt。
- 不适用于数字签名: 由于碰撞漏洞,MD5 不再适用于数字签名,应该使用更安全的哈希算法,例如 SHA-256 或 SHA-3。
2. SHA (Secure Hash Algorithm)
SHA 是一系列哈希算法的统称,包括 SHA-0、SHA-1、SHA-2 和 SHA-3 等多个版本。
- SHA-0 和 SHA-1:
- SHA-0: 早期版本,很快被发现存在安全漏洞,不推荐使用。
- SHA-1: 产生 160 位的哈希值,曾经被广泛使用,但现在也被认为是不安全的,存在碰撞攻击的风险。
- SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256):
- 特点: SHA-2 是一系列哈希算法,它们产生不同长度的哈希值,包括 224 位、256 位、384 位和 512 位。
- SHA-256: 最常用的 SHA-2 算法,产生 256 位的哈希值,安全性高,被广泛应用于各种安全领域。
- SHA-512: 产生 512 位的哈希值,比 SHA-256 更安全,但计算速度较慢。
- 应用场景:
- 数据完整性校验: 校验文件是否被篡改。
- 数字签名: 生成数字签名的哈希值。
- 密码存储: 对用户密码进行哈希处理,存储哈希值而非明文密码。
- 区块链: 用于生成区块的哈希值。
- SHA-3 (Keccak):
- 特点: SHA-3 是新一代哈希算法,基于 Keccak 算法,与 SHA-2 的设计完全不同。
- 安全性高: SHA-3 被认为是非常安全的,可以替代 SHA-2。
- 应用场景:
- 数据完整性校验: 校验文件是否被篡改。
- 数字签名: 生成数字签名的哈希值。
- 密码存储: 对用户密码进行哈希处理,存储哈希值而非明文密码。
- 区块链: 用于生成区块的哈希值。
SHA 和 MD5 的对比:
特性 | MD5 | SHA (SHA-256, SHA-3) |
---|---|---|
哈希值长度 | 128 位 | 256 位 (SHA-256), 224-512 位 (SHA-3) |
安全性 | 存在碰撞漏洞,不安全,不推荐使用 | 安全性高,推荐使用 |
速度 | 较快 | 较慢 |
应用场景 | 数据完整性校验 (不推荐), 密码存储 (不推荐) | 数据完整性校验, 数字签名, 密码存储 |
总结:
- MD5: 是一种较老的哈希算法,速度快,但存在碰撞漏洞,不推荐用于安全敏感的应用,例如密码存储和数字签名。
- SHA: 是一系列哈希算法,包括 SHA-2 和 SHA-3,安全性高,是目前推荐使用的哈希算法。其中,SHA-256 是最常用的 SHA-2 算法,SHA-3 是新一代哈希算法。
在实际应用中,应该避免使用 MD5,并选择更安全的哈希算法,例如 SHA-256 或 SHA-3。对于密码存储,应该使用 bcrypt 或 scrypt 等专门用于密码哈希的算法。
好的,我们来深入探讨 RSA (Rivest-Shamir-Adleman) 和 ECC (Elliptic Curve Cryptography) 这两种重要的非对称加密算法。
1. RSA (Rivest-Shamir-Adleman)
- 原理: RSA 算法基于大数分解的数学难题。它的安全性依赖于分解两个大质数的乘积(即模数)的困难性。
- 密钥生成:
- 选择两个大质数: 随机选择两个大质数 p 和 q。
- 计算模数: 计算 n = p * q。
- 计算欧拉函数: 计算 φ(n) = (p-1) * (q-1)。
- 选择公钥指数: 选择一个整数 e,满足 1 < e < φ(n) 且 e 与 φ(n) 互质。
- 计算私钥指数: 计算 d,满足 d * e ≡ 1 (mod φ(n))。
- 公钥: (n, e)
- 私钥: (n, d)
- 加密:
- 将明文 m (小于 n) 用公钥 (n, e) 加密成密文 c:c = mᵉ mod n
- 解密:
- 将密文 c 用私钥 (n, d) 解密成明文 m:m = cᵈ mod n
- 应用场景:
- 密钥交换: 在 TLS/SSL 握手过程中,使用 RSA 加密对称密钥,确保对称密钥的安全传输。
- 数字签名: 使用私钥对数据进行签名,使用公钥验证签名,确保数据的完整性和不可否认性。
- 数据加密: 使用公钥加密数据,只有私钥持有者才能解密。
- 优点:
- 成熟的算法: RSA 是一种成熟的算法,经过了长时间的验证和广泛的应用。
- 易于理解和实现: RSA 的数学原理相对简单,易于理解和实现。
- 缺点:
- 计算速度慢: RSA 的加密和解密速度相对较慢,不适合加密大量数据。
- 密钥长度较长: 为了保证安全性,RSA 需要使用较长的密钥长度,例如 2048 位或 4096 位。
- 容易受到选择密文攻击: 如果使用不当,RSA 容易受到选择密文攻击。
2. ECC (Elliptic Curve Cryptography)
- 原理: ECC 算法基于椭圆曲线数学的难题。它的安全性依赖于在椭圆曲线上求解离散对数问题的困难性。
- 椭圆曲线:
- 椭圆曲线的方程形式通常为 y² = x³ + ax + b。
- 椭圆曲线上的点构成一个阿贝尔群,可以进行加法运算。
- 密钥生成:
- 选择椭圆曲线: 选择一条合适的椭圆曲线和基点 G。
- 选择私钥: 随机选择一个整数 d 作为私钥。
- 计算公钥: 计算公钥 Q = d * G (G 的 d 次加法)。
- 公钥: Q
- 私钥: d
- 加密 (ECDH 密钥交换为例):
- 密钥交换:
- Alice 生成自己的公私钥对 (Qa, da),Bob 生成自己的公私钥对 (Qb, db)。
- Alice 将 Qa 发送给 Bob,Bob 将 Qb 发送给 Alice。
- Alice 计算共享秘密:Sa = da * Qb。
- Bob 计算共享秘密:Sb = db * Qa。
- 由于 da * Qb = db * Qa,所以 Sa = Sb,双方得到了相同的共享秘密。
- 密钥交换:
- 解密: ECC 通常不直接用于数据加密,而是用于密钥交换和数字签名。
- 应用场景:
- 密钥交换: 在 TLS/SSL 握手过程中,使用 ECDHE 密钥交换算法,确保对称密钥的安全传输。
- 数字签名: 使用 ECDSA 数字签名算法,确保数据的完整性和不可否认性。
- 移动设备: 由于密钥长度较短,性能高,适合资源受限的移动设备。
- 区块链: 用于加密货币交易和身份验证。
- 物联网: 用于物联网设备的身份验证和数据加密。
- 优点:
- 密钥长度短: 在相同的安全级别下,ECC 的密钥长度比 RSA 短得多,例如 256 位的 ECC 密钥相当于 3072 位的 RSA 密钥。
- 计算速度快: ECC 的加密和解密速度比 RSA 快得多。
- 更安全: ECC 被认为比 RSA 更安全,因为它的数学难题更难解决。
- 缺点:
- 数学原理复杂: ECC 的数学原理相对复杂,不易理解。
- 实现难度较高: ECC 的实现难度较高,需要更专业的知识。
RSA 和 ECC 的对比:
特性 | RSA | ECC |
---|---|---|
原理 | 大数分解难题 | 椭圆曲线离散对数难题 |
密钥长度 | 较长 (例如 2048 位或 4096 位) | 较短 (例如 256 位) |
计算速度 | 较慢 | 较快 |
安全性 | 较低 | 较高 |
数学原理 | 相对简单 | 相对复杂 |
实现难度 | 较低 | 较高 |
应用场景 | 密钥交换, 数字签名, 数据加密 (较少) | 密钥交换, 数字签名, 移动设备, 区块链, 物联网 |
总结:
- RSA: 是一种成熟的非对称加密算法,基于大数分解难题,易于理解和实现,但计算速度较慢,密钥长度较长,安全性相对较低。
- ECC: 是一种现代的非对称加密算法,基于椭圆曲线数学难题,密钥长度短,计算速度快,安全性高,适合资源受限的设备和新兴应用场景。
在实际应用中,ECC 逐渐取代 RSA,成为更安全、更高效的非对称加密算法。例如,TLS 1.3 默认使用 ECDHE 密钥交换,而不是 RSA。