加密解密

前端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 填充

Last modification:September 14, 2024
如果觉得我的文章对你有用,请随意赞赏