编码加密 · 对称加密

ChaCha20

ChaCha20-Poly1305

本地处理 · 不上传 免费 · 无需登录 无次数限制 累计 58 次使用
RFC 8439 ChaCha20 · 浏览器本地加解密 · 不上传
加解密参数chacha20 input
密钥key · 32 字节 · Hex
Noncenonce · 12 字节 · Hex
初始计数器counter
明文plaintext · UTF-8
密文
加解密结果result
点击「加密」或「解密」生成结果
就绪 · 填写参数后点击加密
第一节

关于本工具

About

数据包加密时,若对方指定了 ChaCha20-Poly1305 而非 AES,手写实现极易在 nonce 重复或认证标签截断上出错。粘贴明文与密钥,工具即时输出 256 位密钥下的加密结果与 128 位 Poly1305 认证标签,并校验 nonce 是否在 12 字节标准长度内。所有计算在浏览器本地完成,明文不离开设备——适合协议调试时快速验证实现正确性。

使用场景

API密钥本地加密

后端开发者在 .env 文件里存着阿里云OSS密钥,git push 前忘记移除,仓库被公开后密钥泄露。本工具用 ChaCha20-Poly1305 加密密钥字符串,输出 Base64 密文存入配置文件。解密时只需在服务端加载密钥,无需引入 OpenSSL 库,纯浏览器端即可完成加解密,适合 CI/CD 流水线中临时保护敏感参数。

聊天记录脱敏分享

产品经理需把用户投诉的微信聊天记录截图发给法务,但截图中包含对方手机号、微信号。用本工具将敏感字段单独加密,生成加密后的文本块发给法务,法务用预先约定的口令解密。ChaCha20 比 AES 在移动端快约 3 倍,且 Poly1305 认证标签能检测内容是否被篡改,确保证据链完整。

物联网固件OTA签名

智能门锁固件每次 OTA 升级包约 2MB,使用 AES-256-GCM 加密升级包时,服务器 CPU 占用飙到 90%。本工具用 ChaCha20-Poly1305 加密,在 ARM Cortex-M4 芯片上加密速度比 AES 快 40%。加密后的升级包加上 Poly1305 认证标签,门锁端验证签名后写入 Flash,防止中间人注入恶意固件。

SQL备份加密归档

DBA 每周日凌晨用 mysqldump 导出 500MB 的订单数据库,明文备份文件通过 rsync 传到异地灾备服务器。本工具在导出后立即用 ChaCha20 加密,加密速度约 1.2GB/s(单核),500MB 文件 0.4 秒完成。加密后的 .enc 文件上传到对象存储,密钥独立存储在 KMS 中,满足 PCI DSS 对静态数据的加密要求。

配置文件版本对比

运维工程师需对比生产环境和预发环境的 Nginx 配置文件差异,但两个文件均被 AES 加密,无法直接 diff。本工具支持 ChaCha20 解密,解密后直接显示明文内容。因 ChaCha20 是流密码,解密过程不产生填充字节,文件长度与原始明文完全一致,diff 结果零干扰,可直接定位到新增的 location 块。

第二节

使用指南

Getting Started

使用步骤

  1. 1在明文输入框粘贴待加密文本或十六进制数据,密钥字段自动生成 32 字节随机值
  2. 2点击「加密」按钮,右侧输出区立即显示密文(Base64 编码)与认证标签(16 字节)
  3. 3复制密文与标签到解密侧,点击「解密」按钮验证完整性并还原原始明文
  4. 4勾选「显示原始字节」开关,可查看加密前后的十六进制字节序列对比

输入输出示例

输入输出说明
Hello, World!a7f2c8b9d0e1f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7常规:典型短文本加密,验证基础加密流程和输出长度
(空字符串)(空字符串)边界:空输入的处理,部分实现可能报错或返回固定值,需确认工具是否支持
ab8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7边界:单字符输入,验证最小输入单元的处理
这是一个中文测试字符串,包含标点符号!c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8常规:中文字符加密,验证 UTF-8 编码兼容性
1234567890123456789012345678901234567890123456789012345678901234567890d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0边界:长字符串(超过 64 字节),验证大块数据加密的连续性和正确性
Hello, World!(密钥:0123456789abcdef0123456789abcdef)e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1易错:用户可能混淆输入与密钥,需提示密钥应单独设置而非拼入明文
(非 ASCII 字符:éüñ)f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e1f2易错:特殊 Unicode 字符(如重音符号)处理,不同实现可能因编码差异导致不同结果

常见错误对照

1.密钥长度不是 32 字节

✗ 错误直接输入 'mysecretkey1234567890'(22 字符)作为密钥
✓ 修复输入 32 字节的十六进制字符串,如 '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f'

ChaCha20 标准要求密钥固定为 256 位(32 字节)。短密钥会被工具自动截断或补零,导致与标准实现不兼容。

2.Nonce 长度不是 12 字节

✗ 错误输入 '12345678'(8 字符)作为 nonce
✓ 修复输入 12 字节的十六进制字符串,如 '000102030405060708090a0b'

IETF 标准(RFC 8439)规定 ChaCha20-Poly1305 的 nonce 为 96 位(12 字节)。其他长度(如 8 字节)是旧版实现,本工具按 IETF 标准处理。

3.密文与附加数据(AAD)混淆

✗ 错误将附加数据 'header' 直接拼接到密文前一起解密
✓ 修复解密时在 AAD 字段单独输入 'header',密文字段只放加密后的数据

Poly1305 认证标签覆盖 AAD + 密文,但解密时两者需分开输入。混在一起会导致认证失败,因为工具内部会按协议重新拼接计算。

4.明文/密文输入了非十六进制字符

✗ 错误输入 'Hello World' 作为待加密明文
✓ 修复先将明文转为十六进制,如 '48656c6c6f20576f726c64'

本工具所有输入框(密钥、nonce、明文、密文、AAD)均要求十六进制格式。直接输入 ASCII 字符串会被工具当作非法字符处理,导致加密失败。

5.解密时使用了不同的 nonce

✗ 错误加密时 nonce 用 '0001',解密时 nonce 留空或填 '0002'
✓ 修复解密时 nonce 必须与加密时使用的 nonce 完全一致,如 '0001'

ChaCha20 流密码的密钥流由密钥 + nonce 共同决定。nonce 不同则密钥流不同,解密结果完全是乱码,且 Poly1305 认证会失败。

6.密文长度不是 16 的倍数时误以为错误

✗ 错误加密后密文长度为 33 字节,觉得工具出 bug 了
✓ 修复正常使用,ChaCha20 是流密码,输出长度与明文长度一致,不需要填充

与 AES-CBC 等分组密码不同,ChaCha20 是流密码,按字节加密。密文长度 = 明文长度,不要求 16 字节对齐。Poly1305 标签额外附加 16 字节。

7.混淆了加密与认证的顺序

✗ 错误先对明文计算 Poly1305 标签,再加密明文
✓ 修复先对明文用 ChaCha20 加密,再对密文 + AAD 计算 Poly1305 标签

RFC 8439 规定的是 Encrypt-then-MAC 顺序:先加密,后认证。顺序颠倒会导致接收方无法验证密文的完整性,属于实现级错误。

第三节

工作原理

How It Works

核心公式

ChaCha20 轮函数: quarter_round(a, b, c, d) = (a += b; d ^= a; d <<<= 16; c += d; b ^= c; b <<<= 12; a += b; d ^= a; d <<<= 8; c += d; b ^= c; b <<<= 7)

变量说明

  • a, b, c, d32 位无符号整数,状态矩阵的 4 个元素
  • +=模 2^32 加法
  • ^=按位异或赋值
  • <<<=循环左移指定位数

示例

初始状态 a=0x11111111, b=0x01020304, c=0x77777777, d=0x01234567。执行一轮 quarter_round:a+=b → 0x11111111+0x01020304=0x12131415;d^=a → 0x01234567^0x12131415=0x13305172;d<<<16 → 0x51721330;c+=d → 0x77777777+0x51721330=0xC8E98AA7;b^=c → 0x01020304^0xC8E98AA7=0xC9EB89A3;b<<<12 → 0xEB89A3C9;a+=b → 0x12131415+0xEB89A3C9=0xFD9CB7DE;d^=a → 0x51721330^0xFD9CB7DE=0xACEEA4EE;d<<<8 → 0xEEA4EEAC;c+=d → 0xC8E98AA7+0xEEA4EEAC=0xB78E7953;b^=c → 0xEB89A3C9^0xB78E7953=0x5C07DA9A;b<<<7 → 0x03ED4CE2。最终 (a,b,c,d) = (0xFD9CB7DE, 0x03ED4CE2, 0xB78E7953, 0xEEA4EEAC)。

明文 + 密钥 + NonceChaCha20 核心(四轮 quarter round)密文流Poly1305 认证标签
输入 / 认证 核心加密 输出结果
第五节

常见问题

Q & A
我输入了一段文本,点加密后出来一堆乱码怎么办?

ChaCha20 是流密码,输出是二进制密文,工具会默认用 Base64 编码显示,所以看到的不是原始乱码而是一串字母数字符号。如果浏览器显示乱码,通常是字符编码问题——检查页面是否 UTF-8,或尝试复制密文到记事本另存为 UTF-8 再粘贴回来。本工具纯前端运行,不涉及服务端编码转换,所以结果完全由输入文本的编码决定。

加密时输入的密钥长度有没有限制?

ChaCha20 标准要求密钥固定 256 位(32 字节)。本工具输入框接受任意长度字符串,但内部会用 SHA-256 自动派生为 32 字节密钥,所以长度不限。注意:不同字符串即使只差一个字符也会生成完全不同的密钥,解密时必须用完全相同的原始字符串。如果直接复制密钥字符串,确保前后无空格。

为什么我用同一个密钥加密两次,得到的结果不一样?

这是正常现象。ChaCha20 每次加密会生成随机 nonce(一次性数字),nonce 不同导致密文不同,但解密时 nonce 会随密文一起存储,工具自动处理。只要密钥和密文完整,解密结果始终一致。如果你需要验证加密一致性,可以对比解密后的明文是否相同。

这个工具能加密文件吗?比如图片或 Word 文档?

本工具只接受文本输入,无法直接处理二进制文件。如果确实需要加密文件,可以先用 Base64 编码把文件转成文本字符串(网上有在线转换),复制到本工具加密;解密后再用 Base64 解码还原文件。注意文件较大时文本会很长,浏览器可能卡顿,建议 2MB 以内的文件操作,超过建议用本地程序。

加密后复制出来的密文,粘贴到别的地方解密失败怎么回事?

最常见的原因是复制时多了换行或空格。密文是 Base64 字符串,末尾可能有等号,粘贴时务必保持原样。另一个可能是对方用的解密工具算法不同——ChaCha20 有 IETF 版和原始版,nonce 长度不同(12 字节 vs 8 字节)。本工具用的是 IETF 版(12 字节 nonce),如果对方工具用原始版,需要确认兼容性。

这个工具加密安全吗?数据会不会传到服务器?

安全。本工具纯前端实现(FE),所有加密解密运算在浏览器内完成,数据不上传任何服务器。即使断网也能正常使用。密钥、明文、密文全程留在本地,刷新页面后自动清除。适合处理敏感信息,但注意浏览器本身有缓存和扩展风险,极高安全场景建议用离线专用软件。

ChaCha20 和 AES 比哪个好?为什么用这个不用 AES?

两者都是顶级对称加密算法。ChaCha20 在纯软件实现(无硬件加速)时比 AES 更快,尤其在移动端和低功耗设备上优势明显,且更抗时序攻击。本工具选择 ChaCha20 是因为纯前端运行,不依赖硬件 AES 指令集,兼容性和速度更好。AES 在有硬件加速的现代 CPU 上更快,但浏览器环境不一定保证。

我加密了一串密码,解密出来少了一两个字符是怎么回事?

大概率是密文在复制传输过程中被截断或修改了。ChaCha20 是流密码,密文长度与明文相同,不会自行丢失字符。检查密文末尾是否完整(Base64 编码的等号数量正确),以及是否被微信、邮件等系统自动换行或截断。建议将密文保存为纯文本文件而非直接粘贴到聊天框。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

选择 打开 +新窗口 esc关闭