Ionic 尝试解密加密数据时,使用openssl_decrypt()不显示任何内容

js5cn81o  于 2022-12-28  发布在  Ionic
关注(0)|答案(1)|浏览(166)

我尝试在PHP中解密来自ionic的数据,但它没有使用openssl_decrypt()解密。
在我的离子应用程序中,我可以加密,也测试了解密功能,效果很好。下面是加密和解密功能:

加密

encrypt(key, iv, value){
    const encrypted = CryptoJS.AES.encrypt(value, key, { iv: iv });

    const encryptedMessage = encrypted.toString();
    return encryptedMessage;
   }

解密

decrypt(value, keys, ivs){
    const decryptedMessage = CryptoJS.AES.decrypt(value, keys, { iv: ivs 
  }).toString(CryptoJS.enc.Utf8);

   return decryptedMessage;
  }

使用密钥和iv加密数据

$iv = "048eb25d7a45ff00";
$key = "feda4f2f67e7aa96";
$encrypted = "U2FsdGVkX1+kBV6Q5BQrjuOdi4WLiu4+QAnDIkzJYv5ATTkiiPVX8VcDUpMqSeIwCfyTNQOosp/9nYDY4Suu4/Lmhh2quKBU7BHGOtKwu9o=";

**To decrypt in PHP**

<?php

    // Use openssl_decrypt() function to decrypt the data
    $output = openssl_decrypt($encrypted, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
    echo $output;

?>

我该怎么解密这个?

n3schb8v

n3schb8v1#

在CryptoJS代码中,密钥材料作为字符串传递,这就是为什么它被解释为密码并应用密钥派生。使用的密钥派生函数是OpenSSL专有的EVP_BytesToKey()。在加密期间,CryptoJS.AES.encrypt()执行以下操作:

  • 隐式生成8字节salt。
  • 使用EVP_BytesToKey()根据salt和密码派生32字节密钥和16字节IV。
  • 用密钥和IV加密明文,* 忽略 * 任何显式传递的IV(这里是048eb25d7a45ff00)!
  • 将数据转换为OpenSSL格式(通过encrypted.toString()):Salted__的ASCII编码的Base64编码,后跟8字节salt和实际密文。

因此,必须按如下方式进行解密:

  • 将salt和实际密文分开。
  • 使用EVP_BytesToKey()从salt和password派生32字节的密钥和16字节的IV。注意,IV 048eb25d7a45ff00不是必需的。
  • 用密钥和IV解密密文。

一种可能的实现方式:

// Separate salt and actual ciphertext
$saltCiphertext = base64_decode("U2FsdGVkX1+kBV6Q5BQrjuOdi4WLiu4+QAnDIkzJYv5ATTkiiPVX8VcDUpMqSeIwCfyTNQOosp/9nYDY4Suu4/Lmhh2quKBU7BHGOtKwu9o=");
$salt = substr($saltCiphertext, 8, 8);
$ciphertext = substr($saltCiphertext, 16);

// Separate key and IV
$keyIv = EVP_BytesToKey($salt, "feda4f2f67e7aa96");
$key = substr($keyIv, 0, 32);
$iv = substr($keyIv, 32, 16);

// Decrypt using key and IV
$decrypted = openssl_decrypt($ciphertext, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
print($decrypted . PHP_EOL); // {"username":"07069605705","password":"father2242"}

// KDF EVP_BytesToKey()
function EVP_BytesToKey($salt, $password) {
    $bytes = ''; $last = '';
    while(strlen($bytes) < 48) {
        $last = hash('md5', $last . $password . $salt, true);
        $bytes.= $last;
    }
    return $bytes;
}

注意:EVP_BytesToKey()现在被认为是不安全的,不应该使用。一个更安全的选择是PBKDF 2,它被CryptoJS和PHP支持。

相关问题