PHP で暗号化、JavaScript (cryptojs) で復号化
問題文:
あなた基本的な暗号化/復号化、特に PHP での暗号化と PHP での復号化に関する課題に直面しています。 cryptojs を使用した Javascript。
説明:
PHP コードには、mcrypt ライブラリと Base64 エンコーディングによる暗号化が含まれています。一方、JavaScript コードは CryptoJS を使用して暗号化されたテキストを復号化しようとしますが、問題が発生します。
解決策:
提供されたコードには、古い暗号化技術、特に mcrypt が組み込まれています。これは使用が推奨されなくなりました。暗号化/復号化の目標を達成するには、PHP の openssl ライブラリに実装されている AES 暗号化を利用できます。
PHP 暗号化/復号化の実装:
<?php function encrypt($passphrase, $value) { $salt = openssl_random_pseudo_bytes(8); $salted = ''; $dx = ''; while (strlen($salted) < 48) { $dx = md5($dx . $passphrase . $salt, true); $salted .= $dx; } $key = substr($salted, 0, 32); $iv = substr($salted, 32, 16); $encrypted_data = openssl_encrypt(json_encode($value), 'aes-256-cbc', $key, true, $iv); $data = array("ct" => base64_encode($encrypted_data), "iv" => bin2hex($iv), "s" => bin2hex($salt)); return json_encode($data); } function decrypt($passphrase, $jsonStr) { $j = json_decode($jsonStr, true); $cipherParams = CryptoJS.lib.CipherParams.create({ ciphertext: CryptoJS.enc.Base64.parse(j.ct) }); if (j.iv) $cipherParams.iv = CryptoJS.enc.Hex.parse(j.iv) if (j.s) $cipherParams.salt = CryptoJS.enc.Hex.parse(j.s) $key = substr($result, 0, 32); $data = openssl_decrypt($ct, 'aes-256-cbc', $key, true, $iv); return json_decode($data, true); }
JavaScript復号化実装:
function decrypt(passphrase, encryptedData) { var cipherParams = CryptoJSAesJson.parse(encryptedData); var decrypted = CryptoJS.AES.decrypt(cipherParams, passphrase, {format: CryptoJSAesJson}).toString(CryptoJS.enc.Utf8); return decrypted; }
使用例:
$encrypted = encrypt('my passphrase', 'value to encrypt'); echo $encrypted; // Encrypted data with salt, iv, and cipher text
var decrypted = decrypt('my passphrase', $encrypted); console.log(decrypted); // Original 'value to encrypt'
このアプローチは、PHP と Javascript の間で安全で相互運用可能な暗号化/復号化を保証します。最新の暗号化技術と cryptojs との互換性の維持。
以上がPHP でデータを安全に暗号化し、CryptoJS を使用して復号化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。