Substitute Horde/phpmyadmin blowfish.php for mcrypt


Substitute Horde/phpmyadmin blowfish.php for mcrypt

我正在尝试使用Horde/phpmyadmin blowfish.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==

似乎部落/PMA 版本在每个块上都在更改密钥。

有没有办法调整 mcrypt 调用以使两个库交叉兼容,或者我应该选择一个或另一个并相应地调整内容?

每次在同一

实例上设置密钥时,河豚 s 盒的设计都会有所不同。这就是 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

这应该每次都给你相同的结果。

不过,就您的另一个问题而言:

我应该选择一个或另一个并相应地调整事情

如果可能的话,你应该使用mcrypt_*函数,因为它们比PMA使用的原始PHP实现快得多。河豚首先是出了名的慢(至少在关键设置中);在 PHP 而不是 C 库中这样做应该只是一个后备。