JavaScript では、パスワードを利用して CryptoJS を使用して暗号化されたユーザー パスワードが作成されます。キーと IV の両方に基づいたキー導出。ただし、mcrypt ライブラリを使用した PHP サーバーでの復号化の試行は失敗し、意味のない復号化文字列が生成されました。
主なエラーは、JavaScript (CryptoJS) で採用されている異なる暗号化方式に起因します。 ) および PHP (mcrypt)。 CryptoJS では、キーと IV はパスワードから派生しますが、mcrypt は暗号化/復号化のためにパスワードのみに依存します。これを修正するには、CryptoJS で使用されているのと同様の手法を使用して、キーと IV を PHP で生成する必要があります。
saltHex および cipherTextHex パラメータを PHP サーバーに転送し、強化された JavaScript 暗号化プロセスが実装されました:
<code class="javascript">var encryptedPassword = CryptoJS.AES.encrypt(password, "Secret Passphrase"); var ivHex = encryptedPassword.iv.toString(); var saltHex = encryptedPassword.salt.toString(); var cipherTextHex = encryptedPassword.ciphertext.toString();</code>
次の PHP 関数は、パスワードとソルトからキーと IV を導出します:
<code class="php">function evpKDF($password, $salt, $keySize = 8, $ivSize = 4, $iterations = 1, $hashAlgorithm = "md5") { /* ... code for key and IV derivation ... */ return [ "key" => substr($derivedBytes, 0, $keySize * 4), "iv" => substr($derivedBytes, $keySize * 4, $ivSize * 4) ]; }</code>
派生キーと IV を使用して、PHP で復号化が実行されます。
<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>
OpenSSL 拡張機能の使用は、復号化の代替手段です。
<code class="php">$decryptPassword = openssl_decrypt( substr($ciphertext, 16), "aes-256-cbc", $keyAndIV["key"], OPENSSL_RAW_DATA, $keyAndIV["iv"]);</code>
これらの変更により、JavaScript と PHP の間でユーザー パスワードのシームレスな暗号化と復号化が可能になり、安全なデータ処理が保証されます。
以上がmcryptを使用してPHPでCryptoJSで暗号化されたパスワードを復号化する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。