Crypt
[ class tree: Crypt ] [ index: Crypt ] [ all elements ]

Source for file RC42.php

Documentation is available at RC42.php

  1. <?php
  2. /* vim: set expandtab tabstop=4 shiftwidth=4: */
  3. // +----------------------------------------------------------------------+
  4. // | PHP Version 5                                                        |
  5. // +----------------------------------------------------------------------+
  6. // | Copyright (c) 1997-2004 The PHP Group                                |
  7. // +----------------------------------------------------------------------+
  8. // | This source file is subject to version 2.0 of the PHP license,       |
  9. // | that is bundled with this package in the file LICENSE, and is        |
  10. // | available at through the world-wide-web at                           |
  11. // | http://www.php.net/license/2_02.txt.                                 |
  12. // | If you did not receive a copy of the PHP license and are unable to   |
  13. // | obtain it through the world-wide-web, please send a note to          |
  14. // | license@php.net so we can mail you a copy immediately.               |
  15. // +----------------------------------------------------------------------+
  16. // | Authors: Dave Mertens <zyprexia@php.net>                             |
  17. // +----------------------------------------------------------------------+
  18. //
  19. // $Id: RC42.php 304006 2010-10-04 13:15:17Z clockwerx $
  20.  
  21.  
  22. /**
  23.  * RC4 stream cipher routines implementation.
  24.  *
  25.  * in PHP5(!) based on code written by Damien Miller <djm@mindrot.org>
  26.  * This class <b>BREAKS COMPABILITY</b> with earlier PHP 4 versions of the RC4 class.
  27.  * PHP 4 versions are available at http://pear.php.net/package/Crypt_RC42, download version 1.x
  28.  *
  29.  *
  30.  * Basic usage of this class
  31.  * <code>
  32.  * $key = "pear";
  33.  * $message = "PEAR rulez!";
  34.  *
  35.  * $rc4 = new Crypt_RC42();
  36.  * $rc4->key($key);
  37.  * echo "Original message: $message <br />\n";
  38.  *
  39.  * $message = $rc4->encrypt($message);
  40.  * $safe_codedmessage = base64_encode($message);
  41.  * echo "Encrypted message: $safe_codedmessage <br />\n";
  42.  *
  43.  * $message $rc4->decrypt($message);
  44.  * echo "Decrypted message: $message <br />\n";
  45.  * </code>
  46.  *
  47.  * Another example how the class can be used
  48.  * <code>
  49.  * $origmessage = "PEAR Rulez!";
  50.  *
  51.  * $rc4 = new Crypt_RC42("pear");
  52.  * $codedmessage = $rc4->encrypt($origmessage);
  53.  * $safe_codedmessage = base64_encode($codedmessage);
  54.  * echo "Encrypted message: $safe_codedmessage <br />\n";
  55.  * </code>
  56.  *
  57.  * Note: The encrypted output is binary, and therefore cannot be properly
  58.  * displayed in shell or a browser. If you would like to display, please
  59.  * use the base64_encode function as above.
  60.  *
  61.  * @category Crypt
  62.  * @package Crypt
  63.  * @author Dave Mertens <zyprexia@php.net>
  64.  * @version $Revision: 304006 $
  65.  * @access public
  66.  */
  67.  
  68. class Crypt_RC42 {
  69.  
  70.     /**
  71.      * Contains salt key used by en(de)cryption function
  72.      *
  73.      * @var array 
  74.      * @access protected
  75.      */
  76.     protected $s= array();
  77.  
  78.     /**
  79.      * First Part of encryption matrix
  80.      *
  81.      * @var array 
  82.      * @access protected
  83.      */
  84.     protected $i= 0;
  85.  
  86.     /**
  87.      * Second part of encryption matrix
  88.      *
  89.      * @var array 
  90.      * @access protected
  91.      */
  92.     protected $j= 0;
  93.  
  94.     /**
  95.      * symmetric key used for encryption.
  96.      *
  97.      * @var string 
  98.      * @access public
  99.      */
  100.     protected $key;    //variable itself is protected, but is made accessibly using __get and __set method
  101.  
  102.     /**
  103.      * Constructor for encryption class
  104.      * Pass encryption key to key()
  105.      *
  106.      * @param  string $key a key which will be used for encryption
  107.      * @return void 
  108.      * @access public
  109.      * @see    Key()
  110.      */
  111.     function __construct($key = null)
  112.     {
  113.         if ($key != null{
  114.             $this->key($key);
  115.         }
  116.     }
  117.  
  118.     /**
  119.      * Encrypt function
  120.      *
  121.      * Note: The encrypted output of this function isa  binary string, and
  122.      * therefore cannot be properly displayed in shell or a browser. If you
  123.      * would like to display, please use the base64_encode function before
  124.      * before output.
  125.      *
  126.      * @param  string $paramstr string that will decrypted
  127.      * @return string Encrypted string
  128.      * @access public
  129.      */
  130.     public function encrypt($paramstr)
  131.     {
  132.         //Decrypt is exactly the same as encrypting the string. Reuse (en)crypt code
  133.         return $this->_crypt($paramstr);
  134.     }
  135.  
  136.     /**
  137.      * Decrypt function
  138.      *
  139.      * @param  string $paramstr string that will decrypted
  140.      * @return string Decrypted string
  141.      * @access public
  142.      */
  143.     public function decrypt($paramstr)
  144.     {
  145.         //Decrypt is exactly the same as encrypting the string. Reuse (en)crypt code
  146.         return $this->_crypt($paramstr);
  147.     }
  148.  
  149.     /**
  150.      * Assign encryption key to class
  151.      *
  152.      * @param  string $key Key which will be used for encryption
  153.      * @return void 
  154.      * @access public
  155.      */
  156.     public function key($key)
  157.     {
  158.         $this->_initializeKey($key);
  159.     }
  160.  
  161.  
  162.     /**
  163.      * The only way for retrieving the encryption key
  164.      *
  165.      * @param string $property Only property 'key' is supported
  166.      * @return string Enecryption key
  167.      * @access protected
  168.      */
  169.     public function __get($property)
  170.     {
  171.         switch (strtolower($property)) {
  172.             case "key":
  173.                 return $this->key;
  174.                 break;
  175.         }
  176.     }
  177.  
  178.     /**
  179.      * Alternative way to set the encryption key
  180.      *
  181.      * @param string $property Only property 'key' is supported
  182.      * @param string $value Value for property
  183.      * @return void 
  184.      * @access protected
  185.      */
  186.     public function __set($property$value)
  187.     {
  188.         switch (strtolower($property)) {
  189.             case "key":
  190.                 return $this->_initializeKey($value);
  191.                 break;
  192.         }
  193.     }
  194.  
  195.     // PROTECTED FUNCTIONS
  196.  
  197.     /**
  198.      * (en/de) crypt function.
  199.      * Function can be used for encrypting and decrypting a message
  200.      *
  201.      * @param  string $paramstr string that will encrypted
  202.      * @return Encrypted or decrypted message
  203.      * @access protected
  204.      */
  205.     protected function _crypt($paramstr)
  206.     {
  207.         //Init key for every call, Bugfix for PHP issue #22316
  208.         $temp_matrix $this->s;
  209.         $this->i = 0;
  210.         $this->j = 0;
  211.  
  212.         $this->_initializeKey($this->key);
  213.  
  214.         //length of message
  215.         $lenstrlen($paramstr);
  216.  
  217.         //Encrypt message
  218.         for ($c= 0; $c $len$c++{
  219.             $this->i = ($this->i + 1% 256;
  220.             $this->j = ($this->j + $this->s[$this->i]% 256;
  221.             $t $this->s[$this->i];
  222.             $this->s[$this->i$this->s[$this->j];
  223.             $this->s[$this->j$t;
  224.  
  225.             $t ($this->s[$this->i$this->s[$this->j]% 256;
  226.  
  227.             $paramstr[$cchr(ord($paramstr[$c]$this->s[$t]);
  228.         }
  229.  
  230.         $this->s = $temp_matrix;
  231.         return $paramstr;
  232.     }
  233.  
  234.     /**
  235.      * This method prevents changes to the key during the encryption procedure.
  236.      *
  237.      * @param  string $key key which will be used for encryption
  238.      * @return void 
  239.      * @access protected
  240.      * @todo   Implement error handling!
  241.      */
  242.     protected function _initializeKey($key)
  243.     {
  244.         //better string validation
  245.         if is_string($key&& strlen($key> 0 {
  246.  
  247.             //Only initialize key if it's different
  248.             if ($key != $this->key{
  249.                 $this->key = $key;
  250.  
  251.                 $lenstrlen($key);
  252.  
  253.                 //Create array matrix
  254.                 for ($this->i = 0; $this->i < 256; $this->i++{
  255.                     $this->s[$this->i$this->i;
  256.                 }
  257.  
  258.                 //Initialize encryption matrix
  259.                 $this->j = 0;
  260.  
  261.                 for ($this->i = 0; $this->i < 256; $this->i++{
  262.                     $this->j = ($this->j + $this->s[$this->iord($key[$this->i % $len])) % 256;
  263.                     $t $this->s[$this->i];
  264.                     $this->s[$this->i$this->s[$this->j];
  265.                     $this->s[$this->j$t;
  266.                 }
  267.                 $this->i = $this->j = 0;
  268.             }
  269.         }
  270.         else {
  271.             //throw exception (which exception are available in php5 by default??)
  272.             //throw new Exception("Please provide an valid encryption key");
  273.         }
  274.     }
  275. }    //end of RC4 class
  276. ?>

Documentation generated on Mon, 11 Mar 2019 15:39:20 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.