Maison  >  Article  >  développement back-end  >  Comment décrypter les données cryptées JavaScript CryptoJS AES en PHP ?

Comment décrypter les données cryptées JavaScript CryptoJS AES en PHP ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-02 11:09:31193parcourir

How to Decrypt JavaScript CryptoJS AES Encrypted Data in PHP?

Cryptage en JavaScript et décryptage en PHP

Problème

Un utilisateur crypte un mot de passe en JavaScript à l'aide du cryptage CryptoJS AES et en essayant de le déchiffrer en PHP en utilisant mcrypt_decrypt() mais en rencontrant des résultats incorrects.

Solution

La divergence provient de la méthode utilisée pour dériver la clé de chiffrement et le vecteur d'initialisation (IV) en JavaScript et PHP. CryptoJS dérive ces valeurs à l'aide d'un mot de passe, tandis que mcrypt_decrypt() de PHP n'attend qu'une clé.

Implémentation du décryptage PHP

Pour déchiffrer correctement le texte chiffré, le code PHP doit dériver la clé de cryptage et l'IV de le mot de passe et le sel de la même manière que le code JavaScript. Ceci peut être réalisé en utilisant une fonction comme evpKDF(), qui implémente la fonction de dérivation de clé basée sur le hachage (HKDF).

<code class="php">function evpKDF($password, $salt, $keySize = 8, $ivSize = 4, $iterations = 1, $hashAlgorithm = "md5") {
    // ... Implementation ...
}</code>

Une fois la clé et l'IV dérivées, mcrypt_decrypt() peut être invoquée comme suit :

<code class="php">$keyAndIV = evpKDF("Secret Passphrase", hex2bin($saltHex));
$decryptPassword = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, 
        $keyAndIV["key"], 
        hex2bin($cipherTextHex), 
        MCRYPT_MODE_CBC, 
        $keyAndIV["iv"]);</code>

Implémentation alternative utilisant OpenSSL

Alternativement, l'extension OpenSSL peut être utilisée pour déchiffrer le texte chiffré :

<code class="php">function decrypt($ciphertext, $password) {
    $ciphertext = base64_decode($ciphertext);
    if (substr($ciphertext, 0, 8) != "Salted__") {
        return false;
    }
    $salt = substr($ciphertext, 8, 8);
    $keyAndIV = evpKDF($password, $salt);
    $decryptPassword = openssl_decrypt(
            substr($ciphertext, 16), 
            "aes-256-cbc",
            $keyAndIV["key"], 
            OPENSSL_RAW_DATA, // base64 was already decoded
            $keyAndIV["iv"]);

    return $decryptPassword;
}</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn