CryptoJS aes加密函数PHP等效函数

iih3973s  于 2023-02-28  发布在  PHP
关注(0)|答案(2)|浏览(143)

我正在尝试用CryptoJS创建一个相当于这个JS代码的PHP:

function aesEncrypt (data) {
   const key = 'GSTEGSTEjdfheyhdHSHSHSHDHHDHmdjjdn12ndndn5r=';
   const iv = '\0';
   
   const cipher = CryptoJS.AES.encrypt(data, CryptoJS.enc.Base64.parse(key), {
       iv: CryptoJS.enc.Utf8.parse(iv), // parse the IV 
       padding: CryptoJS.pad.Pkcs7,
       mode: CryptoJS.mode.CBC
   })
   
   return cipher.toString()
}

js代码的结果:pHjpwiyKq7Rf4dFcBMbm1w==
这是我通过阅读其他stackoverflow问题编写的PHP代码。2但是它没有返回相同的结果。

$plaintext  = "plainText";
    $method     = 'aes-256-cbc';
    
    $key = base64_encode("GSTEGSTEjdfheyhdHSHSHSHDHHDHmdjjdn12ndndn5r=");
    $iv  = hex2bin('00000000000000000000000000000000');
            
    $ciphertext = openssl_encrypt(
                                   $plaintext,
                                   $method,
                                   $key,
                                   OPENSSL_RAW_DATA,
                                   $iv
                                );
    
    $ciphertext = base64_encode($ciphertext);
    
    echo $ciphertext;

PHP代码的结果:+YJOMi2vISmEXIjUZls3MA==

qnakjoqk

qnakjoqk1#

在PHP代码中,键必须是Base64de编码,而不是Base64编码:

$key = base64_decode("GSTEGSTEjdfheyhdHSHSHSHDHHDHmdjjdn12ndndn5r=");

通过此更改,创建了所需的密文。
注意,如果在openssl_encrypt()调用的第四个参数中传递的是0而不是OPENSSL_RAW_DATA,则默认情况下密文是Base64编码的,这样就不需要显式地对密文进行Base64编码。
请记住静态IV是不安全的,通常在加密过程中会生成一个 random IV,它会与密文沿着传递到解密端(通常是级联的)。

z9gpfhce

z9gpfhce2#

试试这个:

function encryptData($data, $key, $iv) {
  $cipher = "aes-256-cbc";
  $options = OPENSSL_RAW_DATA;

  $encrypted = openssl_encrypt($data, $cipher, $key, $options, $iv);
  $encrypted = base64_encode($encrypted);

  return $encrypted;
}

$message = "Message";
$key = "mysecretkey";
$iv = "myiv";

$encrypted = encryptData($message, $key, $iv);

echo $encrypted;

相关问题