2010-04-13 65 views
0

我有几个问题与下面的PHP功能(一个更大的类的一部分)。mcrypt解码错误

//encode 
    public function acc_pw_enc($text, $key) { 
    $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, 'fYfhHeDm'); 
    $decrypted = mcrypt_generic($cipher, $text); 
    mcrypt_generic_deinit($cipher); 
    return base64_encode($decrypted); 
} 

    //decode 
public function acc_pw_dec($encrypted_text, $key) { 
    $cipher = mcrypt_module_open(MCRYPT_TRIPLEDES, '', 'cbc', ''); 
    mcrypt_generic_init($cipher, $key, 'fYfhHeDm'); 
    $decrypted = mdecrypt_generic($cipher, base64_decode($encrypted_text)); 
    mcrypt_generic_deinit($cipher); 
    $last_char = substr($decrypted, -1); 

    for($i=0; $i < 8-1; $i++) { 
     if(chr($i) == $last_char) {  
      $decrypted = substr($decrypted, 0, strlen($decrypted)-$i); 
      break; 
     } 
    } 
    return rtrim($decrypted); //str_replace("?", "", $decrypted); 
} 

所以对于exampe如果我加密字符串 'liloMIA01' 与盐/键 'yBevuZoMy' 我会得到 '7A30ZkEjYbDcAXLgGE/6nQ =='。

我得到liloMIA01作为解密值,我试过使用rtrim,但它没有奏效。

回答

1

mcrypt的一个大问题是,它与3DES等分组密码一起使用时不支持任何填充算法。所以如果数据不是块大小的倍数(在这种情况下是8字节),那么你会在最后得到垃圾。

您需要使用pkcs#5正确填充数据或添加长度字段。