質問: mcrypt_ecb(MCRYPT_BLOWFISH,$my_key,$my_data,MCRYPT_DECRYPT); echo $c_data; ``` 上記のコードですがPHP5.3.3 (mcrypt 2.5.8)だと"Dz}「ツ鞅"という全く異なる文字列となってしまいます。 いろいろ試してみるとPHP4.4.4上で暗号化された文字列がPHP5.3.3で復号できなくて困っております。 (実際は、暗号化された文字列はデータベースに格納されています。) どうにかして、"xfZ3ruQZ+Is=" という暗号化された文字列をPHP5.3.3でも正しく"my_data"に復号する方法はありませんでしょうか? mcrypt_ecb()が廃止される関数であることは承知しておりますが、レガシーシステムなのでそれは承知の上でこの関数を使っております。 実際の環境では、PHP4.4.4でmcrypt_ecb(MCRYPT_BLOWFISH,...)関数で暗号化された文字列がOracleデータベース上に格納されておりまして、これらのデータを新しいPHP5.3.3の環境で復号化したいのです。膨大なデータなので移行データを整備することは避けて既存のデータをそのまま復号化したいと考えています。 どなたかお助けください。
回答: PHPではなくmcryptのバージョンの違いによるものと思われます。 詳細はさておき、古いmcryptのBlowfish実装にはバグがあり、mcrypt 2.5 で実装が修正、もとい変更されたようです。今回の場合、旧環境が mcrypt 2.2.x 、新環境が mcrypt 2.5.8 とのことなので、古い実装で暗号化されたものを新しい実装で復号しようとして、おかしな結果になっています。 古い実装は blowfish-compat として今でも残っており、PHPからだと `MCRYPT_BLOWFISH` の代わりに `MCRYPT_BLOWFISH_COMPAT` を指定します。(実行例) * PHP :: Bug #18267 :: mcrypt-blowfish data encrypted on one machine not decryptable on other machine * What's the difference between Blowfish and Blowfish-compat? - Stack Overflow なお `mcrypt_ecb()` が廃止予定という点については、マニュアルに記載がある通り、`mcrypt_encrypt()` `mcrypt_decrypt()` に変更すればよいかと思います。こちらの関数も PHP 4.0.2 以上であれば使えます。 ``` // mcrypt_ecb(MCRYPT_BLOWFISH,$my_key,$my_data,MCRYPT_ENCRYPT); mcrypt_encrypt(MCRYPT_BLOWFISH, $my_key, $my_data, MCRYPT_MODE_ECB); // mcrypt_ecb(MCRYPT_BLOWFISH,$my_key,$my_data,MCRYPT_DECRYPT); mcrypt_decrypt(MCRYPT_BLOWFISH, $my_key, $my_data, MCRYPT_MODE_ECB); ```