首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >对比 AES-GCM 和 3DES

对比 AES-GCM 和 3DES

原创
作者头像
孟斯特
发布2025-06-02 09:51:21
发布2025-06-02 09:51:21
2380
举报
文章被收录于专栏:Go学习Go学习

在对称加密算法中,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 提供了良好支持。以下是一个完整示例,演示如何进行加密与解密:

示例代码

代码语言:go
复制
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 模式:提供加密和完整性认证。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、概述对比
  • 2、安全性对比
  • 3、性能对比
  • 4、应用场景
  • 5、在 Golang 中使用 AES-GCM
    • 示例代码
    • 注意事项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档