2010-11-12 3 views
1

J'utilise la classe suivante pour chiffrer et déchiffrer une chaîne. Après avoir créé deux chaînes identiques, je crypte l'une des chaînes, puis je la décrypte. Cependant, la chaîne déchiffrée n'est plus égale à son jumeau (même si elle a l'air identique sous forme de texte après la conversion). En outre, après avoir pris la chaîne encrypt-decrypted et son jumeau et les avoir convertis en hexadécimal bin2hex, je découvre qu'ils ont l'air similaires seulement que la chaîne qui a été chiffrée avant a un nombre additionnel de zéro à la fin. Est-ce que quelqu'un peut signaler ce que j'ai mal fait? Merci d'avance.Les chaînes ne sont plus égales après le chiffrement et le décryptage

travailler avec leur

classe proCrypt {

public function __set($name, $value) 
{ 
    switch($name) 
    { 
     case 'key': 
     case 'ivs': 
     case 'iv': 
     $this->$name = $value; 
     break; 

     default: 
     throw new Exception("$name cannot be set"); 
    } 
} 

/** 
* 
* Gettor - This is called when an non existant variable is called 
* 
* @access public 
* @param string $name 
* 
*/ 
public function __get($name) 
{ 
    switch($name) 
    { 
     case 'key': 
     return 'abcd'; 

     case 'ivs': 
     return mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB); 

     case 'iv': 
     return mcrypt_create_iv($this->ivs); 

     default: 
     throw new Exception("$name cannot be called"); 
    } 
} 

/** 
* 
* Encrypt a string 
* 
* @access public 
* @param string $text 
* @return string The encrypted string 
* 
*/ 
public function encrypt($text) 
{ 
    // add end of text delimiter 
    $data = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->key, $text, MCRYPT_MODE_ECB, $this->iv); 
    return bin2hex($data); 
} 

/** 
* 
* Decrypt a string 
* 
* @access public 
* @param string $text 
* @return string The decrypted string 
* 
*/ 
public function decrypt($text) 
{ 
    $text = pack("H*" , $text); 
    return mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->key, $text, MCRYPT_MODE_ECB, $this->iv); 
} 

} // fin de la classe

+1

Pouvez-vous nous montrer le var_dump() de chacun? (le non-traité et celui qui a été crypté et déchiffré?) – spanky

+0

Salut, thegreasyitalian Je crée deux chaîne: $ text1 = 'argent'; $ text2 = 'argent'; après avoir chiffré et décrypté $ text2 et convertir les deux en hexadécimal (bin2hex) j'ai obtenu la sortie suivante: text1: 6d6f6e6579 text2: 6d6f6e65790000000000000000000000 – James

+0

Utilisez var_dump ($ text1) au lieu d'echo pour les deux chaînes, et voyez ce que cela produit. – spanky

Répondre

1

Vous avez une chaîne de 16 longueurs rembourrée avec des espaces, vraisemblablement. Essayez trim() avant bin2hex() pour se débarrasser des espaces de début et de fin.

+0

Cela fonctionne très bien! J'utilise juste le trim (text2) et ça sort super bien. Merci beaucoup. – James

+2

Pas de problème. Notez que si la chaîne à traiter contient des espaces et le début ou la fin, la fonction trim() les supprimera. C'est à vous de vous assurer que vos données n'ont pas besoin de conserver ces espaces de début ou de fin. – spanky

+0

C'est un bon conseil, je le garderai à l'esprit. Merci encore. – James

3

Les algorithmes de chiffrement nécessitent généralement l'entrée qui est un multiple d'une certaine longueur (8 octets, 16 octets, etc.) "taille de bloc" fixe. Votre chaîne d'entrée peut avoir été complétée de 0 pour correspondre. Vous pouvez l'annuler en gardant une trace du remplissage nécessaire en fonction de votre algorithme de choix (chaque algorithme aura sa propre taille de bloc et sa propre méthode de remplissage), et l'annuler après le déchiffrement.

Questions connexes