1. 加密的基本概念
在信息安全领域,加密是保护数据机密性的核心技术。它通过特定的算法将可读的明文转换为不可读的密文,只有持有正确密钥的人才能还原。根据密钥的使用方式,现代密码学将加密算法分为两大类:对称加密 和非对称加密。
两者的根本区别在于:对称加密使用同一个密钥进行加解密,而非对称加密使用一对公钥和私钥。
2. 对称加密
2.1 原理与流程
对称加密又称私钥加密,通信双方共享同一个密钥。发送方用该密钥加密明文,接收方用同样的密钥解密密文。
接收方 发送方 接收方 发送方 #mermaid-svg-TEwDygPfHYNK7Z2z{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-TEwDygPfHYNK7Z2z .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-TEwDygPfHYNK7Z2z .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-TEwDygPfHYNK7Z2z .error-icon{fill:#552222;}#mermaid-svg-TEwDygPfHYNK7Z2z .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-TEwDygPfHYNK7Z2z .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-TEwDygPfHYNK7Z2z .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-TEwDygPfHYNK7Z2z .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-TEwDygPfHYNK7Z2z .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-TEwDygPfHYNK7Z2z .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-TEwDygPfHYNK7Z2z .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-TEwDygPfHYNK7Z2z .marker{fill:#333333;stroke:#333333;}#mermaid-svg-TEwDygPfHYNK7Z2z .marker.cross{stroke:#333333;}#mermaid-svg-TEwDygPfHYNK7Z2z svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-TEwDygPfHYNK7Z2z p{margin:0;}#mermaid-svg-TEwDygPfHYNK7Z2z .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-TEwDygPfHYNK7Z2z text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-TEwDygPfHYNK7Z2z .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-TEwDygPfHYNK7Z2z .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-TEwDygPfHYNK7Z2z .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-TEwDygPfHYNK7Z2z .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-TEwDygPfHYNK7Z2z #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-TEwDygPfHYNK7Z2z .sequenceNumber{fill:white;}#mermaid-svg-TEwDygPfHYNK7Z2z #sequencenumber{fill:#333;}#mermaid-svg-TEwDygPfHYNK7Z2z #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-TEwDygPfHYNK7Z2z .messageText{fill:#333;stroke:none;}#mermaid-svg-TEwDygPfHYNK7Z2z .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-TEwDygPfHYNK7Z2z .labelText,#mermaid-svg-TEwDygPfHYNK7Z2z .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-TEwDygPfHYNK7Z2z .loopText,#mermaid-svg-TEwDygPfHYNK7Z2z .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-TEwDygPfHYNK7Z2z .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-TEwDygPfHYNK7Z2z .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-TEwDygPfHYNK7Z2z .noteText,#mermaid-svg-TEwDygPfHYNK7Z2z .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-TEwDygPfHYNK7Z2z .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-TEwDygPfHYNK7Z2z .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-TEwDygPfHYNK7Z2z .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-TEwDygPfHYNK7Z2z .actorPopupMenu{position:absolute;}#mermaid-svg-TEwDygPfHYNK7Z2z .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-TEwDygPfHYNK7Z2z .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-TEwDygPfHYNK7Z2z .actor-man circle,#mermaid-svg-TEwDygPfHYNK7Z2z line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-TEwDygPfHYNK7Z2z :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 双方事先安全共享同一个密钥 K 用密钥 K 加密原始数据得到密文,发送密文用同样的密钥 K 解密密文,得到原始数据
这个过程就像一把钥匙既能锁门又能开门,谁持有这把钥匙就能查看信息。
2.2 常见算法
- DES(Data Encryption Standard):早期标准,56位密钥,现已被暴力破解,不再安全。
- 3DES(Triple DES):对数据执行三次 DES 加密,安全性提高但效率较低。
- AES(Advanced Encryption Standard):目前最主流的对称加密算法,密钥长度可选128、192、256位,应用于 HTTPS、文件加密、数据库加密等场景。
- SM4:中国国家密码管理局发布的对称加密标准,应用于国内金融、政务等领域。
- RC4、Blowfish、Twofish 等也有特定应用场景。
2.3 优势与局限
优势
- 加解密速度快,适合大量数据。
- 计算资源消耗小,适合移动设备、IoT 等环境。
局限
- 密钥分发困难:双方必须在安全信道中提前共享密钥,这在开放网络中几乎不可能。
- 密钥管理复杂:N 个用户两两通信,需要 N(N-1)/2 个密钥,扩展性差。
- 无法认证身份:对称加密本身不提供签名和身份验证能力,需要结合 MAC 或数字签名。
3. 非对称加密
3.1 原理与流程
非对称加密使用一对数学相关的密钥:公钥 可以公开,私钥必须严格保密。用公钥加密的数据只能用对应私钥解密;反之,用私钥签名的数据可用公钥验证。
发送方 接收方 发送方 接收方 #mermaid-svg-KKTj6WGcQIRgT8kr{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-KKTj6WGcQIRgT8kr .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KKTj6WGcQIRgT8kr .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KKTj6WGcQIRgT8kr .error-icon{fill:#552222;}#mermaid-svg-KKTj6WGcQIRgT8kr .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KKTj6WGcQIRgT8kr .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KKTj6WGcQIRgT8kr .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KKTj6WGcQIRgT8kr .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KKTj6WGcQIRgT8kr .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KKTj6WGcQIRgT8kr .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KKTj6WGcQIRgT8kr .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KKTj6WGcQIRgT8kr .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KKTj6WGcQIRgT8kr .marker.cross{stroke:#333333;}#mermaid-svg-KKTj6WGcQIRgT8kr svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KKTj6WGcQIRgT8kr p{margin:0;}#mermaid-svg-KKTj6WGcQIRgT8kr .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-KKTj6WGcQIRgT8kr text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-KKTj6WGcQIRgT8kr .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-KKTj6WGcQIRgT8kr .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-KKTj6WGcQIRgT8kr .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-KKTj6WGcQIRgT8kr .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-KKTj6WGcQIRgT8kr #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-KKTj6WGcQIRgT8kr .sequenceNumber{fill:white;}#mermaid-svg-KKTj6WGcQIRgT8kr #sequencenumber{fill:#333;}#mermaid-svg-KKTj6WGcQIRgT8kr #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-KKTj6WGcQIRgT8kr .messageText{fill:#333;stroke:none;}#mermaid-svg-KKTj6WGcQIRgT8kr .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-KKTj6WGcQIRgT8kr .labelText,#mermaid-svg-KKTj6WGcQIRgT8kr .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-KKTj6WGcQIRgT8kr .loopText,#mermaid-svg-KKTj6WGcQIRgT8kr .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-KKTj6WGcQIRgT8kr .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-KKTj6WGcQIRgT8kr .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-KKTj6WGcQIRgT8kr .noteText,#mermaid-svg-KKTj6WGcQIRgT8kr .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-KKTj6WGcQIRgT8kr .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-KKTj6WGcQIRgT8kr .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-KKTj6WGcQIRgT8kr .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-KKTj6WGcQIRgT8kr .actorPopupMenu{position:absolute;}#mermaid-svg-KKTj6WGcQIRgT8kr .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-KKTj6WGcQIRgT8kr .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-KKTj6WGcQIRgT8kr .actor-man circle,#mermaid-svg-KKTj6WGcQIRgT8kr line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-KKTj6WGcQIRgT8kr :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 生成密钥对(公钥 PK、私钥 SK)把公钥 PK 公开发送给发送方用公钥 PK 加密数据得到密文发送密文用自己的私钥 SK 解密密文,得到原始数据
这类似于邮箱:任何人都可以把信投进邮箱(公钥加密),但只有持有钥匙的人才能打开取信(私钥解密)。
3.2 常见算法
- RSA:基于大整数分解难题,历史悠久,应用最广泛。密钥长度通常为2048位或4096位,用于数字签名、密钥交换、证书等。
- ECC(椭圆曲线密码学):在相同安全强度下密钥更短、计算更快,适合移动设备。常见曲线有 secp256r1、Curve25519 等。
- SM2:中国商用密码标准的椭圆曲线公钥密码算法,性能与安全性兼备。
- ElGamal、DSA 等也用于特定领域。
3.3 优势与局限
优势
- 密钥分发简单:公钥可以公开传输,不需要安全信道预先交换。
- 提供身份认证和完整性:结合数字签名可以验证发送者身份、防止抵赖。
- 密钥管理方便:N 个用户只需 N 对密钥,公钥可公开存储。
局限
- 加解密速度慢:运算量远大于对称加密,不适合加密海量数据。
- 密钥长度需较大:为保证安全,密钥长度往往需要2048位以上,占用更多资源。
4. 对比总结
| 特性 | 对称加密 | 非对称加密 |
|---|---|---|
| 密钥数量 | 1 个(共享密钥) | 2 个(公钥 + 私钥) |
| 加解密速度 | 快 | 慢(比对称慢百倍以上) |
| 安全性基础 | 密钥保密 | 数学难题(如大数分解、离散对数) |
| 密钥分发 | 需要安全信道 | 公钥可公开,私钥无需传输 |
| 典型算法 | AES、SM4、ChaCha20 | RSA、ECC、SM2 |
| 主要用途 | 加密大量数据 | 密钥协商、数字签名、身份认证 |
| 身份验证 | 不直接支持 | 支持(数字签名) |
实际系统中通常混合使用:使用非对称加密安全地交换一个临时对称密钥,后续大量数据用该对称密钥加密传输。例如 HTTPS 的 TLS 握手过程就采用此模式,兼顾安全与性能。
5. Java 示例
下面展示使用 Java 进行 AES 对称加密和 RSA 非对称加密的简单示例。
5.1 AES 对称加解密
java
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.GCMParameterSpec;
import java.security.SecureRandom;
public class AESDemo {
public static void main(String[] args) throws Exception {
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(256); // 256位密钥
SecretKey secretKey = keyGen.generateKey();
byte[] iv = new byte[12];
SecureRandom.getInstanceStrong().nextBytes(iv);
String plainText = "Hello, 对称加密!";
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
GCMParameterSpec spec = new GCMParameterSpec(128, iv);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, spec);
byte[] cipherText = cipher.doFinal(plainText.getBytes());
cipher.init(Cipher.DECRYPT_MODE, secretKey, spec);
byte[] decrypted = cipher.doFinal(cipherText);
System.out.println(new String(decrypted)); // Hello, 对称加密!
}
}
5.2 RSA 非对称加解密
java
import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
public class RSADemo {
public static void main(String[] args) throws Exception {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair pair = keyGen.generateKeyPair();
PublicKey publicKey = pair.getPublic();
PrivateKey privateKey = pair.getPrivate();
String plainText = "Hello, 非对称加密!";
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] cipherText = cipher.doFinal(plainText.getBytes());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decrypted = cipher.doFinal(cipherText);
System.out.println(new String(decrypted)); // Hello, 非对称加密!
}
}
提示:在实际生产环境中,RSA 通常不直接加密长文本,而是结合对称密钥使用。
6. 结语
对称加密与非对称加密是构建现代信息安全体系的两大基石。了解它们的原理、差异和适用场景,有助于在系统设计时正确选择加密方案。无论是开发 Web 应用、移动端数据保护还是 IoT 通信,合理运用这两种加密技术都是保障数据安全的关键。