AES 加解密
字符数: 0 | 字节数: 0
长度: 0 字符
常用配置模板
代码示例
// 使用 CryptoJS 库
const CryptoJS = require('crypto-js');
// 加密
function encrypt(text, key, iv) {
const encrypted = CryptoJS.AES.encrypt(text, CryptoJS.enc.Utf8.parse(key), {
iv: CryptoJS.enc.Utf8.parse(iv),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString(); // Base64
}
// 解密
function decrypt(ciphertext, key, iv) {
const decrypted = CryptoJS.AES.decrypt(ciphertext, CryptoJS.enc.Utf8.parse(key), {
iv: CryptoJS.enc.Utf8.parse(iv),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return decrypted.toString(CryptoJS.enc.Utf8);
}
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
import base64
def encrypt(text, key, iv):
cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))
padded = pad(text.encode('utf-8'), AES.block_size)
encrypted = cipher.encrypt(padded)
return base64.b64encode(encrypted).decode('utf-8')
def decrypt(ciphertext, key, iv):
cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))
decrypted = cipher.decrypt(base64.b64decode(ciphertext))
return unpad(decrypted, AES.block_size).decode('utf-8')
# pip install pycryptodome
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class AESUtil {
public static String encrypt(String text, String key, String iv) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes("UTF-8"));
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
byte[] encrypted = cipher.doFinal(text.getBytes("UTF-8"));
return Base64.getEncoder().encodeToString(encrypted);
}
public static String decrypt(String ciphertext, String key, String iv) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes("UTF-8"));
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(ciphertext));
return new String(decrypted, "UTF-8");
}
}
package main
import (
"crypto/aes"
"crypto/cipher"
"encoding/base64"
)
func Encrypt(text, key, iv string) (string, error) {
block, err := aes.NewCipher([]byte(key))
if err != nil {
return "", err
}
plaintext := PKCS7Padding([]byte(text), block.BlockSize())
mode := cipher.NewCBCEncrypter(block, []byte(iv))
ciphertext := make([]byte, len(plaintext))
mode.CryptBlocks(ciphertext, plaintext)
return base64.StdEncoding.EncodeToString(ciphertext), nil
}
func Decrypt(ciphertext, key, iv string) (string, error) {
block, _ := aes.NewCipher([]byte(key))
data, _ := base64.StdEncoding.DecodeString(ciphertext)
mode := cipher.NewCBCDecrypter(block, []byte(iv))
plaintext := make([]byte, len(data))
mode.CryptBlocks(plaintext, data)
return string(PKCS7UnPadding(plaintext)), nil
}
<?php
function encrypt($text, $key, $iv) {
$encrypted = openssl_encrypt($text, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
return base64_encode($encrypted);
}
function decrypt($ciphertext, $key, $iv) {
$data = base64_decode($ciphertext);
return openssl_decrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
}
// 使用示例
$key = "12345678901234567890123456789012"; // 32字节
$iv = "1234567890123456"; // 16字节
$encrypted = encrypt("Hello World", $key, $iv);
$decrypted = decrypt($encrypted, $key, $iv);
?>
AES 加密模式对比
| 模式 | 需要IV | 并行处理 | 安全性 | 特点 |
|---|---|---|---|---|
| CBC | 是 | 仅解密 | 推荐 | 最常用,每块依赖前一块 |
| ECB | 否 | 是 | 不推荐 | 简单但不安全,相同明文产生相同密文 |
| CTR | 是 | 是 | 推荐 | 流加密模式,速度快 |
| CFB | 是 | 仅解密 | 可用 | 流加密模式,自同步 |
| OFB | 是 | 否 | 可用 | 流加密模式,错误不传播 |
AES 加密是什么?
AES (Advanced Encryption Standard) 高级加密标准,是一种对称加密算法,即加密和解密使用相同的密钥。AES 是目前最广泛使用的加密算法之一,被美国政府采用作为加密标准。
AES 支持 128、192、256 位三种密钥长度,密钥越长安全性越高。AES-256 被认为是目前最安全的对称加密算法之一。
AES 支持 128、192、256 位三种密钥长度,密钥越长安全性越高。AES-256 被认为是目前最安全的对称加密算法之一。
参数说明
🔑 密钥 (Key)
AES-128 需要 16 字节密钥,AES-192 需要 24 字节,AES-256 需要 32 字节。密钥必须保密,是加解密的核心
📐 偏移量 (IV)
初始化向量,固定 16 字节。用于增加加密随机性,相同明文+不同IV = 不同密文。ECB模式不需要IV
📦 填充方式 (Padding)
AES 要求明文长度是 16 字节的整数倍,不足时需要填充。PKCS7 是最常用的填充方式
🔄 加密模式 (Mode)
决定如何处理多个数据块。CBC 最常用且安全,ECB 简单但不安全,CTR 适合流式数据
AES-128 需要 16 字节密钥,AES-192 需要 24 字节,AES-256 需要 32 字节。密钥必须保密,是加解密的核心
📐 偏移量 (IV)
初始化向量,固定 16 字节。用于增加加密随机性,相同明文+不同IV = 不同密文。ECB模式不需要IV
📦 填充方式 (Padding)
AES 要求明文长度是 16 字节的整数倍,不足时需要填充。PKCS7 是最常用的填充方式
🔄 加密模式 (Mode)
决定如何处理多个数据块。CBC 最常用且安全,ECB 简单但不安全,CTR 适合流式数据
使用建议
✅ 推荐做法
- 使用 AES-256-CBC 或 AES-256-CTR
- 每次加密使用随机 IV,并将 IV 与密文一起存储/传输
- 密钥使用安全的随机数生成器生成
- 考虑使用 HMAC 验证密文完整性
❌ 避免做法
- 不要使用 ECB 模式加密敏感数据
- 不要硬编码密钥在代码中
- 不要重复使用相同的 IV
- 不要使用弱密码作为密钥
- 使用 AES-256-CBC 或 AES-256-CTR
- 每次加密使用随机 IV,并将 IV 与密文一起存储/传输
- 密钥使用安全的随机数生成器生成
- 考虑使用 HMAC 验证密文完整性
❌ 避免做法
- 不要使用 ECB 模式加密敏感数据
- 不要硬编码密钥在代码中
- 不要重复使用相同的 IV
- 不要使用弱密码作为密钥
安全说明
🛡️ 本地处理
所有加密解密计算都在浏览器中完成,数据不会上传到服务器
🔐 密钥安全
请妥善保管您的密钥,密钥丢失将无法解密数据
💡 跨平台兼容
本工具生成的密文可以在其他语言/平台中解密,只需保证参数一致
所有加密解密计算都在浏览器中完成,数据不会上传到服务器
🔐 密钥安全
请妥善保管您的密钥,密钥丢失将无法解密数据
💡 跨平台兼容
本工具生成的密文可以在其他语言/平台中解密,只需保证参数一致
