AES / RSA 加解密
AES-GCM/CBC 对称加解密、RSA-OAEP 加解密、RSA-PSS 签名验签,走浏览器原生 WebCrypto。
使用说明
- AES 面板:口令经 PBKDF2-SHA256(默认 10 万次迭代)拉伸成 256 位密钥。加密结果是一段自打包字符串
AES-256-GCM$迭代次数$salt$IV$密文,每段都是 base64;对方整串粘进来点「解密」即可,salt 与 IV 自动从串里取。 - GCM 自带 16 字节认证标签,密文被改动一个字节就直接解不开;CBC 只保证机密性,不带完整性校验,这也是默认选 GCM 的原因。要对接只支持 CBC 的老系统时再切过去。
- 要跟外部系统对接时,把「密钥来源」切成「直接给 32 字节密钥」,salt 与 IV 也支持手动指定(64 位十六进制按 hex 解析,其余按 base64)。
- RSA 面板先生成密钥对(2048 / 3072 / 4096 位),导出为 SPKI / PKCS#8 的 PEM。公钥加密、私钥解密用 RSA-OAEP + SHA-256;签名验签用 RSA-PSS + SHA-256,salt 长度 32 字节。
- 所有运算由浏览器
crypto.subtle完成,页面不发任何网络请求,密钥只在当前页面内存里,刷新即消失。
为什么 RSA 加密长文本会报错?
RSA 单次可加密的长度是算法写死的:2048 位密钥减掉 OAEP + SHA-256 的 66 字节填充,只剩 190 字节(3072 位 318 字节、4096 位 446 字节)。要加密长文本,正确做法是用 AES 加密正文、再用 RSA 加密那把 AES 密钥,也就是数字信封。
支持 DES / 3DES / RC4 吗?
不支持,也没有计划支持。DES 的 56 位密钥今天可以暴力破解,3DES 有 Sweet32 生日攻击,RC4 的输出存在可统计偏差,现代浏览器已经把三者全部移除。要兼容老系统,应该让服务端升级到 AES。
为什么用 file:// 打开时这个页面用不了?
WebCrypto 的 crypto.subtle 只在安全上下文(HTTPS 或 localhost)里暴露。用 file:// 直接打开 HTML 时浏览器会禁用该接口,这是规范要求,不是本页的限制。