Mcrypt と OpenSSL の互換性については議論の余地があります。一部の情報源では、OpenSSL は Mcrypt を使用して暗号化されたデータを復号化できないと主張していますが、他の情報源では、パディングを使用すれば復号化が可能であると示唆しています。
[Post 1](https://stackoverflow.com/a/19748494/) 5834657) は復号化が不可能であると述べていますが、[Post 2](https://stackoverflow.com/a/31614770/5834657) は、適切なパディングで達成可能であることを示唆しています。ただし、投稿で提供されているパディングの例は Mcrypt 専用であり、OpenSSL には適用できない可能性があります。
互換性をテストするために、既存の Mcrypt コードを次のように変更しました。 OpenSSLを使用します。変更された復号化関数は次のようになります:
public function decrypt($data, $key) { $salt = substr($data, 0, 128); $enc = substr($data, 128, -64); $mac = substr($data, -64); list ($cipherKey, $macKey, $iv) = $this->getKeys($salt, $key); if ($mac !== hash_hmac('sha512', $enc, $macKey, true)) { return false; } $dec = openssl_decrypt($enc, $this->cipher, $cipherKey, OPENSSL_RAW_DATA, $iv); $data = $this->unpad($dec); return $data; }
この変更されたコードをテストするには、Mcrypt ライブラリで文字列を暗号化し、OpenSSL ベースのコードを使用して復号化を試みます。しかし、空返事しか返ってこない。エラーは $data = $this->unpad($dec) 行から発生しているようです。この行をコメントアウトすると、元の暗号化形式に似たごちゃ混ぜの文字列が得られました。
残念ながら、OpenSSL を使用して Mcrypt で暗号化されたデータを復号化する試みは失敗しました。 Mcrypt で使用される特定のパディングが OpenSSL と互換性がない可能性や、正常な復号化を妨げる他の根本的な非互換性がある可能性があります。
Mcrypt で暗号化された暗号化を復号化することが本当に不可能であるかどうかを判断するには、さらなる調査が必要です。 OpenSSL を使用したデータ、またはまだ発見されていない回避策がある場合。
以上がOpenSSL は Mcrypt で暗号化されたデータを復号化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。