29934


PHP4.4.4(mcrypt 2.2.x) 上で構築されたWEBシステムがあるのですが、  
今現在それをPHP5.3.3(mcrypt 2.5.8)に移行しようと思っています。  
下のようにmcrypt_ecb()関数を使って正しく "my_data" という文字に  
復号化するプログラムがあります。

[code]

    $my_data = "xfZ3ruQZ+Is=";  
       // "xfZ3ruQZ+Is="という文字はPHP4.4.4上で
       // base64_encode(mcrypt_ecb(MCRYPT_BLOWFISH,"my_key","my_data",MCRYPT_ENCRYPT)) 
       // で暗号化された文字列です。
    
    $my_key = "my_key";
    $my_data = base64_decode($my_data);
    $c_data = mcrypt_ecb(MCRYPT_BLOWFISH,$my_key,$my_data,MCRYPT_DECRYPT);
    echo $c_data;
    
[/code]

上記のコードですが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の環境で復号化したいのです。膨大なデータなので移行データを整備することは避けて既存のデータをそのまま復号化したいと考えています。

どなたかお助けください。


CC BY-SA 3.0
2016-10-27T04:01:15.200
29930
2016-10-27T05:43:48.437
2016-10-27T05:43:48.437
8000
19334
question
php
MCRYPT_BLOWFISHでの暗号化／復号化の結果が PHP4.4.4 と 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`
を指定します。（[実行例](https://wandbox.fetus.jp/permlink/C9WYMjphNXcbPw27)）

  * [PHP :: Bug #18267 :: mcrypt-blowfish data encrypted on one machine not decryptable on other machine](https://bugs.php.net/bug.php?id=18267)
  * [What's the difference between Blowfish and Blowfish-compat? - Stack Overflow](https://stackoverflow.com/q/11422497/2818869)

なお `mcrypt_ecb()`
が廃止予定という点については、[マニュアル](https://www.php.net/manual/ja/function.mcrypt-
ecb.php)に記載がある通り、`mcrypt_encrypt()` `mcrypt_decrypt()` に変更すればよいかと思います。こちらの関数も
PHP 4.0.2 以上であれば使えます。

[code]

    // 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);
    
[/code]


CC BY-SA 3.0
2016-10-27T05:40:57.457
29934
2016-10-27T05:40:57.457
2023-11-17T20:01:02.963
-1
8000
29930
answer