ホームページ >バックエンド開発 >PHPチュートリアル >暗号化を Mcrypt から OpenSSL に移行し、OpenSSL を使用して Mcrypt で暗号化されたデータを復号化できますか?

暗号化を Mcrypt から OpenSSL に移行し、OpenSSL を使用して Mcrypt で暗号化されたデータを復号化できますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-05 07:16:11868ブラウズ

Can I Migrate My Encryption from Mcrypt to OpenSSL, and Decrypt Mcrypt-Encrypted Data Using OpenSSL?

暗号化ライブラリを Mcrypt から OpenSSL にアップグレードする

暗号化ライブラリを Mcrypt から OpenSSL にアップグレードできますか? OpenSSL では、Mcrypt で暗号化されたデータを復号化することはできますか? 2 つの異なる投稿で矛盾する情報が提供されています。

質問: 暗号化ライブラリを Mcrypt から OpenSSL にアップグレードすることは可能ですか?もしそうなら、どのようにして?

回答: はい、暗号化ライブラリを Mcrypt から OpenSSL にアップグレードすることができます。

質問: できますか? Mcrypt で暗号化されたデータを復号化するOpenSSL?

答え: はい、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);

    return $dec;
}

追加メモ:

  • openssl_decrypt() 関数では、iv パラメーターがブロック サイズと同じ長さである必要があります。
  • iv パラメータがブロック サイズと同じ長さでない場合使用されている暗号を確認するには、CBC モードで openssl_decrypt() 関数を使用する必要があります。

テスト:

次のコードを使用して、 decrypt() 関数をテストします:

$keys = [
    'this is a secret key.',
    'G906m70p(IhzA5T&5x7(w0%a631)u)%D6E79cIYJQ!iP2U(xT13q6)tJ6gZ3D2wi&0")7cP5',
    chr(6) . chr(200) . chr(16) . 'my key ' . chr(3) . chr(4) . chr(192) . chr(254) . ' zyx0987!!',
    'and finally one more key to test with here:',
];


$data = [
    'A',
    'This is a test',
    'now test encrypting something a little bit longer with 1234567890.',
    '$length = mcrypt_get_block_size(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC); $last = ord($data[strlen($data) - 1]);',
    'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sit amet pharetra urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Ut fringilla, quam sed eleifend eleifend, justo turpis consectetur tellus, quis tristique eros erat at nibh. Nunc dictum neque vel diam molestie fermentum. Pellentesque dignissim dui quis tortor eleifend, ut maximus elit egestas. Donec posuere odio et auctor porta. Quisque placerat condimentum maximus. Curabitur luctus dolor eget sem luctus, in dignissim tortor venenatis. Mauris eget nulla nisl.',
];

$failures = 0;

foreach ($data as $datum) {
    foreach ($keys as $key) {
        $enc = new Encryption(MCRYPT_BLOWFISH, MCRYPT_MODE_CBC);

        $encrypted = $enc->encrypt($datum, $key);

        $dec = new EncryptionOpenSsl('bf-cbc');

        $decrypted = $dec->decrypt($encrypted, $key);

        if (strcmp($datum, $decrypted) !== 0) {
            echo "Encryption with key '$key' of '$datum' failed.  '$decrypted' != '$datum'<br><br>\n\n";
            $failures++;
        }
    }
}

if ($failures) {
    echo "$failures tests failed.<br>\n";
} else {
    echo "ALL OKAY<br>\n";
}

以上が暗号化を Mcrypt から OpenSSL に移行し、OpenSSL を使用して Mcrypt で暗号化されたデータを復号化できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。