Class Crypt_Xtea

Description

Class that implements the xTEA encryption algorithm.

Class that implements the xTEA encryption algorithm.
This enables you to encrypt data without requiring mcrypt.

From the C source: ----------------------------------------- The Tiny Encryption Algorithm (TEA) by David Wheeler and Roger Needham of the Cambridge Computer Laboratory.

Placed in the Public Domain by David Wheeler and Roger Needham.

**** ANSI C VERSION (New Variant) ****

Notes:

TEA is a Feistel cipher with XOR and and addition as the non-linear mixing functions.

Takes 64 bits of data in v[0] and v[1]. Returns 64 bits of data in w[0] and w[1]. Takes 128 bits of key in k[0] - k[3].

TEA can be operated in any of the modes of DES. Cipher Block Chaining is, for example, simple to implement.

n is the number of iterations. 32 is ample, 16 is sufficient, as few as eight may be OK. The algorithm achieves good dispersion after six iterations. The iteration count can be made variable if required.

Note this is optimised for 32-bit CPUs with fast shift capabilities. It can very easily be ported to assembly language on most CPUs.

delta is chosen to be the real part of (the golden ratio Sqrt(5/4) - 1/2 ~ 0.618034 multiplied by 2^32).

This version has been amended to foil two weaknesses identified by David A. Wagner (daw@cs.berkeley.edu): 1) effective key length of old-variant TEA was 126 not 128 bits 2) a related key attack was possible although impractical.

void encipher(unsigned long *const v,unsigned long *const w, const unsigned long *const k) { register unsigned long y=v[0],z=v[1],sum=0,delta=0x9E3779B9,n=32;

while(n-->0) { y+= (z4 ^ z>>5) + z ^ sum + k[sum&3]; sum += delta; z+= (y4 ^ y>>5) + y ^ sum + k[sum>>11 & 3]; }

w[0]=y; w[1]=z; }

void decipher(unsigned long *const v,unsigned long *const w, const unsigned long *const k) { register unsigned long y=v[0],z=v[1],sum=0xC6EF3720, delta=0x9E3779B9,n=32;

  • sum = delta5, in general sum = delta * n
while(n-->0) { z-= (y4 ^ y>>5) + y ^ sum + k[sum>>11 & 3]; sum -= delta; y-= (z4 ^ z>>5) + z ^ sum + k[sum&3]; }

w[0]=y; w[1]=z; }

-----------------------------------------

  • author: Jeroen Derks <jeroen@derks.it>
  • access: public
  • version: $Revision: 1.13 $
  • TODO: Add CFB.

Located in /Xtea.php (line 124)

PEAR
   |
   --Crypt_Xtea
Variable Summary
integer $n_iter
Method Summary
Crypt_Xtea Crypt_Xtea ()
string decrypt (mixed $enc_data, string $key, string $data)
string encrypt (string $data, string $key)
integer getIter ()
void setIter (integer $n_iter)
void _add (mixed $i1, mixed $i2)
void _decipherLong (integer $y, integer $z, array &$w, array &$k)
void _encipherLong (integer $y, integer $z, array &$w, array &$k)
string _hex2bin (string $str)
string _long2str (long $l)
integer _resize (string &$data, integer $size, [boolean $nonull = false])
void _rshift (mixed $integer, mixed $n)
integer _str2long (integer $start, string &$data, array &$data_long)
Variables
integer $n_iter (line 133)

Number of iterations.

Methods
Constructor Crypt_Xtea (line 145)

Constructor, sets the number of iterations.

Crypt_Xtea Crypt_Xtea ()
decrypt (line 266)

Decrypt an encrypted string using a specific key.

string decrypt (mixed $enc_data, string $key, string $data)
  • string $data: Encrypted data to decrypt.
  • string $key: Key to decrypt encrypted data with (binary string).
encrypt (line 199)

Encrypt a string using a specific key.

string encrypt (string $data, string $key)
  • string $data: Data to encrypt.
  • string $key: Key to encrypt data with (binary string).
getIter (line 179)

Get the number of iterations to use.

integer getIter ()
setIter (line 162)

Set the number of iterations to use.

void setIter (integer $n_iter)
  • integer $n_iter: Number of iterations to use.
_add (line 544)

Handle proper unsigned add, dealing with PHP's signed add.

  • author: Jeroen Derks <jeroen@derks.it>
  • since: 2004/Sep/06
  • access: private
void _add (mixed $i1, mixed $i2)
_decipherLong (line 378)

Decipher a single long (32-bit) value.

void _decipherLong (integer $y, integer $z, array &$w, array &$k)
  • integer $y: 32 bits of enciphered data.
  • integer $z: 32 bits of enciphered data.
  • array &$w: Placeholder for deciphered 64 bits (in w[0] and w[1]).
  • array &$k: Key 128 bits (in k[0]-k[3]).
_encipherLong (line 343)

Encipher a single long (32-bit) value.

void _encipherLong (integer $y, integer $z, array &$w, array &$k)
  • integer $y: 32 bits of data.
  • integer $z: 32 bits of data.
  • array &$w: Placeholder for enciphered 64 bits (in w[0] and w[1]).
  • array &$k: Key 128 bits (in k[0]-k[3]).
_hex2bin (line 446)

Convert a hexadecimal string to a binary string (e.g. convert "616263" to "abc").

  • return: Binary string.
  • author: Jeroen Derks <jeroen@derks.it>
  • access: private
string _hex2bin (string $str)
  • string $str: Hexadecimal string to convert to binary string.
_long2str (line 493)

Convert long to character string.

  • return: Character string.
  • author: Jeroen Derks <jeroen@derks.it>
  • access: private
string _long2str (long $l)
  • long $l: Long to convert to character string.
_resize (line 414)

Resize data string to a multiple of specified size.

  • return: Length of supplied data string.
  • author: Jeroen Derks <jeroen@derks.it>
  • access: private
integer _resize (string &$data, integer $size, [boolean $nonull = false])
  • string $data: Data string to resize to specified size.
  • integer $size: Size in bytes to align data to.
  • boolean $nonull: Set to true if padded bytes should not be zero.
_rshift (line 508)

Handle proper unsigned right shift, dealing with PHP's signed shift.

  • author: Jeroen Derks <jeroen@derks.it>
  • since: 2004/Sep/06
  • access: private
void _rshift (mixed $integer, mixed $n)
_str2long (line 467)

Convert string to array of long.

  • return: Index from which to optionally continue.
  • author: Jeroen Derks <jeroen@derks.it>
  • access: private
integer _str2long (integer $start, string &$data, array &$data_long)
  • integer $start: Index into $data_long for output.
  • string &$data: Input string.
  • array &$data_long: Output array of long.

Documentation generated on Thu, 25 May 2006 15:31:27 +0200 by phpDocumentor 1.3.0RC3