2016-09-22 45 views
3

我试图使用PHP 5.2.9(在32位Linux操作系统上)使用对称密钥加密(blowfish)来加密字符串,并使用phpseclib 1.0.3(在内部模式下运行),我使用它的示例代码是相当简单:错误的Blowfish在32位Linux操作系统上使用PHP 5.2.9进行对称密钥加密

include('Crypt/Blowfish.php'); 

$cipher = new Crypt_Blowfish(); 
$data = 'abcdefghijk'; 

$cipher->setKey('abcdefabcdefghi9876543'); 

echo bin2hex($cipher->encrypt($data)); 

生成的输出是(PHP 5.2.9 - 32位Linux OS):

0e1651fc54dd530757fc1711b696dac5 

但我已经尝试了与其他服务器(PHP 7.07,PHP 5.3.3,PHP 5.0.4)相同的代码,并且它们都生成了这些代码(所有这些代码都是64位Linux操作系统):

ad7145c675b1c914bbfe379dc7293bf3 

我想PHP 5.2.9输出是错误的。这可能是什么原因?任何线索?

+0

好,看上去像个“地穴/ Blowfish.php” 439行该指令的一个问题: '$这个 - > bctx ['P '] [] = $ this-> parray [$ i]^$ data'。 显然这个XOR按位运算符(^)根据值和OS的类型(32Bit或64Bit)返回不同的结果。 例如,此代码: '$ a = 2242054355; $ b = 1701195825; $ result = $ a^$ b; echo $ result;' 在32位系统上返回-523945758或在64位系统上返回3771021538。所以看起来问题与操作系统的类型有关,而不是PHP的版本(我稍后会编辑标题)。 – Romualdo

+0

另请参阅https://github.com/phpseclib/phpseclib/issues/1038 – neubert

+0

哇,它像一个魅力。谢谢 – Learner

回答

2

这是一个与在32位Linux pre-PHP 5.3上从float到int的转换有关的问题。 phpseclib的开发者固定在发行版1.0.4 & 2.0.4

相关问题