[ Index ]
 

Code source de Horde 3.1.3

Accédez au Source d'autres logiciels libresSoutenez Angelica Josefina !

title

Body

[fermer]

/lib/Horde/Cipher/ -> rc2.php (source)

   1  <?php
   2  /**
   3   * The Cipher_rc2:: class implements the Cipher interface encryption data
   4   * using the RC2 algorithm as described in RFC2268.
   5   *
   6   * Based on the notes by Peter Gutmann <pgut01@cs.auckland.ac.nz>
   7   * http://www.mirrors.wiretapped.net/security/cryptography/
   8   *   algorithms/rc2/comments/gutman-960211
   9   *
  10   * $Horde: framework/Cipher/Cipher/rc2.php,v 1.9.12.7 2006/01/01 21:28:10 jan Exp $
  11   *
  12   * Copyright 2002-2006 Mike Cochrane <mike@graftonhall.co.nz>
  13   *
  14   * See the enclosed file COPYING for license information (LGPL). If you
  15   * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
  16   *
  17   * @author  Mike Cochrane <mike@graftonhall.co.nz>
  18   * @since   Horde 2.2
  19   * @package Horde_Cipher
  20   */
  21  class Horde_Cipher_rc2 extends Horde_Cipher {
  22  
  23      /**
  24       * Permutations array
  25       *
  26       * @var array
  27       */
  28      var $_perm = array(
  29          0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED,
  30          0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D,
  31          0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E,
  32          0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2,
  33          0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13,
  34          0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32,
  35          0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B,
  36          0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82,
  37          0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C,
  38          0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC,
  39          0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1,
  40          0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26,
  41          0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57,
  42          0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03,
  43          0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7,
  44          0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7,
  45          0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7,
  46          0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A,
  47          0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74,
  48          0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC,
  49          0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC,
  50          0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39,
  51          0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A,
  52          0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31,
  53          0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE,
  54          0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9,
  55          0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C,
  56          0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9,
  57          0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0,
  58          0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E,
  59          0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77,
  60          0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD
  61      );
  62  
  63      /**
  64       * Array to hold the key schedule
  65       *
  66       * @var array
  67       */
  68      var $_keySchedule = array();
  69  
  70      /**
  71       * Set the key to be used for en/decryption.
  72       *
  73       * @param string $key  The key to use.
  74       */
  75      function setKey($key)
  76      {
  77          $key = array_values(unpack('C*', $key));
  78          $bits = 1024;
  79  
  80          /* Expand input key to 128 bytes */
  81          $len = count($key);
  82          $last = $key[$len - 1];
  83          for ($i = $len; $i < 128; $i++) {
  84              $last = $this->_perm[($key[$i - $len] + $last) & 0xFF];
  85              $key[$i] = $last;
  86          }
  87  
  88          /* Phase 2 - reduce effective key size to "bits" */
  89          if ($len != 8) {
  90              $len = $len * 8;
  91          }
  92          $key[128 - $len] = $this->_perm[$key[128 - $len] & 0xFF];
  93          for ($i = 127 - $len; $i >= 0; $i--) {
  94              $key[$i] = $this->_perm[$key[$i + $len] ^ $key[$i + 1]];
  95          }
  96  
  97          /* Phase 3 - convert to 16 bit values */
  98          for ($i = 63; $i >= 0; $i--) {
  99              $this->_keySchedule[$i] = ($key[$i * 2 + 1] << 8 | $key[$i * 2]) & 0xFFFF;
 100          }
 101      }
 102  
 103      /**
 104       * Return the size of the blocks that this cipher needs.
 105       *
 106       * @return integer  The number of characters per block.
 107       */
 108      function getBlockSize()
 109      {
 110          return 8;
 111      }
 112  
 113      /**
 114       * Encrypt a block of data.
 115       *
 116       * @param string $block  The data to encrypt.
 117       * @param string $key    The key to use.
 118       *
 119       * @return string  The encrypted output.
 120       */
 121      function encryptBlock($block, $key = null)
 122      {
 123          if (!is_null($key)) {
 124              $this->setKey($key);
 125          }
 126  
 127          $plain = unpack('v*', $block);
 128  
 129          for ($i = 0; $i < 16; $i++) {
 130              $plain[1] += ($plain[2] & ~$plain[4]) + ($plain[3] & $plain[4]) + $this->_keySchedule[4 * $i + 0];
 131              $bin = str_pad(decbin(0xFFFF & $plain[1]), 32, '0', STR_PAD_LEFT);
 132              $plain[1] = bindec($bin . substr($bin, 16, 1));
 133  
 134              $plain[2] += ($plain[3] & ~$plain[1]) + ($plain[4] & $plain[1]) + $this->_keySchedule[4 * $i + 1];
 135              $bin = str_pad(decbin(0xFFFF & $plain[2]), 32, '0', STR_PAD_LEFT);
 136              $plain[2] = bindec($bin . substr($bin, 16, 2));
 137  
 138              $plain[3] += ($plain[4] & ~$plain[2]) + ($plain[1] & $plain[2]) + $this->_keySchedule[4 * $i + 2];
 139              $bin = str_pad(decbin(0xFFFF & $plain[3]), 16, '0', STR_PAD_LEFT);
 140              $plain[3] = bindec($bin . substr($bin, 0, 3));
 141  
 142              $plain[4] += ($plain[1] & ~$plain[3]) + ($plain[2] & $plain[3]) + $this->_keySchedule[4 * $i + 3];
 143              $bin = str_pad(decbin(0xFFFF & $plain[4]), 16, '0', STR_PAD_LEFT);
 144              $plain[4] = bindec($bin . substr($bin, 0, 5));
 145  
 146              if ($i == 4 || $i == 10) {
 147                  $plain[1] += $this->_keySchedule[$plain[4] & 0x3F];
 148                  $plain[2] += $this->_keySchedule[$plain[1] & 0x3F];
 149                  $plain[3] += $this->_keySchedule[$plain[2] & 0x3F];
 150                  $plain[4] += $this->_keySchedule[$plain[3] & 0x3F];
 151              }
 152  
 153          }
 154  
 155          $encrypted = pack("v*", $plain[1], $plain[2], $plain[3], $plain[4]);
 156          return $encrypted;
 157      }
 158  
 159      /**
 160       * Decrypt a block of data.
 161       *
 162       * @param string $block  The data to decrypt.
 163       * @param string $key    The key to use.
 164       *
 165       * @return string  The decrypted output.
 166       */
 167      function decryptBlock($block, $key = null)
 168      {
 169          if (!is_null($key)) {
 170              $this->setKey($key);
 171          }
 172  
 173          $cipher = unpack('v*', $block);
 174  
 175          for ($i = 15; $i >= 0; $i--) {
 176              $bin = str_pad(decbin(0xFFFF & $cipher[4]), 16, '0', STR_PAD_LEFT);
 177              $cipher[4] = bindec(substr($bin, -21, 21) . substr($bin, 0, 11));
 178              $cipher[4] -= ($cipher[1] & ~$cipher[3]) + ($cipher[2] & $cipher[3]) + $this->_keySchedule[4 * $i + 3];
 179  
 180              $bin = str_pad(decbin(0xFFFF & $cipher[3]), 16, '0', STR_PAD_LEFT);
 181              $cipher[3] = bindec(substr($bin, -19, 19) . substr($bin, 0, 13));
 182              $cipher[3] -= ($cipher[4] & ~$cipher[2]) + ($cipher[1] & $cipher[2]) + $this->_keySchedule[4 * $i + 2];
 183  
 184              $bin = str_pad(decbin(0xFFFF & $cipher[2]), 16, '0', STR_PAD_LEFT);
 185              $cipher[2] = bindec(substr($bin, -18, 18) . substr($bin, 0, 14));
 186              $cipher[2] -= ($cipher[3] & ~$cipher[1]) + ($cipher[4] & $cipher[1]) + $this->_keySchedule[4 * $i + 1];
 187  
 188              $bin = str_pad(decbin(0xFFFF & $cipher[1]), 16, '0', STR_PAD_LEFT);
 189              $cipher[1] = bindec(substr($bin, -17, 17) . substr($bin, 0, 15));
 190              $cipher[1] -= ($cipher[2] & ~$cipher[4]) + ($cipher[3] & $cipher[4]) + $this->_keySchedule[4 * $i + 0];
 191  
 192              if ($i == 5 || $i == 11) {
 193                  $cipher[4] -= $this->_keySchedule[$cipher[3] & 0x3F];
 194                  $cipher[3] -= $this->_keySchedule[$cipher[2] & 0x3F];
 195                  $cipher[2] -= $this->_keySchedule[$cipher[1] & 0x3F];
 196                  $cipher[1] -= $this->_keySchedule[$cipher[4] & 0x3F];
 197              }
 198          }
 199  
 200          return pack("v*", $cipher[1], $cipher[2], $cipher[3], $cipher[4]);
 201      }
 202  
 203  }


Généré le : Sun Feb 25 18:01:28 2007 par Balluche grâce à PHPXref 0.7