在浏览器里加密文本是一次带守卫的往返:明文用密钥变换成密文,并附上 16 字节的认证标签,任何在途中改动密文哪怕一个比特的人都会被抓住。AES 加密解密用 AES-GCM 在浏览器里跑完整次往返:12 字节明文变成 28 字节密文,32、48 或 64 字符的十六进制密钥分别选出 AES-128、192 或 256,24 字符的 IV 是 12 字节。输出是 base64——这个 12 字节的例子是 40 字符——解密侧拒绝任何被篡改的内容。什么都不离开这台机器。
GCM 给分组密码加了什么
AES 本身是分组密码:每次取 16 字节,经过固定轮数的混淆——128 位密钥 10 轮、192 位 12 轮、256 位 14 轮。单独的分组密码不隐藏消息长度,不接受不是 16 字节倍数的消息,也说不清密文是否被改过。GCM 在它上面加了三层:以计数器模式运行,任意长度的消息都能流过;派生出与明文异或的密钥流,这是内容被隐藏的方式;用带密钥的哈希对密文算出一个 16 字节的认证标签。标签就是守卫:翻转密文的一个比特,解密侧抛出错误而不是返回乱码。哈希生成器计算的是同一家族但不带密钥的摘要,用于完整性与去重;摘要不可逆,所以单独哈希永远不能当加密——GCM 的标签借用了哈希的思路并给它配上密钥,这正是把它挂在密文上是安全的原因。
密钥、IV,以及不能重复的那一对
密钥是材料:32 个十六进制字符是 16 字节,48 个是 24,64 个是 32,所以三种合法长度分别选出 AES-128、AES-192 与 AES-256;密钥导入后以不可提取的句柄保存在 Web Crypto 里,既不被存储也不被发送。IV(初始化向量)是 24 个十六进制字符、12 字节,必须与同一密钥用过的任何其他 IV 都不同。这就是不能重复的那一对:同一密钥配同一 IV 用两次,是击溃 GCM 的失败方式,因为两次运行的计数器密钥流会完全相同,第二条消息就把剥离第一条消息的能力交给了攻击者。工具记住会话里已经用过的密钥-IV 对,当你试图再用其中一对加密时立刻显示警告。对照之下,HMAC 生成器用同类的带密钥哈希做相反的工作:它认证消息但不隐藏消息。HMAC 回答"这是否完好且出自你",GCM 则回答"这是否完好、出自你、而且保密"。
随机性从哪里来
页面加载时,工具替你填好两个字段:64 字符的随机十六进制密钥(32 字节)与 24 字符的随机十六进制 IV(12 字节),用的是与加密本身同源的 Web Crypto getRandomValues 路径。随机性正是让 IV 保持唯一的东西:12 字节随机 IV 在少量消息之间的碰撞概率可以忽略,而换一个全新密钥连这点概率也一并消除。如果你在同一个浏览器里生成标识符,UUID 生成器为 v4 UUID 从同一个随机性来源取数,同样的注意事项适用:随机性是一种供给而不是一项设置,浏览器是发放者。把这两个生成的字段当护照对待——它们随你带走,不可与人共享。
读懂 base64 输出
密文是二进制,所以工具把它渲染成 base64——这个编码把每 3 个字节映射成 4 个字符。这就是为什么 12 字节的明文不会以 12 个字符返回:28 字节密文(12 字节加 16 字节标签)编码成 40 个 base64 字符,尾组用填充吸收余数。增长是稳定的:100 字节明文得到 116 字节密文,即 156 个 base64 字符;1000 字节得到 1016,即 1356 字符。多出的 16 字节每次都是同一个标签,所以长消息的开销可忽略,短消息则看得见。当需要把字节交给期望原始编码的地方时,Base64 编解码器在文本形式与其他表示之间转换,不触碰内容。
密钥就是整个系统
AES-GCM 的强度完全取决于背后的密钥,而密钥作为秘密,与密码在同一个意义上相同:强度是长度与不可预测性的函数,管理是不重复它、不把它写在任何看得见的地方。工具不评判你的密钥——它接受 32 到 64 之间的任何偶数长度十六进制串——但诚实的检查是把密码强度检测器用于密码的那套标准翻译成十六进制:一个 64 字符但由重复模式构成的十六进制串,材料上是 32 字节,熵却远小于 256 位。如果你需要的是真正的密钥材料而不是手打的,密码生成指南覆盖同样的生成与保存纪律,随机十六进制密钥走同一个一键生成路径。
盒子外面的 AES
同一个 AES-GCM 原语不是浏览器玩具:TLS 用 AES-GCM 作为核心记录密码之一,现代操作系统的全盘加密用 AES(通常是 XTS 模式),而工具调用的 Web Crypto API 与支付运行时、登录流程和离线优先应用为加密本地存储调用的 API 是同一个。这个工具的意义在于让原语可检查:你能在文本框里看到确切的密文、确切的标签开销与确切的篡改检测失败方式。令牌是同一技术栈的另一张可见面孔——JWT 解码器打开令牌的头部与载荷,展示什么被签了、什么没被签,这正是加密在写入方向做的事的只读孪生。