五岁小站 - 免费在线工具箱

加载中...

AES 加解密

当前: 0 字符
当前: 0 字符
字符数: 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 被认为是目前最安全的对称加密算法之一。

参数说明

🔑 密钥 (Key)
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
- 不要使用弱密码作为密钥

安全说明

🛡️ 本地处理
所有加密解密计算都在浏览器中完成,数据不会上传到服务器

🔐 密钥安全
请妥善保管您的密钥,密钥丢失将无法解密数据

💡 跨平台兼容
本工具生成的密文可以在其他语言/平台中解密,只需保证参数一致