2011-08-26 50 views
2

我正在使用mcrypt函数来使用TripleDES加密一段文本。 90%的时间,因为它应该和我可以解密就好。另外10%,尽管我根本无法解密 - 就好像我的密钥错误或数据被破坏了一样。什么可能导致PHP mcrypt破坏数据?

功能如下:

function enc($text, $key, $iv) { 
    $text_num = str_split($text, 8); 
    $text_num = 8 - strlen($text_num[count($text_num)-1]); 

    for ($i=0; $i < $text_num; $i++) { 
    $text = $text . chr($text_num); 
    } 

    $cipher = mcrypt_module_open(MCRYPT_TRIPLEDES, '', 'cbc', ''); 
    mcrypt_generic_init($cipher, $key, $iv); 
    $decrypted = mcrypt_generic($cipher, $text); 
    mcrypt_generic_deinit($cipher); 
    return base64_encode($decrypted); 
} 

它们键& IV是正确的长度(24/8分别地)和永远不会改变。就像我说的那样,它在所有内容上运行确切的相同的代码,但只有10%以这种方式失败。

有什么我可以传递$text导致此?它不喜欢某些字符集吗?或者这可能是由于内存不足/其他服务器的情况?

任何牵制下来的帮助将非常感激。谢谢!

+0

失败的明文有多久?它们是否始终小于一个街区或多于一个街区?他们究竟是多块?你的代码没有指定填充。 – rossum

+0

明文大概是1500个字符+/- 300.填充我不太确定 - 在它传递到此函数之前没有完成,所以我猜想没有任何执行。我继承了这些代码,并且没有加密技术,我不知道该怎么改变。 –

+0

为什么它会做'$ text'的所有内容?它看起来像试图填充它,但这不是必需的。如果只删除函数的前6行(例如:从'$ text_num = str ...'到for循环的结尾),会发生什么? – NullUserException

回答

0

(从评论复制)3DES具有64位块大小(8个字节)。您需要查看明文的确切大小,以块的数量来检查它。查看提供填充的文档,可能是PKCS5或PKCS7。你的“10%”失败实际上是12.5%失败(八分之一)?这往往会指向与阻止有关的事情。