0

代わりに、Horde /phpmyadminblowfish.phpライブラリを使用して暗号化されたアプリケーション間でデータを渡そうとしていmcryptます。私が次のようなことをした場合:

$key = "qwerty";
$data = "12345678";

$pma_cipher = new Horde_Cipher_blowfish;

print base64_encode( mcrypt_encrypt( MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_CBC ) );
print PMA_blowfish_encrypt( $data, $key );
print base64_encode( $pma_cipher->encryptBlock( $data, $key ) );
print base64_encode( $pma_cipher->encryptBlock( $data, $key ) );

出力は

pC+XbHWnqIg= // mcrypt
pC+XbHWnqIg= // PMA blowfish
pC+XbHWnqIg= // OK
WwkIWeYzlHw= // next block is different

さらに、データを変更すると、次のようになります。

$key = "qwerty";
$data = "123456789";

$pma_cipher = new Horde_Cipher_blowfish;

print base64_encode(mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_CBC));
print PMA_blowfish_encrypt( $data, $key );

私は今得ます:

pC+XbHWnqIjaCTiQlKkXRQ==
pC+XbHWnqIg99GXjyWLMmA==

Horde/PMAバージョンはブロックごとにキーを変更しているようです。

2つのライブラリを相互互換性のあるものにするためにmcrypt呼び出しを微調整する方法はありますか、それともどちらか一方を選択してそれに応じて調整する必要がありますか?

4

1 に答える 1

0

フグの s-box は、キーが同じインスタンスに設定されるたびにデザインが異なります。これが bcrypt ハッシュの仕組みです。

代わりにすべきことは次のとおりだと思います。

$pma_cipher = new Horde_Cipher_blowfish;

$pma_cipher->setKey( $key ); // Set the key only once!

print base64_encode( mcrypt_encrypt( MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_CBC ) );
print PMA_blowfish_encrypt( $data, $key );
print base64_encode( $pma_cipher->encryptBlock( $data ) ); // specifying the key resets it
print base64_encode( $pma_cipher->encryptBlock( $data ) ); // specifying the key resets it

これにより、毎回同じ結果が得られるはずです。

ただし、他の質問に関しては:

どちらかを選択して、それに応じて調整する必要があります

可能であれば、PMA で使用される生の PHP 実装よりもはるかにmcrypt_*高速な関数を使用する必要があります。そもそも、Blowfish は (少なくとも主要なセットアップでは) 遅いことで有名です。Cライブラリの代わりにPHPでそれを行うことは、フォールバックにすぎません。

于 2012-07-05T04:17:48.470 に答える