2010-04-13 4 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 или добавить поле длины.