2

我正在使用 mcrypt 函数使用 TripleDES 加密文本块。90%的时间它应该正常工作,我可以很好地解密。剩下的 10% 虽然我根本无法解密它——好像我的密钥错误或数据被破坏了一样。

功能如下:

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导致这种情况吗?它不喜欢某些字符集吗?还是由于内存不足/其他一些服务器状况而发生这种情况?

任何帮助解决这个问题将不胜感激。谢谢!

4

1 回答 1

0

(从注释中复制)3DES 具有 64 位块大小(8 字节)。您需要查看明文的确切大小以检查它的块数。在文档中查找有关填充的内容,可能是 PKCS5 或可能是 PKCS7。您的“10%”失败实际上是 12.5% 的失败(8 分之一)吗?这往往会指向与阻塞有关的东西。

于 2011-08-27T21:46:28.693 回答