Skip to content
crypto2026-07-253 分钟阅读

什么是 AES 加密

AES(Advanced Encryption Standard,高级加密标准)是目前最广泛使用的对称加密算法。2001 年被美国国家标准与技术研究院(NIST)采纳为标准,至今仍是全球政府、银行和企业系统的首选加密算法。

对称加密意味着加密和解密使用同一把密钥——拥有密钥的人可以加密和解密数据。

AES 的核心参数

| 参数 | 说明 | 常见值 | |------|------|--------| | 密钥长度 | 决定安全性 | 128 / 192 / 256 位 | | 分组大小 | 固定为 128 位 | 16 字节 | | 加密模式 | 数据块的处理方式 | ECB / CBC / GCM / CTR | | 填充方式 | 数据不足分组大小时的补充 | PKCS7 / Zero |

AES-GCM:推荐的加密模式

AES-GCM(Galois/Counter Mode)是目前最推荐的 AES 模式,因为它提供认证加密(Authenticated Encryption):

  • 保密性:加密后的数据无法被读取
  • 完整性:数据被篡改会被检测到
  • 认证性:验证数据来源的真实性
密文 = AES-GCM-Encrypt(密钥, 明文, IV, 认证附加数据)
明文 = AES-GCM-Decrypt(密钥, 密文, IV, 认证附加数据)

为什么不用 ECB 模式

ECB(Electronic Codebook)模式是最简单的加密方式,但存在严重安全缺陷:相同的明文块会加密成相同的密文块,保留了数据的模式信息。

ECB 模式加密的 Linux 企鹅图片(模式泄露):
[密文块A][密文块A][密文块B]
[密文块B][密文块C][密文块C]

GCM 模式加密的同一图片(模式隐藏):
[随机密文][随机密文][随机密文]
[随机密文][随机密文][随机密文]

PBKDF2 密钥派生

直接使用用户密码作为 AES 密钥是不安全的,因为密码通常不够随机。PBKDF2(Password-Based Key Derivation Function 2)通过以下步骤派生安全密钥:

  1. 密码 + 盐值(Salt):盐值是随机生成的,防止彩虹表攻击
  2. 多次迭代(如 100,000 次):增加暴力破解的成本
  3. 输出固定长度密钥:派生出 AES-256 所需的 256 位密钥

如何使用在线 AES 加解密工具

使用 DevToolkit Pro 的 AES 加解密工具

加密

  1. 输入明文数据
  2. 输入密码(Passphrase)
  3. 选择密钥长度(128 / 192 / 256 位)
  4. 点击 Encrypt 按钮
  5. 复制生成的密文(Base64 编码)

解密

  1. 输入密文(Base64 编码)
  2. 输入密码
  3. 选择对应的密钥长度
  4. 点击 Decrypt 按钮
  5. 还原的明文出现在输出框

编程语言中的 AES 加密

JavaScript / Web Crypto API

async function encrypt(data, password) {
  const encoder = new TextEncoder();
  const salt = crypto.getRandomValues(new Uint8Array(16));
  const iv = crypto.getRandomValues(new Uint8Array(12));
  
  // PBKDF2 派生密钥
  const keyMaterial = await crypto.subtle.importKey(
    'raw', encoder.encode(password),
    'PBKDF2', false, ['deriveKey']
  );
  const key = await crypto.subtle.deriveKey(
    { name: 'PBKDF2', salt, iterations: 100000, hash: 'SHA-256' },
    keyMaterial,
    { name: 'AES-GCM', length: 256 },
    false, ['encrypt']
  );
  
  // AES-GCM 加密
  const ciphertext = await crypto.subtle.encrypt(
    { name: 'AES-GCM', iv },
    key, encoder.encode(data)
  );
  
  return { ciphertext, salt, iv };
}

Python

from cryptography.hazmat.primitives.ciphers.aead import AESGCM
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
import os

def encrypt(plaintext: str, password: str) -> bytes:
    salt = os.urandom(16)
    iv = os.urandom(12)
    
    # PBKDF2 派生密钥
    kdf = PBKDF2HMAC(algorithm=hashes.SHA256(), length=32,
                      salt=salt, iterations=100000)
    key = kdf.derive(password.encode())
    
    # AES-GCM 加密
    aesgcm = AESGCM(key)
    return aesgcm.encrypt(iv, plaintext.encode(), None)

安全最佳实践

  1. 永远不要自己实现加密算法:使用经过审计的标准库(Web Crypto API、OpenSSL、BoringSSL)
  2. 每次加密使用随机 IV:即使加密相同内容,不同 IV 产生不同密文
  3. 密钥与密文分开存储:密钥放在密钥管理服务,密文放在数据库
  4. 使用认证加密:优先选择 AES-GCM 而非 AES-CBC

FAQ

AES-256 比 AES-128 安全多少?

从实际角度看,两者都足够安全。AES-128 的密钥空间为 2^128,暴力破解需要宇宙年龄级别的时间。AES-256 提供更大的安全余量,是政府级应用的首选。

在线 AES 工具安全吗?

DevToolkit Pro 的 AES 加解密完全在浏览器端运行(Web Crypto API),密码和数据不离开设备。但请确保在安全的环境中使用,避免浏览器扩展窃取数据。

加密后数据体积会变大吗?

会略微变大。AES-GCM 输出包含密文 + 认证标签(16 字节)+ IV(12 字节)。对于小数据,开销比例较高;对于大数据,开销可忽略。


本文由 DevToolkit Pro 提供。更多开发者工具请访问 首页


ad