[PHP5] Classe Crypt

Eléphant du PHP | 281 Messages

10 févr. 2006, 21:43

Bonsoir,

Une petit classe PHP 5 créée aujourd'hui même suite à l'article de Ripat sur la librairie mcrypt disponible dans les didactitiels de PHPfrance :

http://www.phpfrance.com/tutoriaux/inde ... rypt-ripat

Un aperçu du résultat de l'utilisation est disponible ici :

http://ouaibou.info/classes/Crypt.class.php5
<?php
	/**
	 * Class Crypt [PHP5]
	 * 
	 * Permet une utilisation plus aisee de la librairie mcrypt.
	 *
	 * Classe realisee suite a un tres bon didactitiel d'introduction au
	 * cryptage avec la librairie de chiffrement mcrypt poste par Ripat
	 * sur PHPfrance : http://www.phpfrance.com/tutoriaux/index.php
	 *
	 * @author Ouaibou
	 * @version 2005.02.10
	 */

	class Crypt
	{
		private $algo; // Algorithme utilise
		private $key; // Clef utilisee
		private $mode; // Mode de chiffrement utilise
		private $vector; // Vecteur d'initialisation utilise
		
		/**
		 * Cre un nouvel objet
		 *
		 * @param String $algo Algorithme a utiliser pour le cryptage/decryptage (par defaut rijndael-256)
		 * @param String $key 
		 * @param String $mode Mode de chiffrement a utiliser (par defaut nofb)
		 * @param String $vector Vecteur d'initialisation. Une valeur a \"rand\" permet de creer un vecteur pseudo aleatoirement
		 */
		
		public function __construct($algo, $key, $mode, $vector)
		{
			$this->setAlgo($algo);
			$this->setMode($mode);
			$this->setVector($vector);
			$this->setKey($key);
		}
		
		/**
		 * Impression par defaut d'un objet de la classe Crypt
		 */
		 
		 public function __toString()
		 {
		    $msg = 'Algorithme de cryptage/d&eacute;cryptage utilis&eacute; : '.$this->getAlgo().'<br />';
			$msg .= ' Mode de chiffrement utilis&eacute; : '.$this->getMode().'<br />';
			$msg .= 'Vecteur d\'initialisation cr&eacute;&eacute;/utilis&eacute; : '.$this->getVector().'<br />';
			$msg .= 'Vecteur d\'initialisation cr&eacute;&eacute;/utilis&eacute; ';
			$msg .= '(base 64) : '.base64_encode($this->getVector());
			
			return $msg;
		 }
		
		/**
		 * @return String Renvoie un vecteur cree pseudo-aleatoirement
		 */
		
		public function createRandomVector()
		{
			return mcrypt_create_iv($this->getVectorSize(), MCRYPT_RAND);
		}
		
		/**
		 * Decrypte le texte crypte envoye en parametre
		 * Si ce dernier a ete crypte en base 64 il ne faut pas
		 * oublier de passer $decode a true
		 * 
		 * @param String $txt Texte a decrypter
		 * @param boolean $decode Decrypte le texte en tant que texte encode en base 64 ou non 
		 * @return String Renvoie le texte decrypte
		 */
		
		public function decrypt($txt, $decode=false)
		{
			if($decode)
				$txt = base64_decode($txt);
		
			return mcrypt_decrypt($this->algo, $this->key, $txt, $this->mode, $this->vector);
		}
		
		/**
		 * Crypte le texte envoye en parametre et renvoie si voulu
		 * le resultat encode en base 64.
		 *
		 * @param String $txt Texte a crypter
		 * @param boolean $encode Encode ou non le texte crypte en base 64
		 * @return String Renvoie le texte crypte
		 */
		
		public function encrypt($txt, $encode=false)
		{
			$crypt = mcrypt_encrypt($this->algo, $this->key, $txt, $this->mode, $this->vector);
			
			if(!$encode)
				return $crypt;
			else
				return base64_encode($crypt);
		}
		
		/**
		 * @return String Renvoie le nom de l'algorythme de cryptage/decryptage en cours d'utilisation
		 */
		
		public function getAlgo()
		{
			return $this->algo;
		}
		
		/**
		 * @return int Taille maximale de la clef a utiliser
		 */
		
		public function getKeyMaxSize()
		{
			return mcrypt_module_get_algo_key_size($this->algo);
		}
		
		/**
		 * @return String Renvoie le mode de chiffrement en cours d'utilisation
		 */
		
		public function getMode()
		{
			return $this->mode;
		}
		
		/**
		 * @return String Renvoie la valeur du vecteur d'initilisation
		 */
				
		public function getVector()
		{
			return $this->vector;
		}
		
		/**
		 * @return int Taille obligatoire a utiliser pour le vecteur
		 * d'initialisation
		 */
		
		public function getVectorSize()
		{
			return mcrypt_get_iv_size($this->algo, $this->mode);
		}

		/**
		 * Permet de modifier l'algorithme a utiliser
		 * @param String $algo
		 */	
		
		public function setAlgo($algo)
		{
			if(trim($algo) == null)
				$this->algo = 'rijndael-256';
			else
				$this->algo = $algo;
		}
		
		/**
		 * Permet de changer la clef de cryptage/decryptage
		 * @param String $key Clef de cryptage/decryptage
		 */
		
		public function setKey($key)
		{
			if(strlen($key) > $this->getKeyMaxSize())
				$this->key = substr($key, 0, $this->getKeyMaxSize());
			else
				$this->key = $key;
		}
		
		/**
		 * Modifie le mode de chiffrement
		 * @param String $mode Mode de chiffrement a utiliser
		 */
		
		public function setMode($mode)
		{
			if(trim($mode) == null)
				$this->mode = 'cbc';
			else
				$this->mode = mode;
		}
		
		/**
		 * Permet de creer un nouveau vecteur d'initialisation
		 * @param String $vector Vecteur a utilise
		 */
		 
		public function setVector($vector)
		{
			if($vector === 'rand')
			{
				$this->vector = $this->createRandomVector();
			}
			else
			{
				if(strlen($vector) != $this->getVectorSize())
				{
					throw new Exception('La taille du vecteur d\'itinialisation doit être egale a '.$this->getVectorSize());
				}
				else
				{
					$this->vector = $vector;
				}
			}		
		}
	}
	
	///////////////////////////
	// Exemple d'utilisation //
	///////////////////////////
	
	try
	{
		// Nouvel objet en utilisant l'algo et le mode de chiffrement par defaut
		// Avec la clef "PHPfrance"
		$crypt = new Crypt('', 'PHPfrance', '', 'rand');
		
		// On crypte le texte "Plouf plouf"
		// en utilisant un chiffrement base 64 pour l'affichage
		$txt_encrypt = $crypt->encrypt('Ploufplouf', true);
		
		echo 'Texte crypt&eacute; : '.$txt_encrypt.'<br />';
		
		// On decrypte le texte precedemment crypte
		// en utilisant un dechiffrement base 64 car le texte a ete 
		// convertit en base 64 au prealable.
		$txt_decrypt = $crypt->decrypt($txt_encrypt, true);	
		
		echo 'Texte d&eacute;crypt&eacute; : '.$txt_decrypt.'<br /><br />';
		
		// On affiche les informations sur l'objet
		
		echo $crypt;
	}
	catch(Exception $e)
	{
		echo $e->getMessage();
	}
?> 
@+