Crypter.class.php

Go to the documentation of this file.
00001 <?php
00002 /***************************************************************************
00003  *   Copyright (C) 2009 by Denis M. Gabaidulin                             *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU Lesser General Public License as        *
00007  *   published by the Free Software Foundation; either version 3 of the    *
00008  *   License, or (at your option) any later version.                       *
00009  *                                                                         *
00010  ***************************************************************************/
00011 
00015     final class Crypter
00016     {
00017         private $crResource = null;
00018         private $keySize    = null;
00019         private $iv         = null;
00020 
00021         public static function create($algorithm, $mode)
00022         {
00023             return new self($algorithm, $mode);
00024         }
00025 
00026         public function  __construct($algorithm, $mode)
00027         {
00028             if (
00029                 !$this->crResource
00030                 = mcrypt_module_open($algorithm, null, $mode, null)
00031             )
00032                 throw new WrongStateException('Mcrypt Module did not open.');
00033 
00034             $this->iv = mcrypt_create_iv(
00035                 mcrypt_enc_get_iv_size($this->crResource),
00036                 MCRYPT_DEV_URANDOM
00037             );
00038 
00039             $this->keySize = mcrypt_enc_get_key_size($this->crResource);
00040         }
00041 
00042         public function  __destruct()
00043         {
00044             mcrypt_generic_deinit($this->crResource);
00045             mcrypt_module_close($this->crResource);
00046         }
00047 
00048         public function encrypt($secret, $data)
00049         {
00050             mcrypt_generic_init(
00051                 $this->crResource,
00052                 $this->createKey($secret),
00053                 $this->iv
00054             );
00055 
00056             return mcrypt_generic($this->crResource, $data);
00057         }
00058 
00059         public function decrypt($secret, $encryptedData)
00060         {
00061             mcrypt_generic_init(
00062                 $this->crResource,
00063                 $this->createKey($secret),
00064                 $this->iv
00065             );
00066 
00067             // crop padding garbage
00068             return rtrim(
00069                 mdecrypt_generic($this->crResource, $encryptedData),
00070                 "\0"
00071             );
00072         }
00073 
00074         private function createKey($secret)
00075         {
00076             return substr(md5($secret), 0, $this->keySize);
00077         }
00078     }
00079 ?>