2012-02-16 47 views
1

我有一个使用mcrypt加密输入字符串的实现。不幸的是,我不能再使用它了,因为mcrypt没有安装在服务器上,我无法安装它。 所以我看了一下phpseclib,但不幸的是我没有得到相同的加密字符串。这里是我的代码:使用mcrypt和phpseclib无法获得相同的加密结果

include('Crypt/AES.php'); 

$key256 = "123456789"; 
$iv = "987654321"; 

$cleartext = "This a teststring :)"; 

echo $cleartext . "<br /><br />"; 

$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); 

if (mcrypt_generic_init($cipher, $key256, $iv) != -1) 
{ 
    // PHP pads with NULL bytes if $cleartext is not a multiple of the block size.. 
    $cipherText = mcrypt_generic($cipher,$cleartext); 
    mcrypt_generic_deinit($cipher); 
} 

$enc64 = bin2hex($cipherText); 
echo $enc64 . "<br />"; 

while (strlen($cleartext) % 16 != 0) { 
    $cleartext .= "\0"; 
} 

$aes = new Crypt_AES(); 
$aes->setKey($key256); 
$aes->setIV($iv); 
$cipherText = $aes->encrypt($cleartext); 
$enc64 = bin2hex($cipherText); 
echo $enc64; 

运行脚本(已安装的mcrypt开发服务器上)之后,我得到以下输出:

这是一个的TestString :)

0fc60e5a06eca68d4aada496e0e83ea65806abfe7d8f72723da470e6c9e86372 0fc60e5a06eca68d4aada496e0e83ea65806abfe7d8f72723da470e6c9e8637231b74e99d9b729813e974f211550d175

正如你可以看到两个加密的字符串是相同的。几乎。用phpseclib加密的那个块太长了,我不知道为什么。我已经尝试了不同的键和块大小。我也试过使用phpseclib的Crypt_Rijndael类。希望你们其中一位能指出我的方向。

+1

什么是phpseclib的默认填充?您可能想要尝试在两个版本上明确设置填充方法。 – rossum 2012-02-16 12:41:39

+1

这是如此明显......感谢堆。 $ aes-> disablePadding()完成了这项工作。我无法找到设置默认填充的方法。所以我完全禁用它。似乎工作正常。 我不能将评论标记为正确的答案,我可以吗? – 2012-02-16 21:54:50

+1

phpseclib上的缺省填充是PKCS#1。实际上,这是填充phpseclib支持的唯一类型。 – neubert 2012-03-18 04:02:01

回答

0

复制的评论:你是否检查过你在两个版本中都使用了相同的填充。

相关问题