AES-256加密指南:军事级文件保护
了解AES-256加密及其作为文件保护黄金标准的原因。学习这种军事级加密如何保护您的传输安全。
AES-256 是美国 NSA 依据 CNSSP-15 批准用于绝密数据的对称分组密码。它通过 14 轮替换、置换和混合运算,对 128 位数据块使用 256 位密钥进行加密。暴力破解一个 AES-256 密钥平均需要约 2^255 次运算——地球上所有计算机运行宇宙年龄的时间也无法破解。这正是从 SwissTransfer 到 Tresorit,每一家严肃的文件传输服务都以 AES-256 作为批量加密算法的原因。下面详细解释它的工作原理。
"256"代表什么
AES 有三种密钥长度:128 位、192 位和 256 位。这个数字只表示密钥长度,而不是数据块大小(块大小始终为 128 位)。密钥大小决定了密码运行的轮数:AES-128 运行 10 轮,AES-192 运行 12 轮,AES-256 运行 14 轮。
轮数越多,扩散性越强——每个输出位依赖于更多输入位,抵抗双关键字攻击等密码分析手段的能力也更强。2011 年发表的双密钥攻击理论上将 AES-256 的有效安全性从 256 位降低到 254.4 位,但这仍远超任何实际攻击的能力范围。
联邦信息处理标准 FIPS 197 定义了 AES,NIST SP 800-38A 至 800-38G 定义了各种操作模式。
操作模式:GCM 与 CBC 与 ECB
AES 是分组密码,只知道如何加密一个 128 位的块。要加密任意大小的文件,需要一种操作模式。选择至关重要:
- ECB(电子密码本):相同的明文块产生相同的密文。绝不要使用。著名的"ECB 企鹅"图片展示了 Tux 的轮廓在 ECB 加密像素中清晰可见。
- CBC(密码块链接):每个块与前一个密文进行 XOR。配合 HMAC 认证时是安全的,但单独的 CBC 容易受到 padding oracle 攻击(2014 年的 POODLE 攻击就针对 SSL 的 CBC 模式)。
- GCM(伽罗华/计数器模式):用计数器加密,同时在一次运算中生成 128 位认证标签。篡改密文会导致解密失败并明确报错。这是现代服务使用的模式。
AES-256-GCM 是 TLS 1.3、Signal、WireGuard 以及所有可信文件传输服务的默认选择。如果服务只说"AES-256"而不指定模式,通常可以假定是 GCM,但最好主动核实。
绝不能复用的 IV(随机数)
GCM 要求在使用同一密钥加密时,每次必须使用唯一的 96 位初始化向量(IV)。哪怕用同一密钥复用一次 IV,攻击者就能对两段密文执行 XOR 来恢复明文——这是对 WEP Wi-Fi 进行灾难性利用的著名漏洞。
最佳实践:使用密码学安全的随机数生成器生成 IV(浏览器中用 crypto.getRandomValues(),Linux 上用 /dev/urandom),并将其附在密文前面。96 位随机 IV 在加密 2^32 个文件后碰撞概率约为 2^-48,对文件传输服务来说完全可以接受。如果同一密钥用于数十亿个文件,则应改用确定性计数器。
密钥派生:将密码转换为密钥
用户喜欢用"mydog2024"这样的密码,而 AES 需要 256 位均匀随机数。密钥派生函数(KDF)充当两者之间的桥梁。当前有三种常用的 KDF:
- PBKDF2,配合 HMAC-SHA-256 和 60 万次迭代(OWASP 2023 年推荐)。广泛支持,可通过 Web Crypto API 调用。
- scrypt,增加了内存硬度,提高了 GPU 攻击成本。Bitcoin 和 LastPass 使用此方案。
- Argon2id,是当前最佳实践,2015 年密码哈希竞赛的冠军。推荐参数:
memory=64 MB, iterations=3, parallelism=4。
通过 Argon2id 处理一个 12 位随机密码,现代 GPU 需要约十亿年才能暴力破解。但无论使用哪种 KDF,像"password123"这样的弱密码都会在毫秒内被攻破。
在浏览器中使用 AES:Web Crypto API
浏览器通过 window.crypto.subtle 原生暴露了 AES-256-GCM。典型的调用流程如下:
const key = await crypto.subtle.generateKey(
{ name: "AES-GCM", length: 256 },
true,
["encrypt", "decrypt"]
);
const iv = crypto.getRandomValues(new Uint8Array(12));
const ciphertext = await crypto.subtle.encrypt(
{ name: "AES-GCM", iv },
key,
fileBytes
);
现代 CPU 具备 AES-NI 指令集,将吞吐量提升到每核心约 3–5 GB/s。1 GB 文件在中端笔记本上不到一秒即可完成加密。在移动端,Apple A 系列和高通骁龙芯片内置了 ARMv8 加密扩展,性能相当。
AES-256 能保护什么,保护不了什么
AES-256 解决一个特定问题:在密钥保密的前提下,保护静态或传输中数据的机密性。它解决不了以下问题:
- 密钥管理。如果把密码和文件一起发送,AES-256 形同虚设。
- 终端被攻陷。在加密前读取明文的恶意软件完全绕过了密码算法。
- 实现漏洞。2018 年的 BEAST、CRIME 和 Lucky13 攻击针对的是 TLS 实现,而非 AES 本身。
- 侧信道攻击。缓存时序分析和功耗分析已从受限设备中提取出 AES 密钥;AES-NI 在桌面端基本消除了这一威胁。
AES-256 也无法证明文件发送者的身份。要实现这一点,需要结合 Ed25519 或 ECDSA 数字签名。
"军事级"大多是营销话术
这个词之所以流行,是因为 NSA 于 2003 年在 CNSSP-15 中批准 AES-256 用于绝密数据。这是真实的,但那已经是 20 多年前的事了。事实上,AES-128 已获批用于秘密级别,对大多数民用场景同样足够。从 128 位升级到 256 位,主要是为了对抗量子计算的未来威胁:Grover 算法理论上将对称密钥安全性减半,把 AES-256 的有效强度降至 128 位,而这依然是安全的。
实际上,在 AES-NI 加速下,AES-256 比 AES-128 仅多消耗约 40% 的 CPU,且获得了普遍支持,因此即便 128 位已足够,AES-256 也已成为默认选择。
如何验证服务真正使用了 AES-256-GCM
三种核实方式:
- 阅读安全白皮书。可信的服务(Tresorit、Proton Drive、SwissTransfer、HexaTransfer)会公布确切的模式和 IV 处理方式。
- 检查客户端代码。打开 DevTools,在 JavaScript 包中搜索
AES-GCM或aes-256-gcm,应能明确看到。 - 查找第三方审计报告。Cure53、NCC Group 和 Trail of Bits 发布的审计报告会点名所审查的算法。
危险信号:只说"银行级加密"而不指定模式、使用任何形式的"专有算法",或引用 AES-128-ECB。
立即付诸实践
要安全地发送一份敏感文件:选择明确声明使用 AES-256-GCM、每个文件使用 96 位随机 IV、并在浏览器端(而非服务器)运行加密的服务。配合使用通过 Argon2id 或 PBKDF2(60 万次以上迭代)派生的 16 位以上口令短语。
在 hexatransfer.com 上试试 — 免费、无需注册、最多 10 GB。