2010-04-13 6 views
0

J'ai quelques problèmes avec les fonctions php suivantes (partie d'une classe plus grande).erreurs de décodage 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); 
} 

Donc, pour exampe si je chiffrent la chaîne 'liloMIA01' avec le sel/clé 'yBevuZoMy' i obtiendrai '7A30ZkEjYbDcAXLgGE/6NQ =='.

Je reçois liloMIA01 comme valeur décryptée, j'ai essayé d'utiliser rtrim mais cela n'a pas fonctionné.

Répondre

1

Un gros problème avec mcrypt est qu'il ne supporte pas d'algorithme de remplissage lorsqu'il est utilisé avec des chiffrements de blocs comme 3DES. Donc, vous obtiendrez des déchets à la fin si les données ne sont pas multiples de la taille du bloc (8 octets dans ce cas).

Vous devez remplir les données correctement à l'aide de pkcs # 5 ou ajouter un champ de longueur.