在线文本加密工具AES加密

用 WebCrypto 的 AES-GCM-256 与 PBKDF2-SHA256 做带认证的对称加密,盐与 IV 随每次加密重新生成并随密文一起封装。

点「开始加密」生成——每次的盐与 IV 都不同,因此同一段明文两次加密的结果也不一样,这是 GCM 的正确行为。

封装三段分别 Base64 后用点号连接:Lq. 前缀用于识别格式,盐 16 字节 → 24 字符,IV 12 字节 → 16 字符(12 能被 3 整除,无填充),密文(明文字节 + 16 字节标签)按 ceil(n/3)*4 计长。解密时只需原文与同一个口令。

使用方法

  1. 选「加密」,在明文框里粘贴内容(示例已预填 柳泉工具 2026 演示文本)。
  2. 填口令(示例 demo-pass-2026)与迭代次数(示例 310000)。口令不要用生日或短数字,迭代次数越高越安全但越慢。
  3. 点「开始加密」或按 Ctrl/Cmd+Enter,等页面算出结果后点「复制结果」把整段 Lq. 封装拿走。
  4. 要还原时切到「解密」,把 Lq. 整段粘进第一个框,口令填成加密时那一个,点「开始解密」。
  5. 点「重置」回到示例条件;迭代次数改动后同一段密文解不出来了(盐与密钥都绑定了当次参数),这属于正常行为。

这个在线文本加密工具AES加密能解决什么问题

在线文本加密工具AES加密解决的是「需要一段只有特定口令能读回去的文本」,典型是:把配置里的连接串、一段含手机号的记录、一段内部备注先加密再贴进工单、聊天或issue;或者给自己的一段草稿做口令保护,防的是「随手一翻就能看到」。

选 GCM 而不是 CBC 是本页的技术核心。CBC 加密后不校验完整性,密文被改动一个 bit,解密时会得到一段乱码而没有任何提示——你无法区分「口令错了」与「数据被改了」。GCM(Galois/Counter Mode)在加密的同时算出一个 16 字节的认证标签,解密时先验标签,不过就整体失败。代价是明文长度固定可见(改了长度标签就对不上),这一点在正文「边界与精度」里讲清楚。

必须说清本页不做什么:它不能替代传输安全。把明文走 HTTP 提交、或者把密钥写在同一个 HTML 文件里,加密环节等于白做。本页的价值是「一段文本在离开你屏幕时已经被锁住」,不是「端到端安全通道」。要评估口令本身够不够强请用密码熵值计算器;要算暴力破解需要多久请用 Brute力时间计算器;要处理的是摘要校验而不是加密请用 SHA256加密。要把二进制值转成 URL 安全的短文本请用 Base64URL编码解码。

原理与规则说明:为什么用 WebCrypto,而不是自己写 AES

完整示例(数值仅作演示)

示例条件与工具默认值完全一致:明文 柳泉工具 2026 演示文本、口令 demo-pass-2026、迭代 310000。

以上字节数与长度均为按算法规则实算的结果,任何一段真实密文的字符都会不同。

输入范围与对照表

输入范围:明文上限 1 MB(1048576 字符,由 maxlength 限定);口令 1 ~ 200 字符;迭代次数 1000 ~ 1000000。下表是 24 组不同明文长度对应的密文与封装长度,前 12 行直接显示。

明文内容字符数UTF-8 字节密文字节封装 Base64相对明文膨胀
a111769+6800%
ab221869+3350%
abc331973+2333%
abcd442073+1725%
hello552173+1360%
hello world11112781+636%
柳泉262277+1183%
柳泉工具4122885+608%
柳泉工具 20269173389+424%
柳泉工具 2026 演示文本143046109+263%
a × 40404056121+202%
中文长文案 39 字39117133225+92%
123456789010102681+710%
test@test.com13132985+554%
https://example.com/a?b=c252541101+304%
订单号 20260303120000123212743105+289%
张三 13800138000 北京市朝阳区213753117+216%
VEVENT 三行文本343854117+208%
a × 80808096173+116%
今天天气不错 ☀️ 适合出门143854117+208%
😀😃😄😁😆5203693+365%
a × 100100100116201+101%
英文长句 × 3134134150245+83%
密钥是 K7#mQ2$vX9!pL4&wR8^nT6263248109+241%

体积膨胀的两个固定成本——这是短文本加密看起来「夸张」的真正原因:

成本项字节Base64 后字符说明
盐(salt)1624每次随机,明文携带
IV1216每次随机,明文携带
认证标签1624固定开销,与明文长度无关
Base64 膨胀—+33.3%(4/3 − 1),把二进制塞进文本的必然代价
前缀 + 分隔符35Lq. 加 2 个点号
合计固定开销476928 字节随机 + 16 字节标签 + 前缀分隔符

边界与精度

常见问题

点「开始加密」提示 crypto.subtle 未定义,是浏览器不支持吗?

多数情况不是不支持,而是不在安全上下文。crypto.subtle 只在 HTTPS、localhost、127.0.0.1 下暴露;用 http:// 访问非 localhost 域名,或 file:// 打开本地文件,都会让它变成 undefined。在地址栏左侧看 window.isSecureContext 即可确认。真正不支持的浏览器极少(WebCrypto 从 2016 年起已在主流浏览器普及)。若确认环境无误仍失败,请记住在线文本加密工具AES加密没有降级实现这一点。

解密提示失败,是口令错还是密文被改了?怎么区分?

页面不能区分,这是 GCM 的设计而非缺陷。实测 WebCrypto 在这两种情况下都只抛 OperationError,消息是 The operation failed for an operation-specific reason。原因很实在:如果解密失败时能告诉你是口令错,攻击者就能拿一条已知密文当「口令校验器」反复试口令了。请按这个顺序排查:一、口令是否与加密时完全一致(含大小写与首尾空格);二、迭代次数是否还是当时那个值(改了必然失败);三、Lq. 整段是否复制完整(少一个字符或丢结尾的 = 都不行);四、是否误把别的密文粘进来了。

为什么同一段明文加密两次,结果不一样?

因为每次都重新随机生成了盐和 IV。实测两次的 IV 完全不同,密文也随之不同。这是必须的正确行为:同一个密钥下如果 IV 重复,GCM 会退化成 CTR 模式,同一密钥的两个明文会泄露异或关系。判断加密是否成功要看能否用口令解回原文,不要用「密文是否和上次一样」来判断。相应地,密文不方便做去重比对——那正是哈希(摘要)的用途,请用 SHA256加密。

为什么短文本加密后长度涨了好几倍?

因为有 47 字节固定开销:盐 16 + IV 12 + 认证标签 16,再加 Lq. 前缀与 2 个点号共 5 个字符。加密 1 个字符 a 得到 17 字节密文,封装后 69 字符,相对明文膨胀 6800%。这部分开销不随明文增长而摊薄——明文越长相对膨胀越低,134 字节的英文长句只涨 83%,1 MB 明文则是 33.3%(趋近 Base64 本身的膨胀率)。要减小传输体积请直接传二进制而不是 Base64,本页面向的是文本场景。

迭代次数调高有什么用?调多少合适?

作用是线性拉高离线爆破成本。实测 10000 次 2.0 ms、100000 次 16.8 ms、310000 次 50.5 ms、600000 次 107.4 ms——次数翻倍耗时也翻倍,因为 PBKDF2 就是刻意设计的慢函数。OWASP 对 PBKDF2-HMAC-SHA256 的当前推荐是 600000 次,本页默认 310000 是在「留足余量」与「浏览器里少等一会儿」之间的折中。调高它不会让弱口令变强,只会让攻击者的每条猜测也变慢;口令本身太弱时,再高的迭代数也只是把几分钟的破解变成几小时。选口令请先用密码熵值计算器估一下熵值够不够。

这能替代 HTTPS 吗?

不能,这是本页最需要强调的边界。本页解决的是「一段文本在离开屏幕前被锁住」,不解决传输通道是否可读。如果你的明文是通过 HTTP 发出去的,中间人拿到的就是明文,加密这一步完全不起作用。正确用法是:先用 HTTPS 传输,再对确实需要保密的字段额外加密;或者只用 HTTPS 传输、不要自己重复加密。另一个不要做的事是把口令硬编码进页面——本页的示例口令就写在 HTML 里,那是演示值,不是让你照抄的。

为什么 IV 固定 12 字节?我传 8 字节会怎样?

因为 GCM 只有在 IV 恰为 96 位时才能把它直接当作初始计数器块用,其它长度需要先跑一次 GHASH 推导,白白多一遍运算。这 96 位是 NIST SP 800-38D 明确推荐的唯一非特殊长度。实测传 8 字节到 WebCrypto 直接抛 OperationError,不是「慢一点」,而是这个实现只接受 12 字节(以及另外几种更长/更短的长度),所以本页固定生成 12 字节。另外 IV 本身不保密,它明文放在封装里,安全性来自「每次都不一样」而不是「别人看不到」。

这个工具免费吗?明文和口令会上传吗?

免费,无需注册。加密、解密、随机数生成全部在浏览器本地通过 WebCrypto 完成,页面不发任何网络请求,也没有引入任何外部脚本——可以在开发者工具的 Network 面板与 Sources 面板里确认:没有请求,`subtle.encrypt` 不会联网(算法在本地执行)。明文与口令不写 Cookie、不写 localStorage、不做持久化,刷新页面即清空。需要知道的是,浏览器扩展理论上能读到页面里的输入框,这是所有网页工具的共同前提,不是本页特有的问题。

相关工具