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

加载中...

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

安全说明

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

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

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

🍵 若这份小工具帮到了你

不必多,一杯茶的心意,就是我们继续把它打磨得更好用的动力 🌿

微信 / 支付宝收款码