X-Git-Url: https://git.mxchange.org/?p=core.git;a=blobdiff_plain;f=inc%2Fclasses%2Fmain%2Fstreams%2Fcrypto%2Fclass_McryptStream.php;h=1c3eeeb2eba4c6d502a4398a6b428b58f66a42b1;hp=2a0127b3ec52f682f27c6e958266d5ab488bc465;hb=b8cceeb06f0a81179a582af0538d8f56dd3c340c;hpb=cf051d640b6bd159376cf35e186fa9bb2a9cd7ae diff --git a/inc/classes/main/streams/crypto/class_McryptStream.php b/inc/classes/main/streams/crypto/class_McryptStream.php index 2a0127b3..1c3eeeb2 100644 --- a/inc/classes/main/streams/crypto/class_McryptStream.php +++ b/inc/classes/main/streams/crypto/class_McryptStream.php @@ -4,7 +4,7 @@ * * @author Roland Haeder * @version 0.0.0 - * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Core Developer Team + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2011 Core Developer Team * @license GNU GPL 3.0 or any newer version * @link http://www.ship-simu.org * @@ -21,7 +21,12 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -class McryptStream extends BaseStream { +class McryptStream extends BaseStream implements EncryptableStream { + /** + * Seperator on many places + */ + const DATA_PAYLOAD_SEPERATOR = '|'; + /** * Protected constructor * @@ -35,15 +40,132 @@ class McryptStream extends BaseStream { /** * 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 () { + public static final 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 + * @param $key Optional key, if none provided, a random key will be generated + * @return $encrypted Encrypted string + */ + public function encryptStream ($str, $key = null) { + // 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, if none provided + if (is_null($key)) { + // None provided + $key = $this->getRngInstance()->generateKey(); + } // END - if + + // Add some "payload" to the string + switch ($this->getRngInstance()->randomNumber(0, 8)) { + case 0: + $payloadString = crc32($this->getRngInstance()->randomString(10)) . self::DATA_PAYLOAD_SEPERATOR . base64_encode($str) . self::DATA_PAYLOAD_SEPERATOR . crc32($this->getRngInstance()->randomString(20)); + break; + + case 1: + $payloadString = crc32($this->getRngInstance()->randomString(10)) . self::DATA_PAYLOAD_SEPERATOR . base64_encode($str) . self::DATA_PAYLOAD_SEPERATOR . md5($this->getRngInstance()->randomString(20)); + break; + + case 2: + $payloadString = crc32($this->getRngInstance()->randomString(10)) . self::DATA_PAYLOAD_SEPERATOR . base64_encode($str) . self::DATA_PAYLOAD_SEPERATOR . sha1($this->getRngInstance()->randomString(20)); + break; + + case 3: + $payloadString = md5($this->getRngInstance()->randomString(10)) . self::DATA_PAYLOAD_SEPERATOR . base64_encode($str) . self::DATA_PAYLOAD_SEPERATOR . crc32($this->getRngInstance()->randomString(20)); + break; + + case 4: + $payloadString = md5($this->getRngInstance()->randomString(10)) . self::DATA_PAYLOAD_SEPERATOR . base64_encode($str) . self::DATA_PAYLOAD_SEPERATOR . md5($this->getRngInstance()->randomString(20)); + break; + + case 5: + $payloadString = md5($this->getRngInstance()->randomString(10)) . self::DATA_PAYLOAD_SEPERATOR . base64_encode($str) . self::DATA_PAYLOAD_SEPERATOR . sha1($this->getRngInstance()->randomString(20)); + break; + + case 6: + $payloadString = sha1($this->getRngInstance()->randomString(10)) . self::DATA_PAYLOAD_SEPERATOR . base64_encode($str) . self::DATA_PAYLOAD_SEPERATOR . crc32($this->getRngInstance()->randomString(20)); + break; + + case 7: + $payloadString = sha1($this->getRngInstance()->randomString(10)) . self::DATA_PAYLOAD_SEPERATOR . base64_encode($str) . self::DATA_PAYLOAD_SEPERATOR . md5($this->getRngInstance()->randomString(20)); + break; + + case 8: + $payloadString = sha1($this->getRngInstance()->randomString(10)) . self::DATA_PAYLOAD_SEPERATOR . base64_encode($str) . self::DATA_PAYLOAD_SEPERATOR . sha1($this->getRngInstance()->randomString(20)); + break; + } + + // Encrypt the string + $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $payloadString, MCRYPT_MODE_ECB, $iv); + + // Return the string + return $encrypted; + } + + /** + * Decrypt the string with fixed salt + * + * @param $encrypted Encrypted string + * @param $key Optional key, if none provided, a random key will be generated + * @return $str The unencrypted string + */ + public function decryptStream ($encrypted, $key = null) { + // Init crypto module + $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); + $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); + + // Shall we use a default key or custom? + if (is_null($key)) { + // Generate (default) key + $key = $this->getRngInstance()->generateKey(); + } // END - if + + // Decrypt the string + $payloadString = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_ECB, $iv); + + // Get the real string out + $strArray = explode(self::DATA_PAYLOAD_SEPERATOR, $payloadString); + + // 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; + } + + /** + * Streams the data and maybe does something to it + * + * @param $data The data (string mostly) to "stream" + * @return $data The data (string mostly) to "stream" + * @throws UnsupportedOperationException If this method is called (which is a mistake) + */ + public function streamData ($data) { + $this->debugOutput('Unhandled ' . strlen($data) . ' bytes in this stream.'); + throw new UnsupportedOperationException(array($this, __FUNCTION__), self::EXCEPTION_UNSPPORTED_OPERATION); + } } // [EOF]