我正在尝试使用mcrypt
代替使用Horde / phpmyadmin blowfish.php library加密的应用程序之间传递数据。如果我这样做:
$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调用以使两个库交叉兼容,或者我应该选择其中一个并相应地调整内容?
答案 0 :(得分: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
每次都应该给你相同的结果。
就你的另一个问题而言:
我应该选择其中一个并相应调整一下
如果可能,您应该使用mcrypt_*
函数,因为它们比PMA使用的原始PHP实现更快更多。首先,河豚是很慢的(至少在关键设置中);在PHP而不是C库中执行此操作应该只是一个后备。