first commit

This commit is contained in:
renjianbo
2026-01-07 11:40:41 +08:00
parent 2b5d784e31
commit 8f2ed2c108
6466 changed files with 1431506 additions and 0 deletions

View File

@@ -0,0 +1,61 @@
<?php
/**
* Zeed Platform Project
* Based on Zeed Framework & Zend Framework.
*
* BTS - Billing Transaction Service
* CAS - Central Authentication Service
*
* LICENSE
* http://www.zeed.com.cn/license/
*
* @category Zeed
* @package Zeed_ChangeMe
* @subpackage ChangeMe
* @copyright Copyright (c) 2010 Zeed Technologies PRC Inc. (http://www.zeed.com.cn)
* @author Zeed Team (http://blog.zeed.com.cn)
* @since 2010-8-31
* @version SVN: $Id$
*/
class Zeed_Encrypt_3Des extends Zeed_Encrypt_Abstract
{
public function __construct($data = null, $salt = null, $encrypted = false)
{
if (!extension_loaded('mcrypt')) {
throw new Zeed_Exception('The mcrypt extension must be loaded for using this encrypt !');
}
parent::__construct($data, $salt, $encrypted);
}
public function encrypt()
{
$this->_salt = substr($this->_salt, 0, 24);
$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, '');
$size = mcrypt_enc_get_iv_size($td);
$this->_data = $this->_pkcs5Pad($this->_data, $size);
$iv = mcrypt_create_iv ($size, MCRYPT_RAND);
mcrypt_generic_init($td, $this->_salt, $iv);
$cipher = base64_encode(mcrypt_generic($td, $this->_data));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $cipher;
}
/**
*
* @param string $text
* @param unknown_type $blocksize
* @return string
* @see http://www.rsa.com/rsalabs/node.asp?id=2127
*/
private function _pkcs5Pad($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
}

View File

@@ -0,0 +1,72 @@
<?php
/**
* Zeed Platform Project
* Based on Zeed Framework & Zend Framework.
*
* BTS - Billing Transaction Service
* CAS - Central Authentication Service
*
* LICENSE
* http://www.zeed.com.cn/license/
*
* @category Zeed
* @package Zeed_ChangeMe
* @subpackage ChangeMe
* @copyright Copyright (c) 2010 Zeed Technologies PRC Inc. (http://www.zeed.com.cn)
* @author Zeed Team (http://blog.zeed.com.cn)
* @since 2010-6-18
* @version SVN: $Id$
*/
abstract class Zeed_Encrypt_Abstract
{
protected $_data = null;
protected $_salt = null;
protected $_dataEcrypted = false;
public function __construct($data = null, $salt = null, $encrypted = false)
{
if ( null !== $data )
{
$this->setData($data);
}
if ( null !== $salt )
{
$this->setSalt($salt);
}
$this->_dataEcrypted = $encrypted;
}
public function setData($data)
{
$this->_data = trim( (string) $data );
return $this;
}
public function setSalt($salt)
{
$this->_salt = (string) $salt;
return $this;
}
/**
* 获取加密字符串
*
* @return string
*/
abstract public function encrypt();
/**
* 获取解密字符串
*
* @return string
*/
public function decrypt()
{
return $this->_data;
}
}
// End ^ Native EOL ^ encoding

View File

@@ -0,0 +1,592 @@
<?php
/**
* Zeed Platform Project
* Based on Zeed Framework & Zend Framework.
*
* BTS - Billing Transaction Service
* CAS - Central Authentication Service
*
* LICENSE
* http://www.zeed.com.cn/license/
*
* @category Zeed
* @package Zeed_ChangeMe
* @subpackage ChangeMe
* @copyright Copyright (c) 2010 Zeed Technologies PRC Inc. (http://www.zeed.com.cn)
* @author Zeed Team (http://blog.zeed.com.cn)
* @since 2010-8-31
* @version SVN: $Id$
*/
class Zeed_Encrypt_Aes extends Zeed_Encrypt_Abstract
{
public function encrypt()
{
$aes = new AES($this->_salt);
$cipher = base64_encode($aes->encrypt($this->_data));
return $cipher;
}
public function decrypt()
{
$aes = new AES($this->_salt);
$plain = $aes->decrypt(base64_decode($this->_data));
return $plain;
}
}
/*
* Author: Cody Phillips
* Company: Phillips Data
* Website: www.phpaes.com, www.phillipsdata.com
* File: AES.class.php
* October 1, 2007
*
* This software is sold as-is without any warranties, expressed or implied,
* including but not limited to performance and/or merchantability. No
* warranty of fitness for a particular purpose is offered. This script can
* be used on as many servers as needed, as long as the servers are owned
* by the purchaser. (Contact us if you want to distribute it as part of
* another project) The purchaser cannot modify, rewrite, edit, or change any
* of this code and then resell it, which would be copyright infringement.
* This code can be modified for personal use only.
*
* Comments, Questions? Contact the author at cody [at] wshost [dot] net
*/
class AES {
// The number of 32-bit words comprising the plaintext and columns comrising the state matrix of an AES cipher.
private static $Nb = 4;
// The number of 32-bit words comprising the cipher key in this AES cipher.
private $Nk;
// The number of rounds in this AES cipher.
private $Nr;
// The S-Box substitution table.
private static $sBox = array(
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
);
// The inverse S-Box substitution table.
private static $invSBox = array(
0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38,
0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d,
0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2,
0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda,
0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a,
0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea,
0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85,
0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20,
0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31,
0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0,
0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26,
0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
);
// Log table based on 0xe5
private static $ltable = array(
0x00, 0xff, 0xc8, 0x08, 0x91, 0x10, 0xd0, 0x36,
0x5a, 0x3e, 0xd8, 0x43, 0x99, 0x77, 0xfe, 0x18,
0x23, 0x20, 0x07, 0x70, 0xa1, 0x6c, 0x0c, 0x7f,
0x62, 0x8b, 0x40, 0x46, 0xc7, 0x4b, 0xe0, 0x0e,
0xeb, 0x16, 0xe8, 0xad, 0xcf, 0xcd, 0x39, 0x53,
0x6a, 0x27, 0x35, 0x93, 0xd4, 0x4e, 0x48, 0xc3,
0x2b, 0x79, 0x54, 0x28, 0x09, 0x78, 0x0f, 0x21,
0x90, 0x87, 0x14, 0x2a, 0xa9, 0x9c, 0xd6, 0x74,
0xb4, 0x7c, 0xde, 0xed, 0xb1, 0x86, 0x76, 0xa4,
0x98, 0xe2, 0x96, 0x8f, 0x02, 0x32, 0x1c, 0xc1,
0x33, 0xee, 0xef, 0x81, 0xfd, 0x30, 0x5c, 0x13,
0x9d, 0x29, 0x17, 0xc4, 0x11, 0x44, 0x8c, 0x80,
0xf3, 0x73, 0x42, 0x1e, 0x1d, 0xb5, 0xf0, 0x12,
0xd1, 0x5b, 0x41, 0xa2, 0xd7, 0x2c, 0xe9, 0xd5,
0x59, 0xcb, 0x50, 0xa8, 0xdc, 0xfc, 0xf2, 0x56,
0x72, 0xa6, 0x65, 0x2f, 0x9f, 0x9b, 0x3d, 0xba,
0x7d, 0xc2, 0x45, 0x82, 0xa7, 0x57, 0xb6, 0xa3,
0x7a, 0x75, 0x4f, 0xae, 0x3f, 0x37, 0x6d, 0x47,
0x61, 0xbe, 0xab, 0xd3, 0x5f, 0xb0, 0x58, 0xaf,
0xca, 0x5e, 0xfa, 0x85, 0xe4, 0x4d, 0x8a, 0x05,
0xfb, 0x60, 0xb7, 0x7b, 0xb8, 0x26, 0x4a, 0x67,
0xc6, 0x1a, 0xf8, 0x69, 0x25, 0xb3, 0xdb, 0xbd,
0x66, 0xdd, 0xf1, 0xd2, 0xdf, 0x03, 0x8d, 0x34,
0xd9, 0x92, 0x0d, 0x63, 0x55, 0xaa, 0x49, 0xec,
0xbc, 0x95, 0x3c, 0x84, 0x0b, 0xf5, 0xe6, 0xe7,
0xe5, 0xac, 0x7e, 0x6e, 0xb9, 0xf9, 0xda, 0x8e,
0x9a, 0xc9, 0x24, 0xe1, 0x0a, 0x15, 0x6b, 0x3a,
0xa0, 0x51, 0xf4, 0xea, 0xb2, 0x97, 0x9e, 0x5d,
0x22, 0x88, 0x94, 0xce, 0x19, 0x01, 0x71, 0x4c,
0xa5, 0xe3, 0xc5, 0x31, 0xbb, 0xcc, 0x1f, 0x2d,
0x3b, 0x52, 0x6f, 0xf6, 0x2e, 0x89, 0xf7, 0xc0,
0x68, 0x1b, 0x64, 0x04, 0x06, 0xbf, 0x83, 0x38
);
// Inverse log table
private static $atable = array(
0x01, 0xe5, 0x4c, 0xb5, 0xfb, 0x9f, 0xfc, 0x12,
0x03, 0x34, 0xd4, 0xc4, 0x16, 0xba, 0x1f, 0x36,
0x05, 0x5c, 0x67, 0x57, 0x3a, 0xd5, 0x21, 0x5a,
0x0f, 0xe4, 0xa9, 0xf9, 0x4e, 0x64, 0x63, 0xee,
0x11, 0x37, 0xe0, 0x10, 0xd2, 0xac, 0xa5, 0x29,
0x33, 0x59, 0x3b, 0x30, 0x6d, 0xef, 0xf4, 0x7b,
0x55, 0xeb, 0x4d, 0x50, 0xb7, 0x2a, 0x07, 0x8d,
0xff, 0x26, 0xd7, 0xf0, 0xc2, 0x7e, 0x09, 0x8c,
0x1a, 0x6a, 0x62, 0x0b, 0x5d, 0x82, 0x1b, 0x8f,
0x2e, 0xbe, 0xa6, 0x1d, 0xe7, 0x9d, 0x2d, 0x8a,
0x72, 0xd9, 0xf1, 0x27, 0x32, 0xbc, 0x77, 0x85,
0x96, 0x70, 0x08, 0x69, 0x56, 0xdf, 0x99, 0x94,
0xa1, 0x90, 0x18, 0xbb, 0xfa, 0x7a, 0xb0, 0xa7,
0xf8, 0xab, 0x28, 0xd6, 0x15, 0x8e, 0xcb, 0xf2,
0x13, 0xe6, 0x78, 0x61, 0x3f, 0x89, 0x46, 0x0d,
0x35, 0x31, 0x88, 0xa3, 0x41, 0x80, 0xca, 0x17,
0x5f, 0x53, 0x83, 0xfe, 0xc3, 0x9b, 0x45, 0x39,
0xe1, 0xf5, 0x9e, 0x19, 0x5e, 0xb6, 0xcf, 0x4b,
0x38, 0x04, 0xb9, 0x2b, 0xe2, 0xc1, 0x4a, 0xdd,
0x48, 0x0c, 0xd0, 0x7d, 0x3d, 0x58, 0xde, 0x7c,
0xd8, 0x14, 0x6b, 0x87, 0x47, 0xe8, 0x79, 0x84,
0x73, 0x3c, 0xbd, 0x92, 0xc9, 0x23, 0x8b, 0x97,
0x95, 0x44, 0xdc, 0xad, 0x40, 0x65, 0x86, 0xa2,
0xa4, 0xcc, 0x7f, 0xec, 0xc0, 0xaf, 0x91, 0xfd,
0xf7, 0x4f, 0x81, 0x2f, 0x5b, 0xea, 0xa8, 0x1c,
0x02, 0xd1, 0x98, 0x71, 0xed, 0x25, 0xe3, 0x24,
0x06, 0x68, 0xb3, 0x93, 0x2c, 0x6f, 0x3e, 0x6c,
0x0a, 0xb8, 0xce, 0xae, 0x74, 0xb1, 0x42, 0xb4,
0x1e, 0xd3, 0x49, 0xe9, 0x9c, 0xc8, 0xc6, 0xc7,
0x22, 0x6e, 0xdb, 0x20, 0xbf, 0x43, 0x51, 0x52,
0x66, 0xb2, 0x76, 0x60, 0xda, 0xc5, 0xf3, 0xf6,
0xaa, 0xcd, 0x9a, 0xa0, 0x75, 0x54, 0x0e, 0x01
);
// The key schedule in this AES cipher.
private $w;
// The state matrix in this AES cipher with Nb columns and 4 rows
private $s;
// Determines the lenght of key z
private $keyLength;
/** constructs an AES cipher using a specific key.
*/
public function __construct($z) {
$this->Nk = strlen($z)/4;
$this->Nr = $this->Nk + self::$Nb + 2;
if ($this->Nk != 4 && $this->Nk != 6 && $this->Nk != 8) {
throw new Zeed_Exception("Key is " . ($this->Nk*32) . " bits long. *not* 128, 192, or 256.");
}
$this->Nr = $this->Nk+self::$Nb+2;
$this->w = array(); // Nb*(Nr+1) 32-bit words
$this->s = array(array()); // 2-D array of Nb colums and 4 rows
$this->KeyExpansion($z); // places expanded key in w
}
/** Encrypts an aribtrary length String.
* @params plaintext string
* @returns ciphertext string
* Whenever possible you should stream your plaintext through the
* encryptBlock() function directly, as the amount of time required
* to encrypt is linear to the size of the ciphertext.
**/
public function encrypt($x) {
$t = ""; // 16-byte block
$y = ""; // returned cipher text;
// put a 16-byte block into t
$xsize = strlen($x);
for ($i=0; $i<$xsize; $i+=16) {
for ($j=0; $j<16; $j++) {
if (($i+$j)<$xsize) {
$t[$j] = $x[$i+$j];
}
else
$t[$j] = chr(0);
}
$y .= $this->encryptBlock($t);
}
return $y;
}
/** Decrypts an aribtrary length String.
* @params ciphertext string
* @returns plaintext string
* Whenever possible you should stream your ciphertext through the
* decryptBlock() function directly, as the amount of time required
* to decrypt is linear to the size of the ciphertext.
**/
public function decrypt($y) {
$t = ""; // 16-byte block
$x = ""; // returned plain text;
// put a 16-byte block into t
$ysize = strlen($y);
for ($i=0; $i<$ysize; $i+=16) {
for ($j=0; $j<16; $j++) {
if (($i+$j)<$ysize)
$t[$j] = $y[$i+$j];
else
$t[$j] = chr(0);
}
$x .= $this->decryptBlock($t);
}
return $x;
}
/** Encrypts the 16-byte plain text.
* @params 16-byte plaintext string
* @returns 16-byte ciphertext string
**/
public function encryptBlock($x) {
$y = ""; // 16-byte string
// place input x into the initial state matrix in column order
for ($i=0; $i<4*self::$Nb; $i++) {
// we want integerger division for the second index
$this->s[$i%4][($i-$i%self::$Nb)/self::$Nb] = ord($x[$i]);
}
// add round key
$this->addRoundKey(0);
for ($i=1; $i<$this->Nr; $i++) {
// substitute bytes
$this->subBytes();
// shift rows
$this->shiftRows();
// mix columns
$this->mixColumns();
// add round key
$this->addRoundKey($i);
}
// substitute bytes
$this->subBytes();
// shift rows
$this->shiftRows();
// add round key
$this->addRoundKey($i);
// place state matrix s into y in column order
for ($i=0; $i<4*self::$Nb; $i++)
$y .= chr($this->s[$i%4][($i-$i%self::$Nb)/self::$Nb]);
return $y;
}
/** Decrypts the 16-byte cipher text.
* @params 16-byte ciphertext string
* @returns 16-byte plaintext string
**/
public function decryptBlock($y) {
$x = ""; // 16-byte string
// place input y into the initial state matrix in column order
for ($i=0; $i<4*self::$Nb; $i++)
$this->s[$i%4][($i-$i%self::$Nb)/self::$Nb] = ord($y[$i]);
// add round key
$this->addRoundKey($this->Nr);
for ($i=$this->Nr-1; $i>0; $i--) {
// inverse shift rows
$this->invShiftRows();
// inverse sub bytes
$this->invSubBytes();
// add round key
$this->addRoundKey($i);
// inverse mix columns
$this->invMixColumns();
}
// inverse shift rows
$this->invShiftRows();
// inverse sub bytes
$this->invSubBytes();
// add round key
$this->addRoundKey($i);
// place state matrix s into x in column order
for ($i=0; $i<4*self::$Nb; $i++) {
// Used to remove filled null characters.
$x .= ($this->s[$i%4][($i-$i%self::$Nb)/self::$Nb] == chr(0) ? "" : chr($this->s[$i%4][($i-$i%self::$Nb)/self::$Nb]));
}
return $x;
}
public function __destruct() {
unset($this->w);
unset($this->s);
}
/** makes a big key out of a small one
* @returns void
**/
private function KeyExpansion($z) {
// Rcon is the round constant
static $Rcon = array(
0x00000000,
0x01000000,
0x02000000,
0x04000000,
0x08000000,
0x10000000,
0x20000000,
0x40000000,
0x80000000,
0x1b000000,
0x36000000,
0x6c000000,
0xd8000000,
0xab000000,
0x4d000000,
0x9a000000,
0x2f000000
);
$temp = 0; // temporary 32-bit word
// the first Nk words of w are the cipher key z
for ($i=0; $i<$this->Nk; $i++) {
$this->w[$i] = 0;
// fill an entire word of expanded key w
// by pushing 4 bytes into the w[i] word
$this->w[$i] = ord($z[4*$i]); // add a byte in
$this->w[$i] <<= 8; // make room for the next byte
$this->w[$i] += ord($z[4*$i+1]);
$this->w[$i] <<= 8;
$this->w[$i] += ord($z[4*$i+2]);
$this->w[$i] <<= 8;
$this->w[$i] += ord($z[4*$i+3]);
}
for (; $i<self::$Nb*($this->Nr+1); $i++) {
$temp = $this->w[$i-1];
if ($i%$this->Nk == 0)
$temp = $this->subWord($this->rotWord($temp)) ^ $Rcon[$i/$this->Nk];
else if ($this->Nk > 6 && $i%$this->Nk == 4)
$temp = $this->subWord($temp);
$this->w[$i] = $this->w[$i-$this->Nk] ^ $temp;
self::make32BitWord($this->w[$i]);
}
}
/** adds the key schedule for a round to a state matrix.
* @returns void
**/
private function addRoundKey($round) {
$temp = "";
for ($i=0; $i<4; $i++) {
for ($j=0; $j<self::$Nb; $j++) {
// place the i-th byte of the j-th word from expanded key w into temp
$temp = $this->w[$round*self::$Nb+$j] >> (3-$i)*8;
// Cast temp from a 32-bit word into an 8-bit byte.
$temp %= 256;
// Can't do unsigned shifts, so we need to make this temp positive
$temp = ($temp < 0 ? (256 + $temp) : $temp);
$this->s[$i][$j] ^= $temp; // xor temp with the byte at location (i,j) of the state
}
}
}
/** unmixes each column of a state matrix.
* @returns void
**/
private function invMixColumns() {
$s0 = $s1 = $s2 = $s3= '';
// There are Nb columns
for ($i=0; $i<self::$Nb; $i++) {
$s0 = $this->s[0][$i]; $s1 = $this->s[1][$i]; $s2 = $this->s[2][$i]; $s3 = $this->s[3][$i];
$this->s[0][$i] = $this->mult(0x0e, $s0) ^ $this->mult(0x0b, $s1) ^ $this->mult(0x0d, $s2) ^ $this->mult(0x09, $s3);
$this->s[1][$i] = $this->mult(0x09, $s0) ^ $this->mult(0x0e, $s1) ^ $this->mult(0x0b, $s2) ^ $this->mult(0x0d, $s3);
$this->s[2][$i] = $this->mult(0x0d, $s0) ^ $this->mult(0x09, $s1) ^ $this->mult(0x0e, $s2) ^ $this->mult(0x0b, $s3);
$this->s[3][$i] = $this->mult(0x0b, $s0) ^ $this->mult(0x0d, $s1) ^ $this->mult(0x09, $s2) ^ $this->mult(0x0e, $s3);
}
}
/** applies an inverse cyclic shift to the last 3 rows of a state matrix.
* @returns void
**/
private function invShiftRows() {
$temp = "";
for ($i=1; $i<4; $i++) {
for ($j=0; $j<self::$Nb; $j++)
$temp[($i+$j)%self::$Nb] = $this->s[$i][$j];
for ($j=0; $j<self::$Nb; $j++)
$this->s[$i][$j] = $temp[$j];
}
}
/** applies inverse S-Box substitution to each byte of a state matrix.
* @returns void
**/
private function invSubBytes() {
for ($i=0; $i<4; $i++)
for ($j=0; $j<self::$Nb; $j++)
$this->s[$i][$j] = self::$invSBox[$this->s[$i][$j]];
}
/** mixes each column of a state matrix.
* @returns void
**/
private function mixColumns() {
$s0 = $s1 = $s2 = $s3= '';
// There are Nb columns
for ($i=0; $i<self::$Nb; $i++) {
$s0 = $this->s[0][$i]; $s1 = $this->s[1][$i]; $s2 = $this->s[2][$i]; $s3 = $this->s[3][$i];
$this->s[0][$i] = $this->mult(0x02, $s0) ^ $this->mult(0x03, $s1) ^ $this->mult(0x01, $s2) ^ $this->mult(0x01, $s3);
$this->s[1][$i] = $this->mult(0x01, $s0) ^ $this->mult(0x02, $s1) ^ $this->mult(0x03, $s2) ^ $this->mult(0x01, $s3);
$this->s[2][$i] = $this->mult(0x01, $s0) ^ $this->mult(0x01, $s1) ^ $this->mult(0x02, $s2) ^ $this->mult(0x03, $s3);
$this->s[3][$i] = $this->mult(0x03, $s0) ^ $this->mult(0x01, $s1) ^ $this->mult(0x01, $s2) ^ $this->mult(0x02, $s3);
}
}
/** applies a cyclic shift to the last 3 rows of a state matrix.
* @returns void
**/
private function shiftRows() {
$temp = "";
for ($i=1; $i<4; $i++) {
for ($j=0; $j<self::$Nb; $j++)
$temp[$j] = $this->s[$i][($j+$i)%self::$Nb];
for ($j=0; $j<self::$Nb; $j++)
$this->s[$i][$j] = $temp[$j];
}
}
/** applies S-Box substitution to each byte of a state matrix.
* @returns void
**/
private function subBytes() {
for ($i=0; $i<4; $i++) {
for ($j=0; $j<self::$Nb; $j++)
$this->s[$i][$j] = self::$sBox[$this->s[$i][$j]];
}
}
/** multiplies two polynomials a(x), b(x) in GF(2^8) modulo the irreducible polynomial m(x) = x^8+x^4+x^3+x+1
* @returns 8-bit value
**/
private static function mult($a, $b) {
$sum = self::$ltable[$a] + self::$ltable[$b];
$sum %= 255;
// Get the antilog
$sum = self::$atable[$sum];
return ($a == 0 ? 0 : ($b == 0 ? 0 : $sum));
}
/** applies a cyclic permutation to a 4-byte word.
* @returns 32-bit int
**/
private static function rotWord($w) {
$temp = $w >> 24; // put the first 8-bits into temp
$w <<= 8; // make room for temp to fill the lower end of the word
self::make32BitWord($w);
// Can't do unsigned shifts, so we need to make this temp positive
$temp = ($temp < 0 ? (256 + $temp) : $temp);
$w += $temp;
return $w;
}
/** applies S-box substitution to each byte of a 4-byte word.
* @returns 32-bit int
**/
private static function subWord($w) {
$temp = 0;
// loop through 4 bytes of a word
for ($i=0; $i<4; $i++) {
$temp = $w >> 24; // put the first 8-bits into temp
// Can't do unsigned shifts, so we need to make this temp positive
$temp = ($temp < 0 ? (256 + $temp) : $temp);
$w <<= 8; // make room for the substituted byte in w;
self::make32BitWord($w);
$w += self::$sBox[$temp]; // add the substituted byte back
}
self::make32BitWord($w);
return $w;
}
/** reduces a 64-bit word to a 32-bit word
* @returns void
**/
private static function make32BitWord(&$w) {
// Reduce this 64-bit word to 32-bits on 64-bit machines
$w &= 0x00000000FFFFFFFF;
}
}
// End ^ Native EOL ^ encoding

View File

@@ -0,0 +1,475 @@
<?php
/*
blowfish.php: PHP implementation of the Blowfish algorithm.
Ported in 2005 by GIJOE
Based on this.
-------
blowfish.c: C implementation of the Blowfish algorithm.
Copyright (C) 1997 by Paul Kocher
under LGPL.
*/
class Zeed_Encrypt_Blowfish extends Zeed_Encrypt_Abstract {
var $N = 16 ;
var $P = array() ;
var $S = array() ;
var $ORIG_P = array(
0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344,
0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89,
0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C,
0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917,
0x9216D5D9, 0x8979FB1B
);
var $ORIG_S = array(
array( 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7,
0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99,
0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16,
0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E,
0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE,
0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013,
0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF,
0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E,
0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60,
0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440,
0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE,
0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A,
0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E,
0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677,
0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193,
0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032,
0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88,
0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239,
0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E,
0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0,
0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3,
0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98,
0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88,
0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE,
0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6,
0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D,
0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B,
0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7,
0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA,
0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463,
0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F,
0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09,
0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3,
0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB,
0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279,
0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8,
0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB,
0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82,
0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB,
0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573,
0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0,
0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B,
0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790,
0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8,
0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4,
0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0,
0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7,
0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C,
0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD,
0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1,
0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299,
0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9,
0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477,
0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF,
0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49,
0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF,
0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA,
0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5,
0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41,
0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915,
0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400,
0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915,
0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664,
0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A ),
array( 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623,
0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266,
0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1,
0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E,
0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6,
0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1,
0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E,
0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1,
0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737,
0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8,
0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF,
0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD,
0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701,
0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7,
0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41,
0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331,
0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF,
0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF,
0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E,
0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87,
0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C,
0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2,
0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16,
0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD,
0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B,
0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509,
0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E,
0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3,
0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F,
0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A,
0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4,
0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960,
0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66,
0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28,
0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802,
0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84,
0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510,
0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF,
0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14,
0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E,
0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50,
0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7,
0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8,
0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281,
0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99,
0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696,
0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128,
0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73,
0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0,
0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0,
0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105,
0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250,
0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3,
0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285,
0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00,
0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061,
0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB,
0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E,
0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735,
0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC,
0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9,
0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340,
0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20,
0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7 ),
array( 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934,
0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068,
0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF,
0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840,
0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45,
0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504,
0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A,
0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB,
0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE,
0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6,
0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42,
0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B,
0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2,
0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB,
0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527,
0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B,
0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33,
0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C,
0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3,
0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC,
0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17,
0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564,
0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B,
0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115,
0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922,
0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728,
0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0,
0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E,
0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37,
0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D,
0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804,
0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B,
0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3,
0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB,
0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D,
0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C,
0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350,
0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9,
0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A,
0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE,
0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D,
0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC,
0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F,
0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61,
0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2,
0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9,
0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2,
0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C,
0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E,
0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633,
0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10,
0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169,
0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52,
0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027,
0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5,
0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62,
0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634,
0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76,
0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24,
0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC,
0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4,
0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C,
0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837,
0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0 ),
array( 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B,
0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE,
0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B,
0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4,
0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8,
0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6,
0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304,
0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22,
0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4,
0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6,
0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9,
0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59,
0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593,
0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51,
0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28,
0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C,
0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B,
0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28,
0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C,
0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD,
0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A,
0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319,
0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB,
0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F,
0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991,
0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32,
0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680,
0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166,
0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE,
0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB,
0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5,
0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47,
0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370,
0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D,
0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84,
0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048,
0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8,
0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD,
0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9,
0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7,
0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38,
0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F,
0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C,
0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525,
0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1,
0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442,
0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964,
0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E,
0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8,
0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D,
0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F,
0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299,
0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02,
0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC,
0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614,
0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A,
0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6,
0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B,
0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0,
0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060,
0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E,
0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9,
0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F,
0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 )
);
function F( $x ) {
$d = ($x & 0xFF);
$x >>= 8;
$c = ($x & 0xFF);
$x >>= 8;
$b = ($x & 0xFF);
$x >>= 8;
$a = ($x & 0xFF);
$y = $this->S[0][$a] + $this->S[1][$b];
$y = $y ^ $this->S[2][$c];
$y = $y + $this->S[3][$d];
return $y;
}
function Blowfish_Encrypt( &$xl , &$xr ) {
$X_l = $xl;
$X_r = $xr;
for($i = 0; $i < $this->N; ++$i) {
$X_l = $X_l ^ $this->P[$i];
$X_r = $this->F( $X_l ) ^ $X_r;
$temp = $X_l;
$X_l = $X_r;
$X_r = $temp;
}
$temp = $X_l;
$X_l = $X_r;
$X_r = $temp;
$X_r = $X_r ^ $this->P[$this->N];
$X_l = $X_l ^ $this->P[$this->N + 1];
$xl = $X_l;
$xr = $X_r;
}
function Blowfish_Decrypt( &$xl , &$xr ) {
$X_l = $xl;
$X_r = $xr;
for ($i = $this->N + 1; $i > 1; --$i) {
$X_l = $X_l ^ $this->P[$i];
$X_r = $this->F( $X_l) ^ $X_r;
/* Exchange $X_l and $X_r */
$temp = $X_l;
$X_l = $X_r;
$X_r = $temp;
}
/* Exchange $X_l and $X_r */
$temp = $X_l;
$X_l = $X_r;
$X_r = $temp;
$X_r = $X_r ^ $this->P[1];
$X_l = $X_l ^ $this->P[0];
$xl = $X_l;
$xr = $X_r;
}
function Blowfish_Init( $key , $keyLen ) {
$this->S = $this->ORIG_S ;
$j = 0;
for ($i = 0; $i < $this->N + 2; ++$i) {
$data = 0x00000000;
for ($k = 0; $k < 4; ++$k) {
$data = ($data << 8) | ord($key[$j]);
$j = $j + 1;
if ($j >= $keyLen)
$j = 0;
}
$this->P[$i] = $this->ORIG_P[$i] ^ $data;
}
$datal = 0x00000000;
$datar = 0x00000000;
for ($i = 0; $i < $this->N + 2; $i += 2) {
$this->Blowfish_Encrypt( $datal, $datar ) ;
$this->P[$i] = $datal;
$this->P[$i + 1] = $datar;
}
for ($i = 0; $i < 4; ++$i) {
for ($j = 0; $j < 256; $j += 2) {
$this->Blowfish_Encrypt( $datal , $datar ) ;
$this->S[$i][$j] = $datal ;
$this->S[$i][$j + 1] = $datar ;
}
}
}
function MyBlowfish( $key ) {
$this->Blowfish_Init( $key , strlen( $key ) ) ;
}
function encrypt( $str ) {
$ret = '' ;
for( $i = 0 ; $i < strlen( $str ) ; $i += 8 ) {
$x0 = isset( $str[$i] ) ? ord( $str[$i] ) : 0 ;
$x1 = isset( $str[$i+1] ) ? ord( $str[$i+1] ) : 0 ;
$x2 = isset( $str[$i+2] ) ? ord( $str[$i+2] ) : 0 ;
$x3 = isset( $str[$i+3] ) ? ord( $str[$i+3] ) : 0 ;
$x4 = isset( $str[$i+4] ) ? ord( $str[$i+4] ) : 0 ;
$x5 = isset( $str[$i+5] ) ? ord( $str[$i+5] ) : 0 ;
$x6 = isset( $str[$i+6] ) ? ord( $str[$i+6] ) : 0 ;
$x7 = isset( $str[$i+7] ) ? ord( $str[$i+7] ) : 0 ;
$xl = $x0 * 16777216 + $x1 * 65536 + $x2 * 256 + $x3 ;
$xr = $x4 * 16777216 + $x5 * 65536 + $x6 * 256 + $x7 ;
$this->Blowfish_Encrypt( $xl , $xr ) ;
$ret .= sprintf( "%08x%08x" , $xl , $xr ) ;
}
return $ret ;
}
function decrypt( $str ) {
$ret = '' ;
while( strlen( $str ) ) {
$xl = hexdec( substr( $str , 0 , 8 ) ) ;
$xr = hexdec( substr( $str , 8 , 8 ) ) ;
$str = substr( $str , 16 ) ;
$this->Blowfish_Decrypt( $xl , $xr ) ;
$x0 = chr( $xl >> 24 ) ;
$x1 = chr( ( $xl >> 16 ) & 0x000000ff ) ;
$x2 = chr( ( $xl >> 8 ) & 0x000000ff ) ;
$x3 = chr( $xl & 0x000000ff ) ;
$x4 = chr( $xr >> 24 ) ;
$x5 = chr( ( $xr >> 16 ) & 0x000000ff ) ;
$x6 = chr( ( $xr >> 8 ) & 0x000000ff ) ;
$x7 = chr( $xr & 0x000000ff ) ;
$ret .= $x0 . $x1 . $x2 . $x3 . $x4 . $x5 . $x6 . $x7 ;
}
return str_replace( "\0" , '' , $ret ) ;
}
}
/*
usage
$obj = new MyBlowfish("STRING_AS_KEY") ;
$enced = $obj->encryptString( 'PLAIN' ) ;
$plain = $obj->decryptString( $enced ) ;
echo "$enced $plain\n" ;
*/
/*
confirm code
$obj = new MyBlowfish("TESTKEY") ;
$L = 1 ;
$R = 2 ;
$obj->Blowfish_Encrypt( $L , $R ) ;
printf( "%08x, %08x\n" , $L , $R ) ;
// L == 0xDF333FD2L && R == 0x30A71BB4L
$obj->Blowfish_Decrypt( $L , $R ) ;
printf( "%08x, %08x\n" , $L , $R ) ;
*/

View File

@@ -0,0 +1,32 @@
<?php
/**
* Zeed Platform Project
* Based on Zeed Framework & Zend Framework.
*
* BTS - Billing Transaction Service
* CAS - Central Authentication Service
*
* LICENSE
* http://www.zeed.com.cn/license/
*
* @category Zeed
* @package Zeed_ChangeMe
* @subpackage ChangeMe
* @copyright Copyright (c) 2010 Zeed Technologies PRC Inc. (http://www.zeed.com.cn)
* @author Zeed Team (http://blog.zeed.com.cn)
* @since 2010-6-18
* @version SVN: $Id$
*/
/**
* md5(PASSWORD.SALT)
*/
class Zeed_Encrypt_Md5 extends Zeed_Encrypt_Abstract
{
public function encrypt()
{
return md5($this->_data.$this->_salt);
}
}
// End ^ Native EOL ^ encoding

View File

@@ -0,0 +1,33 @@
<?php
/**
* Zeed Platform Project
* Based on Zeed Framework & Zend Framework.
*
* BTS - Billing Transaction Service
* CAS - Central Authentication Service
*
* LICENSE
* http://www.zeed.com.cn/license/
*
* @category Zeed
* @package Zeed_ChangeMe
* @subpackage ChangeMe
* @copyright Copyright (c) 2010 Zeed Technologies PRC Inc. (http://www.zeed.com.cn)
* @author Zeed Team (http://blog.zeed.com.cn)
* @since Jun 22, 2010
* @version SVN: $Id: Md5Md5.php 5814 2010-08-03 03:14:05Z woody $
*/
/**
* md5(md5(PASSWORD).SALT)
*/
class Zeed_Encrypt_Md5Md5 extends Zeed_Encrypt_Abstract
{
public function encrypt()
{
$data = $this->_dataEcrypted ? $this->_data : md5($this->_data);
return md5($data.$this->_salt);
}
}
// End ^ Native EOL ^ encoding

View File

@@ -0,0 +1,233 @@
<?php
/**
* Zeed Platform Project
* Based on Zeed Framework & Zend Framework.
*
* BTS - Billing Transaction Service
* CAS - Central Authentication Service
*
* LICENSE
* http://www.zeed.com.cn/license/
*
* @category Zeed
* @package Zeed_ChangeMe
* @subpackage ChangeMe
* @copyright Copyright (c) 2010 Zeed Technologies PRC Inc. (http://www.zeed.com.cn)
* @author Zeed Team (http://blog.zeed.com.cn)
* @since 2010-8-18
* @version SVN: $Id$
*/
/**
* md5(PASSWORD.SALT)
*/
class Zeed_Encrypt_Osvr extends Zeed_Encrypt_Abstract
{
const BIT_OF_BYTE = 8;
const PASSWD_SIZE = 16;
const BANNED = '2';
private static $shuffle_matrix = array(
5,
22,
10,
69,
86,
11,
87,
74,
59,
14,
51,
28,
50,
103,
63,
40,
35,
18,
31,
16,
80,
43,
119,
52,
49,
70,
105,
1,
79,
2,
27,
67,
108,
23,
48,
25,
72,
15,
93,
30,
42,
17,
6,
44,
98,
0,
114,
123,
90,
46,
85,
117,
84,
37,
83,
115,
76,
7,
91,
36,
3,
26,
19,
34,
8,
81,
41,
120,
33,
101,
122,
56,
94,
88,
78,
66,
125,
29,
53,
127,
38,
106,
57,
21,
60,
73,
104,
54,
71,
96,
82,
12,
102,
113,
89,
75,
68,
13,
92,
39,
124,
4,
61,
58,
47,
55,
99,
9,
95,
97,
109,
111,
118,
24,
110,
45,
100,
77,
112,
62,
116,
20,
126,
121,
107,
65,
32,
64);
private static $mask = array(
0x82,
0x27,
0x43,
0x93,
0x86,
0x27,
0x46,
0x75,
0,
0,
0,
0,
0,
0,
0,
0);
public function encrypt()
{ /*{{{*/
$in_pwd = $this->_data;
$pwd = str_pad($in_pwd, self::PASSWD_SIZE);
$enc_pwd = array_fill(0, self::PASSWD_SIZE, 0);
for ($bit = 0; $bit < self::PASSWD_SIZE * self::BIT_OF_BYTE; ++ $bit) {
$offset = self::$shuffle_matrix[$bit];
$from_mask = 0x80 >> ($bit % self::BIT_OF_BYTE);
$to_mask = 0x80 >> ($offset % self::BIT_OF_BYTE);
if (ord($pwd{$bit / self::BIT_OF_BYTE}) & $from_mask) {
$enc_pwd[$offset / self::BIT_OF_BYTE] |= $to_mask;
}
}
for ($i = 0; $i < self::PASSWD_SIZE; ++ $i) {
$enc_pwd[$i] ^= self::$mask[$i];
}
$tmp = '';
foreach ($enc_pwd as $i) {
$tmp .= sprintf("%02X", $i);
}
$out_pwd = '';
for ($i = 0; $i < strlen($tmp); ++ $i) {
$out_pwd .= chr(ord($tmp{$i}) + 1);
}
return base64_encode($out_pwd);
} /*}}}*/
public function decrypt()
{ /*{{{*/
$in_pwd = $this->_data;
$tmp = base64_decode($in_pwd);
$pwd = '';
for ($i = 0; $i < strlen($tmp); ++ $i) {
$pwd .= chr(ord($tmp{$i}) - 1);
}
for ($i = 0; $i < self::PASSWD_SIZE; ++ $i) {
$enc_pwd[$i] = hexdec(substr($pwd, $i * 2, 2));
$enc_pwd[$i] ^= self::$mask[$i];
}
$pwd = array_fill(0, self::PASSWD_SIZE, 0);
for ($bit = 0; $bit < self::PASSWD_SIZE * self::BIT_OF_BYTE; ++ $bit) {
$offset = self::$shuffle_matrix[$bit];
$from_mask = 0x80 >> ($offset % self::BIT_OF_BYTE);
$to_mask = 0x80 >> ($bit % self::BIT_OF_BYTE);
if ($enc_pwd[$offset / self::BIT_OF_BYTE] & $from_mask)
$pwd[$bit / self::BIT_OF_BYTE] |= $to_mask;
}
$out_pwd = '';
foreach ($pwd as $i) {
$out_pwd .= chr($i);
}
return $out_pwd;
} /*}}}*/
}
// End ^ Native EOL ^ encoding

View File

@@ -0,0 +1,32 @@
<?php
/**
* Zeed Platform Project
* Based on Zeed Framework & Zend Framework.
*
* BTS - Billing Transaction Service
* CAS - Central Authentication Service
*
* LICENSE
* http://www.zeed.com.cn/license/
*
* @category Zeed
* @package Zeed_ChangeMe
* @subpackage ChangeMe
* @copyright Copyright (c) 2010 Zeed Technologies PRC Inc. (http://www.zeed.com.cn)
* @author Zeed Team (http://blog.zeed.com.cn)
* @since Jun 22, 2010
* @version SVN: $Id: Sha1.php 5370 2010-06-22 03:11:17Z woody $
*/
/**
* sha1(PASSWORD.SALT)
*/
class Zeed_Encrypt_Sha1 extends Zeed_Encrypt_Abstract
{
public function encrypt()
{
return sha1($this->_data.$this->_salt);
}
}
// End ^ Native EOL ^ encoding

View File

@@ -0,0 +1,33 @@
<?php
/**
* Zeed Platform Project
* Based on Zeed Framework & Zend Framework.
*
* BTS - Billing Transaction Service
* CAS - Central Authentication Service
*
* LICENSE
* http://www.zeed.com.cn/license/
*
* @category Zeed
* @package Zeed_ChangeMe
* @subpackage ChangeMe
* @copyright Copyright (c) 2010 Zeed Technologies PRC Inc. (http://www.zeed.com.cn)
* @author Zeed Team (http://blog.zeed.com.cn)
* @since Jun 22, 2010
* @version SVN: $Id: Sha1Sha1.php 6133 2010-08-18 00:07:41Z nroe $
*/
/**
* sha1(sha1(PASSWORD).SALT)
*/
class Zeed_Encrypt_Sha1Sha1 extends Zeed_Encrypt_Abstract
{
public function encrypt()
{
$data = $this->_dataEcrypted ? $this->_data : sha1($this->_data);
return sha1($data.$this->_salt);
}
}
// End ^ Native EOL ^ encoding

View File

@@ -0,0 +1,352 @@
<?php
/**
* Zeed Platform Project
* Based on Zeed Framework & Zend Framework.
*
* BTS - Billing Transaction Service
* CAS - Central Authentication Service
*
* LICENSE
* http://www.zeed.com.cn/license/
*
* @category Zeed
* @package Zeed_ChangeMe
* @subpackage ChangeMe
* @copyright Copyright (c) 2010 Zeed Technologies PRC Inc. (http://www.zeed.com.cn)
* @author Zeed Team (http://blog.zeed.com.cn)
* @since 2010-8-30
* @version SVN: $Id$
*/
class Zeed_Encrypt_Xtea extends Zeed_Encrypt_Abstract
{
public function encrypt()
{
$xtea = new XTEA($this->_salt);
$cipher = $xtea->Encrypt($this->_data);
return $cipher;
}
public function decrypt()
{
$xtea = new XTEA($this->_salt);
$plain = $xtea->Decrypt($this->_data);
$plain = trim($plain);
return $plain;
}
}
/* PHP Implementation of XTEA (www.php-einfach.de)
*
* XTEA was designed in 1997 by David Wheeler and Roger Needham
* of the Cambridge Computer Laboratory.
* It is not subject to any patents.
*
* It is a 64-bit Feistel cipher, consisting of 64 rounds.
* XTA has a key length of 128 bits.
*
*
* ***********************
* Diese Implementierung darf frei verwendet werden, der Autor uebernimmt keine
* Haftung fuer die Richtigkeit, Fehlerfreiheit oder die Funktionsfaehigkeit dieses Scripts.
* Benutzung auf eigene Gefahr.
*
* Ueber einen Link auf www.php-einfach.de wuerden wir uns freuen.
*
* ************************
* Usage:
* <?php
* include("xtea.class.php");
*
* $xtea = new XTEA("secret Key");
* $cipher = $xtea->Encrypt("Hello World"); //Encrypts 'Hello World'
* $plain = $xtea->Decrypt($cipher); //Decrypts the cipher text
*
* echo $plain;
* ?>
*/
class XTEA {
//Private
var $key;
// CBC or ECB Mode
// normaly, CBC Mode would be the right choice
var $cbc = 1;
function XTEA($key) {
$this->key_setup($key);
}
//Verschluesseln
function encrypt($text) {
$n = strlen($text);
if($n%8 != 0) $lng = ($n+(8-($n%8)));
else $lng = 0;
$text = str_pad($text, $lng, ' ');
$text = $this->_str2long($text);
//Initialization vector: IV
$cipher = array();
if($this->cbc == 1) {
$cipher[0][0] = time();
$cipher[0][1] = (double)microtime()*1000000;
}
$a = 1;
for($i = 0; $i<count($text); $i+=2) {
if($this->cbc == 1) {
//$text mit letztem Geheimtext XOR Verknuepfen
//$text is XORed with the previous ciphertext
$text[$i] ^= $cipher[$a-1][0];
$text[$i+1] ^= $cipher[$a-1][1];
}
$cipher[] = $this->block_encrypt($text[$i],$text[$i+1]);
$a++;
}
$output = "";
for($i = 0; $i<count($cipher); $i++) {
$output .= $this->_long2str($cipher[$i][0]);
$output .= $this->_long2str($cipher[$i][1]);
}
return base64_encode($output);
}
//Entschluesseln
function decrypt($text) {
$plain = array();
$cipher = $this->_str2long(base64_decode($text));
if($this->cbc == 1)
$i = 2; //Message start at second block
else
$i = 0; //Message start at first block
for($i; $i<count($cipher); $i+=2) {
$return = $this->block_decrypt($cipher[$i],$cipher[$i+1]);
//Xor Verknuepfung von $return und Geheimtext aus von den letzten beiden Bloecken
//XORed $return with the previous ciphertext
if($this->cbc == 1)
$plain[] = array($return[0]^$cipher[$i-2],$return[1]^$cipher[$i-1]);
else //EBC Mode
$plain[] = $return;
}
$output = '';
for($i = 0; $i<count($plain); $i++) {
$output .= $this->_long2str($plain[$i][0]);
$output .= $this->_long2str($plain[$i][1]);
}
return $output;
}
//Bereitet den Key zum ver/entschluesseln vor
function key_setup($key) {
if(is_array($key))
$this->key = $key;
else if(isset($key) && !empty($key))
$this->key = $this->_str2long(str_pad($key, 16, $key));
else
$this->key = array(0,0,0,0);
}
//Performs a benchmark
function benchmark($length=1000) {
//1000 Byte String
$string = str_pad("", $length, "text");
//Key-Setup
$start1 = time() + (double)microtime();
$xtea = new XTEA("key");
$end1 = time() + (double)microtime();
//Encryption
$start2 = time() + (double)microtime();
$xtea->Encrypt($string);
$end2 = time() + (double)microtime();
echo "Encrypting ".$length." bytes: ".round($end2-$start2,2)." seconds (".round($length/($end2-$start2),2)." bytes/second)<br>";
}
//verify the correct implementation of the blowfish algorithm
function check_implementation() {
$xtea = new XTEA("");
$vectors = array(
array(array(0x00000000,0x00000000,0x00000000,0x00000000), array(0x41414141,0x41414141), array(0xed23375a,0x821a8c2d)),
array(array(0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f), array(0x41424344,0x45464748), array(0x497df3d0,0x72612cb5)),
);
//Correct implementation?
$correct = true;
//Test vectors, see http://www.schneier.com/code/vectors.txt
foreach($vectors AS $vector) {
$key = $vector[0];
$plain = $vector[1];
$cipher = $vector[2];
$xtea->key_setup($key);
$return = $xtea->block_encrypt($vector[1][0],$vector[1][1]);
if((int)$return[0] != (int)$cipher[0] || (int)$return[1] != (int)$cipher[1])
$correct = false;
}
return $correct;
}
/***********************************
Some internal functions
***********************************/
function block_encrypt($y, $z) {
$sum=0;
$delta=0x9e3779b9;
/* start cycle */
for ($i=0; $i<32; $i++)
{
$y = $this->_add($y,
$this->_add($z << 4 ^ $this->_rshift($z, 5), $z) ^
$this-> _add($sum, $this->key[$sum & 3]));
$sum = $this->_add($sum, $delta);
$z = $this->_add($z,
$this->_add($y << 4 ^ $this->_rshift($y, 5), $y) ^
$this->_add($sum, $this->key[$this->_rshift($sum, 11) & 3]));
}
/* end cycle */
$v[0]=$y;
$v[1]=$z;
return array($y,$z);
}
function block_decrypt($y, $z) {
$delta=0x9e3779b9;
$sum=0xC6EF3720;
$n=32;
/* start cycle */
for ($i=0; $i<32; $i++)
{
$z = $this->_add($z,
-($this->_add($y << 4 ^ $this->_rshift($y, 5), $y) ^
$this->_add($sum, $this->key[$this->_rshift($sum, 11) & 3])));
$sum = $this->_add($sum, -$delta);
$y = $this->_add($y,
-($this->_add($z << 4 ^ $this->_rshift($z, 5), $z) ^
$this->_add($sum, $this->key[$sum & 3])));
}
/* end cycle */
return array($y,$z);
}
function _rshift($integer, $n) {
// convert to 32 bits
if (0xffffffff < $integer || -0xffffffff > $integer) {
$integer = fmod($integer, 0xffffffff + 1);
}
// convert to unsigned integer
if (0x7fffffff < $integer) {
$integer -= 0xffffffff + 1.0;
} elseif (-0x80000000 > $integer) {
$integer += 0xffffffff + 1.0;
}
// do right shift
if (0 > $integer) {
$integer &= 0x7fffffff; // remove sign bit before shift
$integer >>= $n; // right shift
$integer |= 1 << (31 - $n); // set shifted sign bit
} else {
$integer >>= $n; // use normal right shift
}
return $integer;
}
function _add($i1, $i2) {
$result = 0.0;
foreach (func_get_args() as $value) {
// remove sign if necessary
if (0.0 > $value) {
$value -= 1.0 + 0xffffffff;
}
$result += $value;
}
// convert to 32 bits
if (0xffffffff < $result || -0xffffffff > $result) {
$result = fmod($result, 0xffffffff + 1);
}
// convert to signed integer
if (0x7fffffff < $result) {
$result -= 0xffffffff + 1.0;
} elseif (-0x80000000 > $result) {
$result += 0xffffffff + 1.0;
}
return $result;
}
//Einen Text in Longzahlen umwandeln
//Covert a string into longinteger
function _str2long($data) {
$n = strlen($data);
$tmp = unpack('N*', $data);
$data_long = array();
$j = 0;
foreach ($tmp as $value) $data_long[$j++] = $value;
return $data_long;
}
//Longzahlen in Text umwandeln
//Convert a longinteger into a string
function _long2str($l){
return pack('N', $l);
}
}
// End ^ Native EOL ^ encoding