在对称加密算法中,AES-GCM 和 3DES 是两种综合性能和历史都算有代表性的算法。本文将从安全性、性能、应用场景等综合综吁解析,全面对比这两种对称加密算法。
1、概述对比
属性 | AES-GCM | 3DES |
---|---|---|
加密方式 | 块加密 + 认证 (AEAD) | 三次 DES 加密 |
块大小 | 128 位 | 64 位 |
密钥长度 | 128/192/256 位 | 112/168 位 |
加密模式 | GCM (带认证) | CBC, ECB (不带认证) |
是否认证加密 | 是 | 否 |
性能 | 很快(有硬件加速) | 慢(需三次加密) |
安全性 | 高 | 弱(已有攻击方法) |
推荐状态 | 强烈推荐 | 已弃用 |
适合平台 | 环境新,Web/API/TLS | 遗留系统/经典程序 |
2、安全性对比
- AES-GCM
- 完全支持 AEAD,加密 + 数据完整性校验
- 无实际装裱攻击
- 如果 nonce 使用正确,安全性极高
- 3DES
- 拥有 64-bit 块,易受生无攻击
- 密钥长度是 112-bit 等效,已不适合现代应用
- 已出现 Meet-in-the-Middle 和 Sweet32 等攻击
3、性能对比
测试条件 | AES-GCM | 3DES |
---|---|---|
有 AES-NI 硬件加速 | 1~3 GB/s | 10~20 MB/s |
无硬件加速 | 300~500 MB/s | 5~10 MB/s |
并行支持 | 是 | 否 |
AES-GCM 是现代硬件上最快的加密方案之一,适合大量数据处理。
4、应用场景
场景 | 推荐算法 |
---|---|
Web / API 数据传输 | AES-GCM |
TLS / HTTPS / VPN | AES-GCM |
本地文件加密 | AES-GCM |
遥程设备 / 移动端 | ChaCha20-Poly1305 |
老经程序选择 | 3DES (COPAT ONLY) |
5、在 Golang 中使用 AES-GCM
Go 标准库对 AES-GCM 提供了良好支持。以下是一个完整示例,演示如何进行加密与解密:
示例代码
package main
import (
"crypto/aes"
"crypto/cipher"
"crypto/rand"
"fmt"
"io"
)
func encryptAESGCM(plaintext, key []byte) ([]byte, []byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, nil, fmt.Errorf("create cipher: %w", err)
}
aesGCM, err := cipher.NewGCM(block)
if err != nil {
return nil, nil, fmt.Errorf("GCM mode: %w", err)
}
nonce := make([]byte, aesGCM.NonceSize())
if _, err := io.ReadFull(rand.Reader, nonce); err != nil {
return nil, nil, fmt.Errorf("generate nonce: %w", err)
}
ciphertext := aesGCM.Seal(nil, nonce, plaintext, nil)
return ciphertext, nonce, nil
}
func decryptAESGCM(ciphertext, key, nonce []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, fmt.Errorf("create cipher: %w", err)
}
aesGCM, err := cipher.NewGCM(block)
if err != nil {
return nil, fmt.Errorf("GCM mode: %w", err)
}
plaintext, err := aesGCM.Open(nil, nonce, ciphertext, nil)
if err != nil {
return nil, fmt.Errorf("decryption failed: %w", err)
}
return plaintext, nil
}
注意事项
- 密钥长度必须是 16、24 或 32 字节,分别对应 AES-128、AES-192 和 AES-256。
- Nonce(随机数)必须唯一,推荐每次加密时重新生成。
- GCM 支持 AEAD 模式:提供加密和完整性认证。

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
腾讯云开发者社区:孟斯特
—