JS实现AES加密并与PHP互通的方法分析

  

JS实现AES加密并与PHP互通的方法分析

1. 什么是AES加密算法

AES是高级加密标准(Advanced Encryption Standard)的缩写,它是一种对称加密算法,是目前应用最广泛的对称加密算法之一。AES加密算法具有安全、高效、灵活,可扩展性好等优点,被用于保护数据的安全性,比如在网络传输、文件存储等场景中。

2. JS如何实现AES加密

JS可利用CryptoJS等第三方库来实现AES加密。以下是基于CryptoJS的AES加密示例代码。

import CryptoJS from 'crypto-js';

/**
 * AES加密
 * @param {string} data - 待加密数据
 * @param {string} key - 密钥
 * @return {string} - 加密后的数据
 */
function aesEncrypt(data, key) {
  const cipher = CryptoJS.AES.encrypt(data, key);
  return cipher.toString();
}

以上代码实现了将字符串类型的明文进行AES加密,其中data为待加密的明文,key为加密密钥,cipher为加密后的密文。

3. PHP如何实现与JS互通的AES加密

PHP实现AES加密亦可借助第三方库,如PHP OpenSSL等。以下是基于PHP OpenSSL的AES加密示例代码。

/**
 * AES加密
 * @param {string} data - 待加密数据
 * @param {string} key - 密钥
 * @return {string} - 加密后的数据
 */
function aesEncrypt($data, $key) {
  $ivLen = openssl_cipher_iv_length('aes-128-cbc');
  $iv = openssl_random_pseudo_bytes($ivLen);
  $ciphertext = openssl_encrypt($data, 'aes-128-cbc', $key, OPENSSL_RAW_DATA, $iv);
  return base64_encode($iv . $ciphertext);
}

以上代码实现了将字符串类型的明文进行AES加密,其中data为待加密的明文,key为加密密钥,iv为加密初始化向量,ciphertext为加密后的密文。函数返回值采用base64编码可以方便地在网络传输中进行传递。

4. JS与PHP的AES加密互通

JS与PHP之间的AES加密互通需要确保使用相同的加密算法、密钥、加密向量等参数,才能正确地进行加密和解密。以下是JS与PHP之间的AES加密互通示例代码。

JS:

import CryptoJS from 'crypto-js';

/**
 * AES加密
 * @param {string} data - 待加密数据
 * @param {string} key - 密钥
 * @return {string} - 加密后的数据
 */
function aesEncrypt(data, key) {
  const iv = CryptoJS.lib.WordArray.random(128 / 8).toString(CryptoJS.enc.Hex);
  const cipher = CryptoJS.AES.encrypt(data, key, { iv: iv });
  const ciphertext = iv + cipher.ciphertext.toString(CryptoJS.enc.Hex);
  return ciphertext;
}

PHP:

/**
 * AES加密
 * @param {string} data - 待加密数据
 * @param {string} key - 密钥
 * @return {string} - 加密后的数据
 */
function aesEncrypt($data, $key) {
  $ivLen = openssl_cipher_iv_length('aes-128-cbc');
  $iv = openssl_random_pseudo_bytes($ivLen);
  $ciphertext = openssl_encrypt($data, 'aes-128-cbc', $key, OPENSSL_RAW_DATA, $iv);
  return base64_encode($iv . $ciphertext);
}

从以上代码可以看出,在JS中需要使用CryptoJS.lib.WordArray.random方法生成一个随机初始化向量iv,并将iv与密文cipher.ciphertext合并成一个字符串输出。在PHP中使用openssl_random_pseudo_bytes方法生成一个随机初始化向量$iv,并将$iv与加密后的密文字符串合并输出。两者使用的加密算法、加密模式、加密向量等参数必须保持一致,方能互通。

5. 实例说明

以下是一个在JS和PHP间实现互通的AES加密示例:

JS:

import CryptoJS from 'crypto-js';

const key = '12345678';
const plaintext = 'hello, world';
const ciphertext = aesEncrypt(plaintext, key);

console.log(ciphertext);
// 5704bc062f61606fa0fd29b4c5a8bc45

/**
 * AES加密
 * @param {string} data - 待加密数据
 * @param {string} key - 密钥
 * @return {string} - 加密后的数据
 */
function aesEncrypt(data, key) {
  const iv = CryptoJS.lib.WordArray.random(128 / 8).toString(CryptoJS.enc.Hex);
  const cipher = CryptoJS.AES.encrypt(data, key, { iv: iv });
  const ciphertext = iv + cipher.ciphertext.toString(CryptoJS.enc.Hex);
  return ciphertext;
}

PHP:

$key = '12345678';
$plaintext = 'hello, world';
$ciphertext = aesEncrypt($plaintext, $key);

echo $ciphertext . "\n";
// D7vLrjfez/XCNiaJcTohVw==

/**
 * AES加密
 * @param {string} data - 待加密数据
 * @param {string} key - 密钥
 * @return {string} - 加密后的数据
 */
function aesEncrypt($data, $key) {
  $ivLen = openssl_cipher_iv_length('aes-128-cbc');
  $iv = openssl_random_pseudo_bytes($ivLen);
  $ciphertext = openssl_encrypt($data, 'aes-128-cbc', $key, OPENSSL_RAW_DATA, $iv);
  return base64_encode($iv . $ciphertext);
}

从结果可以看出,JS和PHP之间的AES加密互通成功完成,加密结果一致。

相关文章