对称加密与非对称加密详解

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 通信,合理运用这两种加密技术都是保障数据安全的关键。

相关推荐
周杰伦的稻香1 小时前
(1071, ‘Specified key was too long; max key length is 767 bytes‘)
数据库·mysql
米尔的可达鸭1 小时前
深入操作系统 Socket 底层:EPOLLOUT 可写事件管理 + 非阻塞异步
开发语言·网络·数据结构·经验分享·websocket·网络协议
SimonKing1 小时前
Spring Boot 4.0 + gRPC 极简集成:4步搞定,比REST还丝滑
java·后端·程序员
C++、Java和Python的菜鸟1 小时前
第3章 后端Web基础 (Maven)
java
小小编程路1 小时前
Java super 关键字详解:用法、场景与常见误区
java·开发语言
Leo.yuan1 小时前
数据目录和数据字典有什么区别?一文讲清
大数据·数据库·人工智能
全堆鸿蒙2 小时前
鸿蒙应用开发实战【37】— 数据统计:countByStatus 聚合查询
数据库·华为·harmonyos·鸿蒙系统
惜分飞2 小时前
记录block 0损坏,数据文件大量坏块,使用不当数据库版本恢复等各种操作之后的故障处理---惜分飞
数据库·block0损坏·ora-17503
我登哥MVP2 小时前
走进 Gang of Four 设计模式:外观模式
java·设计模式·外观模式