关于 AES 加密
AES (Advanced Encryption Standard) 是一种对称加密算法,被广泛应用于数据保护。支持128、192、256位密钥长度,提供CBC、ECB、CFB、OFB、CTR等多种加密模式。所有加密操作在本地浏览器完成,不会上传到服务器。
AES 加解密
当前按原始字节处理:密钥不足 32 字节会补零、超长会截断。若后端用的是 PBKDF2 或 openssl enc,密文将无法互通——请在此切换为对应方式。
建议使用32字节(64个十六进制字符)的密钥
IV必须是16字节(32个十六进制字符)
认证加密模式,在加密的同时生成认证标签,解密时能发现密文被篡改。新系统首选。Nonce 固定 12 字节且不可重复使用。
最常用的模式,每个明文块先与前一个密文块进行异或后再加密。需要IV。
最简单的模式,每个明文块独立加密。不需要IV,但安全性较低。
流密码模式,可以加密任意长度的数据。需要IV。
新系统推荐 256 位密钥搭配 GCM 模式;CBC 仅在对接不支持 GCM 的旧系统时使用
密钥和IV应该使用加密安全的随机数生成
所有加密在浏览器本地完成,数据不会上传到服务器
请妥善保管密钥和IV,丢失后将无法解密
等价的后端代码
按你当前选择的模式、密钥长度与派生方式实时生成。密文对不上时,直接拿这段代码与后端逐行比对。
const crypto = require('crypto');
// 密钥派生:原始字节(不足补零 / 超长截断)
const key = Buffer.from(KEY_HEX, 'hex'); // 256 位
const iv = Buffer.from(IV_HEX, 'hex'); // 16 字节
const c = crypto.createCipheriv('aes-256-cbc', key, iv);
c.setAutoPadding(true);
const output = Buffer.concat([c.update(plaintext, 'utf8'), c.final()]).toString('base64');from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
# 密钥派生:原始字节(不足补零 / 超长截断)
key = bytes.fromhex(KEY_HEX) # 256 位
iv = bytes.fromhex(IV_HEX)
cipher = AES.new(key, AES.MODE_CBC, iv)
ct = cipher.encrypt(pad(plaintext.encode('utf-8'), AES.block_size))<?php
// 密钥派生:原始字节(不足补零 / 超长截断)
$key = hex2bin(KEY_HEX); // 256 位
$iv = hex2bin(IV_HEX);
$ct = openssl_encrypt($plaintext, 'aes-256-cbc', $key, OPENSSL_RAW_DATA, $iv);
$output = base64_encode($ct);// 密钥派生:原始字节(不足补零 / 超长截断)
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES"); // 256 位
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
c.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(ivBytes));
byte[] out = c.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));常见问题
AES 的 GCM 和 CBC 模式怎么选?
新系统一律优先选 GCM。GCM 属于认证加密(AEAD),在加密的同时产生一个认证标签,解密时能发现密文被篡改过,而 CBC 只保证机密性、不保证完整性,需要额外再套一层 HMAC 才等效。CBC 仍然保留是因为大量遗留系统和旧接口只支持它。GCM 的 IV(Nonce)固定 12 字节,且同一把密钥下绝对不能重复使用同一个 IV,否则会直接泄露明文信息。
为什么这里加密的结果,后端 Java / Python / PHP 解不出来?
九成以上是密钥派生方式不一致,而不是算法错。同样一句口令,本工具默认按「原始字节」处理(不足 16/24/32 字节补零、超长截断),OpenSSL 命令行默认走 EVP_BytesToKey,Spring 和不少框架又默认走 PBKDF2。三者算出来的实际密钥完全不同,密文自然对不上。请在「密钥派生」里选与后端相同的方式;如果用 PBKDF2,salt、迭代次数、摘要算法三项也必须逐一对齐。其次才检查模式、Padding、IV 和输入输出编码(Base64 还是 Hex)。
IV(初始化向量)需要保密吗?可以固定不变吗?
IV 不需要保密,通常直接和密文拼在一起传输或存储,但它必须每次加密都不同。CBC 模式下重复使用 IV 会让相同明文产生相同密文前缀,泄露数据规律;GCM 模式下重复使用 IV 的后果严重得多,攻击者可以借此恢复明文并伪造认证标签。本工具默认每次自动生成随机 IV,请不要为了「方便对接」把它写死成固定值。
ECB 模式为什么不安全,还能用吗?
ECB 对每个分组独立加密,相同的明文分组永远得到相同的密文分组,因此数据中的重复结构会原样保留下来——加密一张位图后仍能看出轮廓就是最经典的例子。它也完全不防篡改,攻击者可以随意重排、删除、复制分组。除了对接无法修改的老旧系统,不要在任何新代码里使用 ECB。本工具保留它仅为兼容排查用途。
AES-128、192、256 有必要都用 256 吗?
AES-128 在可预见的将来依然是安全的,NIST 至今没有建议淘汰它。256 位的实际收益主要在于抗量子计算的理论余量(Grover 算法把 256 位的强度折半到 128 位)。代价是密钥编排轮数更多,吞吐大约低 20% 到 40%。日常业务用 128 位完全够用,长期归档数据或有明确合规要求时再上 256 位。真正决定安全性的是密钥怎么生成和保管,而不是这个位数。
Padding 该选哪个?NoPadding 什么时候用?
默认选 PKCS7,它是绝大多数语言和框架的默认值,兼容性最好。ZeroPadding 只在对接特定老系统时使用,它有个固有缺陷:明文结尾本身就是 0x00 时无法正确还原。CTR、CFB、OFB 和 GCM 属于流式工作模式,本身不需要填充,此时选 NoPadding。如果解密后出现「乱码尾巴」或报填充错误,先核对两端 Padding 是否一致。
在这个页面加密,我的数据会被上传吗?
不会。全部加解密都在你自己的浏览器里完成:CBC、ECB、CFB、OFB、CTR 由 crypto-js 计算,GCM 与 PBKDF2 走浏览器原生的 Web Crypto 接口。明文、密钥和 IV 都不会发送到任何服务器,页面也不会把它们写进日志。分享链接同样不携带密钥。即便如此,仍不建议在任何在线工具里处理生产环境的真实密钥。
其他工具
哈希值生成工具
专业的哈希值生成工具,支持多种哈希算法,快速生成文件和文本的哈希值。
国密SM加解密工具
专业的国密SM加解密工具,支持SM2、SM3、SM4算法,保障数据安全。
API 签名生成工具
专业的HMAC和MD5签名生成工具,支持HMAC-SHA256/SHA512/MD5等多种哈希算法。适用于API接口签名、数据完整性验证、Webhook回调验证等场景。
RSA 加密解密工具
专业的RSA工具,支持密钥对生成(1024/2048/4096位)、公钥加密、私钥解密、数字签名与验证。支持RSA-OAEP和PKCS#1填充方案,PEM格式密钥兼容所有主流系统。
JWT 工具
免费在线 JWT 工具,提供 JWT 解析、验证、生成等功能,支持 HS256、RS256 等多种算法,简单易用。
MD5 加密
MD5 是一种广泛使用的密码散列函数,可以产生出一个 128 位(16 字节)的散列值(hash value),用于确保信息传输完整一致。
专业 Base64 编解码
Base64 是一种基于 64 个可打印字符来表示二进制数据的表示方法。常用于在 HTTP 环境下传递较长的标识信息。
图片转 Base64
将图片转换为 Base64 编码字符串,用于嵌入 HTML、CSS 或其他基于文本的格式中。
TOTP 验证码生成器
在线生成 2FA 动态验证码,输入 Base32 密钥实时出码并倒计时。支持 SHA-1/256/512、6 或 8 位、30 或 60 秒周期,可生成验证器可扫的 otpauth 二维码,并按 ±N 个时间窗校验验证码。密钥不上传。
UUID 生成器
为您的应用程序生成唯一标识符(UUID)。快速、安全、可靠。
摩斯密码工具
在线摩斯密码编解码工具,支持文本与摩斯密码的相互转换,并提供音频播放功能
邮箱解码工具
在线邮箱解码与编码工具,自动识别 29 种编码方式并逐层还原被混淆的邮箱地址,支持语法校验、风险检测与防采集代码生成。
URL 编码/解码
在线 URL 编码和解码工具,支持对 URL 进行编码和解码。
Unicode 转换工具
在 Unicode 编码、中文字符和英文字符之间进行转换,支持多种转换模式。
这个工具解决你的问题了吗?