2010-04-13 64 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正確填充數據或添加長度字段。