我有一個使用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類。希望你們其中一位能指出我的方向。
什麼是phpseclib的默認填充?您可能想要嘗試在兩個版本上明確設置填充方法。 – rossum 2012-02-16 12:41:39
這是如此明顯......感謝堆。 $ aes-> disablePadding()完成了這項工作。我無法找到設置默認填充的方法。所以我完全禁用它。似乎工作正常。 我不能將評論標記爲正確的答案,我可以嗎? – 2012-02-16 21:54:50
phpseclib上的缺省填充是PKCS#1。實際上,這是填充phpseclib支持的唯一類型。 – neubert 2012-03-18 04:02:01