在对称加密算法中,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
腾讯云开发者社区:孟斯特