加密解密
前端crypto-js库
key需要16位 24位和32
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AES Encryption and Decryption</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.2.0/crypto-js.min.js"></script>
</head>
<body>
<script>
// 加密函数
function encryptAES(plainText, key) {
var keyHex = CryptoJS.enc.Utf8.parse(key);
var encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(plainText), keyHex, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString(); // Base64 编码的字符串
}
// 解密函数
function decryptAES(cipherText, key) {
var keyHex = CryptoJS.enc.Utf8.parse(key);
var decrypted = CryptoJS.AES.decrypt(cipherText, keyHex, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return CryptoJS.enc.Utf8.stringify(decrypted); // 转换为 UTF-8 字符串
}
// 示例
var plainText = "222222";
var key = "tianmu2024123123";
// 加密
var encryptedText = encryptAES(plainText, key);
console.log("Encrypted Text (Base64): " + encryptedText);
// 解密
var decryptedText = decryptAES(encryptedText, key);
console.log("Decrypted Text: " + decryptedText);
</script>
</body>
</html>
php代码
<?php
<?php
// 加密函数
function encryptAES($plainText, $key, $iv = null) {
// 验证密钥长度
if (!in_array(strlen($key), [16, 24, 32])) {
die("Invalid key length. Key length must be 16, 24, or 32 bytes.");
}
$cipher = "aes-128-cbc"; // CBC 模式
$options = OPENSSL_RAW_DATA;
// 如果提供了 IV,则使用 CBC 模式,否则使用 ECB 模式
if ($iv !== null) {
$encrypted = openssl_encrypt($plainText, $cipher, $key, $options, $iv);
} else {
$cipher = "aes-128-ecb"; // ECB 模式
$encrypted = openssl_encrypt($plainText, $cipher, $key, $options);
}
return base64_encode($encrypted);
}
// 解密函数
function decryptAES($cipherText, $key, $iv = null) {
// 验证密钥长度
if (!in_array(strlen($key), [16, 24, 32])) {
die("Invalid key length. Key length must be 16, 24, or 32 bytes.");
}
$cipherText = base64_decode($cipherText);
$cipher = "aes-128-cbc"; // CBC 模式
$options = OPENSSL_RAW_DATA;
// 如果提供了 IV,则使用 CBC 模式,否则使用 ECB 模式
if ($iv !== null) {
$decrypted = openssl_decrypt($cipherText, $cipher, $key, $options, $iv);
} else {
$cipher = "aes-128-ecb"; // ECB 模式
$decrypted = openssl_decrypt($cipherText, $cipher, $key, $options);
}
return $decrypted;
}
// 示例
$plainText = "Hello, World!";
$key = "tianmu2024123123"; // 16 字符
$iv = openssl_random_pseudo_bytes(16); // 随机生成 16 字节的 IV
// 加密(使用 CBC 模式)
$encryptedTextCBC = encryptAES($plainText, $key, $iv);
echo "Encrypted Text (CBC Mode, Base64): " . $encryptedTextCBC . "\n";
// 解密(使用 CBC 模式)
$decryptedTextCBC = decryptAES($encryptedTextCBC, $key, $iv);
echo "Decrypted Text (CBC Mode): " . $decryptedTextCBC . "\n";
// 加密(使用 ECB 模式)
$encryptedTextECB = encryptAES($plainText, $key);
echo "Encrypted Text (ECB Mode, Base64): " . $encryptedTextECB . "\n";
// 解密(使用 ECB 模式)
$decryptedTextECB = decryptAES($encryptedTextECB, $key);
echo "Decrypted Text (ECB Mode): " . $decryptedTextECB . "\n";
?>
在 PHP 中,OPENSSL_RAW_DATA 模式下使用 PKCS #7 填充,可以确保加密和解密的数据与其他语言或工具的兼容性。此外,在 OpenSSL 函数中,通常默认会使用 PKCS #7 填充