Login   Register  
PHP Classes
elePHPant
Icontem

File: crypt_class.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Lopo Lencastre de Almeida  >  EFC/XFSS - Extended File Stealth System  >  crypt_class.php  >  Download  
File: crypt_class.php
Role: Class source
Content type: text/plain
Description: Slightly modified RC4Crypt Class
Class: EFC/XFSS - Extended File Stealth System
Protecting uploaded files using cryptography
Author: By
Last change: Access without login
Date: 4 years ago
Size: 18,314 bytes
 

Contents

Class file image Download
<?php  
// $Id: efc.class.php,v 1.0.1 2009/02/12 03:00:23 humaneasy Exp $ 
/**  
 * @file  
 * EasyFileCrypt Extending Crypt Class 
 * @Version: 1.0.1 
 * @Released: 05/27/03
 * @Donation: http://smsh.me/7kit 
 * 
 * Copyright (C) 2003-2009 Humaneasy, brainVentures Network.  
 * Licensed under GNU Lesser General Public License 3 or above. 
 * Please visit http://www.opensource.org/licenses/bsd-license.php 
 * to now more about it. 
 *  
 * --------------------------------
 *
 * Copyright (C) 2002 Jason Sheets <jsheets@shadonet.com>.
 * All rights reserved.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 
 * 3. Neither the name of the project nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS 
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 */

/**
   Name: Crypt Class

   Version: 1.1
   Date Released: 11/18/02

   Description: Crypt Class is a wrapper around libmcrypt_ functions, it provides an easy
   way to encrypt and decrypt data. Crypt Class greatly simplifies encryption by adding
   automatic generation and creation of IV's, automatic initialization of encryption, and
   error handling and automatic trimming of keys that are too long.


   Simple Example:

   <?php
      // include crypt class file
      include('crypt_class.php');

      // create an instance of the crypt class
      $crypt_class = new CRYPT_CLASS;

      // set the encryption cipher to twofish
      $crypt_class->set_cipher('twofish'); // set the cipher

      // set the mode to cfb (you should use cfb for strings and cbc for files)
      $crypt_class->set_mode('cfb'); // set encryption mode

      // set the encryption key to 'test key'
      $crypt_class->set_key('test key')

      // this is the data we want to encrypt
      $data = 'this is a test message';

      // this will be the encrypted data
      $encrypted = $crypt_class->encrypt($data);


      // this is the decrypted data
      $decrypted = $crypt_class->decrypt($encrypted);
   ?>

   Usage:
      See the README.txt file.
	

   Author: Jason Sheets <jsheets@shadonet.com>

   License: This script is distributed under the BSD License, you are free
   to use, or modify it however you like.  If you find this script useful please
   e-mail me.
**/

   class CRYPT_CLASS {
      var $cipher; // cipher to encrypt with
      var $defaultmode = 'cfb'; // default encryption mode to use
      var $defaultcipher = 'twofish'; // default cipher to use
      var $key; // encryption/decription key
      var $mode; // encryption mode to use

      var $post_decrypt_filter; // filter to apply after decrypting, before base64_decode ie gzip_enflate
      var $pre_encrypt_filter; // filter to apply before encrypting ie gzip_deflate

      /* You should use cfb mode for strings and cbc mode for files */

      // constructor for CRYPT_CLASS
      function CRYPT_CLASS() {

         // make sure we can use mcrypt_generic_init
         if (!function_exists(mcrypt_generic_init)) {
            ?>

            <html><head><title>libmcrypt not available</title></head><body>
            <h3>libmcrypt not available</h3>
            <p>In order to use crypt class you must have libmcrypt >= 2.4.x installed and PHP must be compiled with --with-mcrypt, if you don't
            know what this means please contact your hosting provider or system admin.</p>
            </body></html>

            <?php
            exit;
         }

         // enable gzip compression if possible, if gzip is not installed but bzip2 is use bzip2 instead
         /*
         if (function_exists('gzdeflate')) {
            $this->set_pre_encrypt_filter('gzdeflate');
            $this->set_post_decrypt_filter('gzinflate');
         } elseif (function_exists('bzcompress')) {
            $this->set_pre_encrypt_filter('bzcompress');
            $this->set_post_decrypt_filter('bzuncompress');
         }
         */
      }

      // clears the key so it can't be fetched by get_key later
      function clear_key() {
         $this->key = '';
      }

      // clears the pre encrypt filter
      function clear_pre_encrypt_filter()
      {
         $this->pre_encrypt_filter = '';
      }

      // clears the post decrypt filter
      function clear_post_decrypt_filter()
      {
         $this->post_decrypt_filter = '';
      }

      // shortcut, clears both pre_encrypt and post_decrypt filters
      function clear_filters()
      {
         $this->clear_pre_encrypt_filter();
         $this->clear_post_decrypt_filter();
      }

      // creates an IV
      function create_iv()
      {
         // before we create an IV make sure cipher is set
         if ((!isset($this->cipher)) || (!isset($this->mode))) {
            trigger_error('create_iv: cipher and mode must be set before using create_iv', E_USER_ERROR);
            return 0;
         }

         // open encryption module
         $td = $this->_open_cipher();

         // try to generate the iv
         $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size ($td), MCRYPT_RAND);

         // if we couldn't generate the iv display an error
         if (!$iv)
         {
            //trigger_error('create_iv: unable to create iv', E_USER_ERROR);
            return '';
         }

         // cleanup
         @mcrypt_module_close($td);

         // return iv
         return $iv;
      }

      function decrypt($encrypted, $keepIV = 0)
      {
         if ((!isset($this->cipher)) || (!isset($this->mode)) || (!isset($this->key))) {
            trigger_error('decrypt: cipher, mode, and key must be set before using decrypt', E_USER_ERROR);
         }

         // extract encrypted value from base64 encoded value
         $data = base64_decode($encrypted);

         // open encryption module
         $td = $this->_open_cipher();

         // get what size the IV should be
         $ivsize = mcrypt_enc_get_iv_size($td);

         // get the IV from the encrypted string
         $iv = substr($data, 0, $ivsize);

         // remove the IV from the data so we decrypt cleanly
         if ($keepIV != 1) {
            $data = substr($data, $ivsize);
         }

         // initialize decryption
         @mcrypt_generic_init ($td, $this->key, $iv);

         // decrypt the data
         $decrypted = mdecrypt_generic ($td, $data);

         // apply post-decrypt filter (this is usually a decompression call)
         if (!empty($this->post_decrypt_filter)) {
            $filter = $this->get_post_decrypt_filter();
            $decrypted = $filter($decrypted);
            unset($filter);
         }

         // cleanup
         mcrypt_generic_deinit($td);
         mcrypt_module_close($td);

         // get rid of original data
         unset($data);

         return $decrypted;

      }

      /* decrypts a file */
      function decrypt_file($sourcefile, $destfile)
      {
         // make sure required fields are specified
         if ((!isset($this->cipher)) || (!isset($this->mode)) || (!isset($this->key))) {
            trigger_error('decrypt_file: cipher, mode, and key must be set before using decrypt_file', E_USER_ERROR);
         }

         // make sure file exists and is readable
         if (!is_readable($sourcefile)) {
            return 0;
         }

         // touch destion file so it will exist when we check for it
         @touch($destfile);

         if (!is_writable($destfile)) {
            return 0;
         }

         // read the file into memory and encrypt it
         $fp = fopen($sourcefile, r);

         // return false if unable to open file
         if (!$fp) {
            return 0;
         }

         $filecontents = fread($fp, filesize($sourcefile));
         fclose($fp);

         // open the destionation file for writing
         $dest_fp = fopen($destfile, w);

         // return false if unable to open file
         if (!$dest_fp) {
            return 0;
         }

         // write decrypted data to file
         fwrite($dest_fp, $this->decrypt($filecontents));

         // close encrypted file pointer
         fclose($dest_fp);

         return 1;
      }

      function encrypt($data)
      {
         if ((!isset($this->cipher)) || (!isset($this->mode)) || (!isset($this->key))) {
            trigger_error('encrypt: cipher, mode, and key must be set before using encrypt', E_USER_ERROR);
         }

         // create an IV
         $iv = $this->create_iv();

         // open encryption module
         $td = $this->_open_cipher();

         // apply pre-encrypt filter (this is usually a compression call)
         if (!empty($this->pre_encrypt_filter)) {
            $filter = $this->get_pre_encrypt_filter();
            $data = $filter($data);
            unset($filter);
         }

         // initialize encryption
         mcrypt_generic_init ($td, $this->key, $iv);

         $encrypted_data = mcrypt_generic($td, $data);

         // cleanup
         mcrypt_generic_deinit($td);
         mcrypt_module_close($td);

         // get rid of original data
         unset($data);

         // return base64 encoded string
         return base64_encode($iv . $encrypted_data);
      }

      /* encrypts a file */
      function encrypt_file($sourcefile, $destfile) {
         // make sure required fields are specified
         if ((!isset($this->cipher)) || (!isset($this->mode)) || (!isset($this->key))) {
            trigger_error('encrypt_file: cipher, mode, and key must be set before using encrypt_file', E_USER_ERROR);
         }

         // make sure file exists and is readable
         if (!is_readable($sourcefile)) {
            //trigger_error("encrypt_file: cannot read '$sourcefile' ", E_USER_ERROR);
            return 0;
         }

         // touch destion file so it will exist when we check for it
         @touch($destfile);

         if (!is_writable($destfile)) {
            //trigger_error("encrypt_file: cannot write to '$destfile' ", E_USER_ERROR);
            return 0;
         }

         // read the file into memory and encrypt it
         $fp = fopen($sourcefile, r);

         // return false if unable to open file
         if (!$fp) {
            //trigger_error("encrypt_file: cannot open '$sourcefile' ", E_USER_ERROR);
            return 0;
         }

         $filecontents = fread($fp, filesize($sourcefile));
         fclose($fp);

         // open the destionation file for writing
         $dest_fp = fopen($destfile, w);

         // return false if unable to open file
         if (!$dest_fp) {
            //trigger_error("encrypt_file: cannot open '$destfile' ", E_USER_ERROR);
            return 0;
         }

         // write encrypted data to file
         fwrite($dest_fp, $this->encrypt($filecontents));

         // close encrypted file pointer
         fclose($dest_fp);

         return 1;

      }

      /* this function *ATTEMPTS* to generate a secure encryption/decryption key */
      function generate_key()
      {
         /* generate an random decryption key */
         $decryptkey = bin2hex(md5(uniqid(rand(),1)));

         /* get a unique id with a random prefix */
         $value = md5(uniqid(rand(),1));

         // backup current encryption key
         $oldkey = $this->key;

         // set the encryption/decryption key to the randomly generated decryption key
         $this->set_key($decryptkey);

         // decrypt $value with an invalid decryption key so we get garbage
         $returnkey = $this->decrypt($value, 1);

         // restore encryption key
         $this->key = $oldkey;

         // cleanup variables
         unset($oldkey, $decryptkey);

         // return encryption key, should be base64 encoded for storage
         return $returnkey;

      }

      /* return the name of the current cipher */
      function get_cipher()
      {
         return $this->cipher;
      }

      /* return the encryption/decryption key */
      function get_key()
      {
         return $this->key;
      }

      /* return the encryption mode */
      function get_mode()
      {
         return $this->mode;
      }

      // return current post decrypt filter
      function get_post_decrypt_filter()
      {
         return $this->post_decrypt_filter;
      }

      // return current pre encrypt filter
      function get_pre_encrypt_filter()
      {
         return $this->pre_encrypt_filter;
      }

      // wrapper around md5
      function md5($string)
      {
         // if the md5 function exists return md5($string), otherwise use built in md5
         if (function_exists('md5')) {
            return md5($string);
         } else {
            /* call to local md5 script goes here */
         }
      }

      /* attempt to set the cipher to $ciphername, verifies ciphername against list of supported ciphers */
      function set_cipher($ciphername)
      {
         if (in_array($ciphername, mcrypt_list_algorithms())) {
            $this->cipher = $ciphername;

            return 1;
         } else {
            return 0;
         }
      }

      // wrapper around sha1
      function sha1($string)
      {
         // if the sha1 function exists return sha1($string), otherwise use built in sha1
         if (function_exists('sha1')) {
            return sha1($string);
         } else {
            // note sha1 is only native to PHP 4.3.0 and newer
            /* call to local sha1 script goes here */
         }
      }

      /* set encryption key */
      function set_key($encryptkey)
      {
         // make sure cipher and mode are set before setting IV
         if ((!isset($this->cipher)) || (!isset($this->mode))) {
            trigger_error('set_key: cipher and mode must be set before using set_key', E_USER_ERROR);
         }

         if (!empty($encryptkey)) {

            // get the size of the encryption key
            $keysize = @mcrypt_get_key_size ($this->cipher, $this->mode);
            //$keysize = @mcrypt_get_key_size ($this->cipher);
            //trigger_error($keysize, E_USER_ERROR);
            

            // if the encryption key is less than 32 characters long and the expected keysize is at least 32 md5 the key
            if ((strlen($encryptkey) < 32) && ($keysize >= 32)) {
               $encryptkey = md5($encryptkey);
            // if encryption key is longer than $keysize and the keysize is 32 then md5 the encryption key
            } elseif ((strlen($encryptkey) > $keysize) && ($keysize == 32)) {
               $encryptkey = md5($encryptkey);
            } else {
            // if encryption key is longer than the keysize substr it to the correct keysize length
               $encryptkey = substr($encryptkey, 0, $keysize);
            }

            $this->key = $encryptkey;
         } else {
            return 0;
         }
      }

      /* attempt to set encryption mode to $encryptmode, verifies mode against list of supported modes */
      function set_mode($encryptmode)
      {
         // make sure encryption mode is a valid mode
         if (in_array($encryptmode, mcrypt_list_modes())) {
            $this->mode = $encryptmode;
         } else {
            return 0;
         }
      }

      function set_post_decrypt_filter($function)
      {
         // if the function exists set the filter and return true
         if (function_exists($function)) {
            $this->post_decrypt_filter = $function;

            return 1;
         // function does not exist, return false
         } else {
            return 0;
         }
      }

      function set_pre_encrypt_filter($function)
      {
         // if function exists set filter and return true
         if (function_exists($function)) {
            $this->pre_encrypt_filter = $function;
            return 1;

         // function does not exist, return false
         } else {
            return 0;
         }
      }

/* Everything below here are private methods and should not be called by anyone except the script */

      /* attempt to open cipher, verify cipher was opened otherwise throw an error */
      function _open_cipher()
      {
         // open encryption module
         $td = @mcrypt_module_open($this->cipher, '', $this->mode, '');

         // display error if we couldn't open the cipher
         if (!$td) {
            trigger_error('unable to open cipher ' . $this->cipher . ' in ' . $this->mode . ' mode', E_USER_ERROR);
         }

         return $td;
      }
   }
?>