[PHP-users 35576] Re: mcrypt_decrypt() が正しく複合化できない

hoshino @ digiadv.co.jp hoshino @ digiadv.co.jp
2011年 5月 26日 (木) 19:15:56 JST


星野です

おく@Workgroup様 ご指摘ありがとうございます。

しまった、鍵長が256bitが使えるからAES256なのでした。
サンプルコードを作っているときに短くしてしまいました。
恥ずかしい、、、

$key = '12345678901234567890123456789012' ;
にしても mcrypt_decrypt() は変なバイナリを返すのです

バイナリをbin2hexで表示してみました。
---
<?php
    $key = '12345678901234567890123456789012' ;
    $data = 'abcd1234' ;
    $data_enc = openssl_encrypt($data,'aes-256-ecb',$key,TRUE) ;

    $openssl_data  = openssl_decrypt($data_enc,'aes-256-ecb',$key,TRUE) ;
    $mcrypt_data   = mcrypt_decrypt('rijndael-256',$key,$data_enc,'ecb') ;

    echo $openssl_data ,"\n" ;
    echo bin2hex($openssl_data) ,"\n" ;
    echo bin2hex($mcrypt_data) ,"\n" ;
?>
---
結果
> abcd1234
> 6162636431323334
> 242a2e7c099eb918aa51b768442db1ffb90639e68c71eb82261dff762f7a1235

----- Original Message ----- 
From: <php-users @ itcom.jp>
To: "PHP-users ML" <php-users @ php.gr.jp>
Sent: Thursday, May 26, 2011 6:59 PM
Subject: [PHP-users 35575] Re:mcrypt_decrypt() が正しく複合化できない


> おく@Workgroupです。
> 
>> mcrypt以外(openssl_*系関数等)でAES256 ECBで暗号化したデータを
>> PHPの mcrypt_*系関数で復号出来ないようです。
> 
> 鍵のバイト数が25バイト以上であれば、復号できますよ。
> 
> mcrypt_module_get_supported_key_sizes(MCRYPT_RIJNDAEL_128)
> で確認できる鍵長のうち最小のものが選択される仕様のようですので、
> $key = substr($key . str_repeat("\0", 31), 0, 32);
> のように、ヌルでパディングしてあげれば大丈夫です。
> 
> 
> 2011年5月26日17:35 youo hoko <yoko00068 @ yahoo.co.jp>:
>> 星野と申します
>>
>> mcrypt以外(openssl_*系関数等)でAES256 ECBで暗号化したデータを
>> PHPの mcrypt_*系関数で復号出来ないようです。
>>
>> サンプルコード
>> ---
>> <?php
>>    $key = 'secret key' ;
>>    $data = 'abcd1234' ;
>>    $data_enc = openssl_encrypt($data,'aes-256-ecb',$key,TRUE) ;
>>
>>    echo "openssl:" , openssl_decrypt($data_enc,'aes-256-ecb',$key,TRUE),"\n" ;
>>    echo "mcrypt :" , mcrypt_decrypt('rijndael-256',$key,$data_enc,'ecb') ,"\n" ;
>> ?>
>> ---
>> 結果
>>> openssl:abcd1234
>>> mcrypt :[バイナリになってしまい表示不能]
>>
>> openssl_decrypt()とmcrypt_decrypt()の結果が違ってしまってます。
>>
>> その他試したこと
>>
>> ・PHPのmcryptで暗号化したものはPHPのmcryptで復号できる
>> ・PHPのopensslで暗号化したものはPerlのCrypt::Rijndaelで復号できる
>> ・PerlのCrypt::Rijndaelで暗号化したものはPHPのmcryptで復号できない
>> ・mcrypt_module_open() から使っても同じ結果です
>>
>> PHPのmcryptがおかしいように思います
>> というかlibmcryptがおかしいということでしょうか
>>
>> PHPのPKCS#5パディングがjava等と違うという問題もあるようですが、
>> パディング除去は複合化後の処理なので、関係ないと思います。
>>
>> 環境
>> # php -v
>>> PHP 5.3.0 (cli) (built: Nov  2 2009 05:23:58)
>>> Copyright (c) 1997-2009 The PHP Group
>>> Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies
>>
>> # uname -a
>>> Linux web2 2.6.18-164.6.1.el5 #1 SMP Tue Nov 3 16:12:36 EST 2009 x86_64 x86_64 x86_64 GNU/Linux
>>
>> # cat /etc/issue | head -1
>>> CentOS release 5.4 (Final)
>>
>> # rpm -qa | grep mcrypt
>>> libmcrypt-2.5.8-4.el5.centos
>>> libmcrypt-devel-2.5.8-4.el5.centos
>> _______________________________________________
>> PHP-users mailing list  PHP-users @ php.gr.jp
>> http://ml.php.gr.jp/mailman/listinfo/php-users
>> PHP初心者のためのページ - 質問する前にはこちらをお読みください
>> http://oldwww.php.gr.jp/php/novice.php3
>>
> _______________________________________________
> PHP-users mailing list  PHP-users @ php.gr.jp
> http://ml.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://oldwww.php.gr.jp/php/novice.php3


PHP-users メーリングリストの案内