* @version 0.0.0 * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009, 2010 Core Developer Team * @license GNU GPL 3.0 or any newer version * @link http://www.ship-simu.org * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ class McryptStream extends BaseStream implements EncryptableStream { /** * Seperator on many places */ private $seperator = '|'; /** * Protected constructor * * @return void */ protected function __construct () { // Call parent constructor parent::__construct(__CLASS__); } /** * Creates an instance of this node class * * @param $rngInstance An RNG instance * @return $streamInstance An instance of this node class */ public final static function createMcryptStream (RandomNumberGenerator $rngInstance) { // Get a new instance $streamInstance = new McryptStream(); // Set the RNG instance $streamInstance->setRngInstance($rngInstance); // Return the instance return $streamInstance; } /** * Encrypt the string with fixed salt * * @param $str The unencrypted string * @return $encrypted Encrypted string */ public function encryptStream ($str) { // Init crypto module $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); // Generate key $key = $this->getRngInstance()->generateKey(); // Add some "garbage" to the string switch ($this->getRngInstance()->randomNumber(0, 8)) { case 0: $garbageString = crc32($this->getRngInstance()->randomString(10)) . $this->seperator . base64_encode($str) . $this->seperator . crc32($this->getRngInstance()->randomString(20)); break; case 1: $garbageString = crc32($this->getRngInstance()->randomString(10)) . $this->seperator . base64_encode($str) . $this->seperator . md5($this->getRngInstance()->randomString(20)); break; case 2: $garbageString = crc32($this->getRngInstance()->randomString(10)) . $this->seperator . base64_encode($str) . $this->seperator . sha1($this->getRngInstance()->randomString(20)); break; case 3: $garbageString = md5($this->getRngInstance()->randomString(10)) . $this->seperator . base64_encode($str) . $this->seperator . crc32($this->getRngInstance()->randomString(20)); break; case 4: $garbageString = md5($this->getRngInstance()->randomString(10)) . $this->seperator . base64_encode($str) . $this->seperator . md5($this->getRngInstance()->randomString(20)); break; case 5: $garbageString = md5($this->getRngInstance()->randomString(10)) . $this->seperator . base64_encode($str) . $this->seperator . sha1($this->getRngInstance()->randomString(20)); break; case 6: $garbageString = sha1($this->getRngInstance()->randomString(10)) . $this->seperator . base64_encode($str) . $this->seperator . crc32($this->getRngInstance()->randomString(20)); break; case 7: $garbageString = sha1($this->getRngInstance()->randomString(10)) . $this->seperator . base64_encode($str) . $this->seperator . md5($this->getRngInstance()->randomString(20)); break; case 8: $garbageString = sha1($this->getRngInstance()->randomString(10)) . $this->seperator . base64_encode($str) . $this->seperator . sha1($this->getRngInstance()->randomString(20)); break; } // Encrypt the string $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $garbageString, MCRYPT_MODE_ECB, $iv); // Return the string return $encrypted; } /** * Decrypt the string with fixed salt * * @param $encrypted Encrypted string * @return $str The unencrypted string */ public function decryptStream ($encrypted) { // Init crypto module $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); // Generate key $key = $this->getRngInstance()->generateKey(); // Decrypt the string $garbageString = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_ECB, $iv); // Get the real string out $strArray = explode($this->seperator, $garbageString); // Does the element count match? assert(count($strArray) == 3); // Decode the string $str = base64_decode($strArray[1]); // Trim trailing nulls away $str = rtrim($str, "\0"); // Return the string return $str; } } // [EOF] ?>