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

Mary-Kate Olsen
Libérer: 2024-11-02 11:09:31
original
192 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!