<span
</span>
<span
class
</span><span Xcrypt{
</span><span
private
</span> <span
$mcrypt
</span><span ;
</span><span
private
</span> <span
$key
</span><span ;
</span><span
private
</span> <span
$mode
</span><span ;
</span><span
private
</span> <span
$iv
</span><span ;
</span><span
private
</span> <span
$blocksize
</span><span ;
</span><span
</span>
<span
public
</span> <span
function
</span> __construct(<span
$key
</span>, <span
$mode
</span> =
'cbc'
, <span
$iv
</span> =
"off"
<span ){
</span><span
switch
</span> (<span
strlen
</span>(<span
$key
</span><span )){
</span><span
case
</span> 8:
<span
$this
</span>->mcrypt =<span MCRYPT_DES;
</span><span
break
</span><span ;
</span><span
case
</span> 16:
<span
$this
</span>->mcrypt =<span MCRYPT_RIJNDAEL_128;
</span><span
break
</span><span ;
</span><span
case
</span> 32:
<span
$this
</span>->mcrypt =<span MCRYPT_RIJNDAEL_256;
</span><span
break
</span><span ;
</span><span
default
</span>:
<span
die
</span>(
"Key size must be 8/16/32"
<span );
} www</span>.jbxue.<span com
</span><span
$this
</span>-><span key</span> = <span
$key
</span><span ;
</span><span
switch
</span> (<span
strtolower
</span>(<span
$mode
</span><span )){
</span><span
case
</span>
'ofb'
:
<span
$this
</span>->mode =<span MCRYPT_MODE_OFB;
</span><span
if
</span> (<span
$iv
</span> ==
'off'
) <span
die
</span>(
'OFB must give a IV'
); <span
<span
break
</span><span ;
</span><span
case
</span>
'cfb'
:
<span
$this
</span>->mode =<span MCRYPT_MODE_CFB;
</span><span
if
</span> (<span
$iv
</span> ==
'off'
) <span
die
</span>(
'CFB must give a IV'
); <span
<span
break
</span><span ;
</span><span
case
</span>
'ecb'
:
<span
$this
</span>->mode =<span MCRYPT_MODE_ECB;
</span><span
$iv
</span> =
'off'
; <span
<span
break
</span><span ;
</span><span
case
</span>
'cbc'
:
<span
default
</span>:
<span
$this
</span>->mode =<span MCRYPT_MODE_CBC;
}
</span><span
switch
</span> (<span
strtolower
</span>(<span
$iv
</span><span )){
</span><span
case
</span>
"off"
:
<span
$this
</span>->iv = <span null</span><span ;
</span><span
break
</span><span ;
</span><span
case
</span>
"auto"
:
<span
$source
</span> = <span PHP_OS</span>==
'WINNT'
? MCRYPT_RAND :<span MCRYPT_DEV_RANDOM;
</span><span
$this
</span>->iv = mcrypt_create_iv(mcrypt_get_block_size(<span
$this
</span>->mcrypt, <span
$this
</span>->mode), <span
$source
</span><span );
</span><span
break
</span><span ;
</span><span
default
</span>:
<span
$this
</span>->iv = <span
$iv
</span><span ;
}
}
</span><span
</span> www.jbxue.<span com
</span><span
public
</span> <span
function
</span> getIV(<span
$code
</span> =
'base64'
<span ){
</span><span
switch
</span> (<span
$code
</span><span ){
</span><span
case
</span>
'base64'
:
<span
$ret
</span> = <span
base64_encode
</span>(<span
$this
</span>-><span iv);
</span><span
break
</span><span ;
</span><span
case
</span>
'hex'
:
<span
$ret
</span> = <span bin2hex</span>(<span
$this
</span>-><span iv);
</span><span
break
</span><span ;
</span><span
case
</span>
'bin'
:
<span
default
</span>:
<span
$ret
</span> = <span
$this
</span>-><span iv;
}
</span><span
return
</span> <span
$ret
</span><span ;
}
</span><span
</span>
<span
public
</span> <span
function
</span> encrypt(<span
$str
</span>, <span
$code
</span> =
'base64'
<span ){
</span><span
if
</span> (<span
$this
</span>->mcrypt == MCRYPT_DES) <span
$str
</span> = <span
$this
</span>->_pkcs5Pad(<span
$str
</span><span );
</span><span
if
</span> (<span isset</span>(<span
$this
</span>-><span iv)) {
</span><span
$result
</span> = mcrypt_encrypt(<span
$this
</span>->mcrypt, <span
$this
</span>-><span key</span>, <span
$str
</span>, <span
$this
</span>->mode, <span
$this
</span>-><span iv);
} </span><span
else
</span><span {
@</span><span
$result
</span> = mcrypt_encrypt(<span
$this
</span>->mcrypt, <span
$this
</span>-><span key</span>, <span
$str
</span>, <span
$this
</span>-><span mode);
}
</span><span
switch
</span> (<span
$code
</span><span ){
</span><span
case
</span>
'base64'
:
<span
$ret
</span> = <span
base64_encode
</span>(<span
$result
</span><span );
</span><span
break
</span><span ;
</span><span
case
</span>
'hex'
:
<span
$ret
</span> = <span bin2hex</span>(<span
$result
</span><span );
</span><span
break
</span><span ;
</span><span
case
</span>
'bin'
:
<span
default
</span>:
<span
$ret
</span> = <span
$result
</span><span ;
}
</span><span
return
</span> <span
$ret
</span><span ;
}
</span><span
</span>
<span
public
</span> <span
function
</span> decrypt(<span
$str
</span>, <span
$code
</span> =
"base64"
<span ){
</span><span
$ret
</span> = <span false</span><span ;
</span><span
switch
</span> (<span
$code
</span><span ){
</span><span
case
</span>
'base64'
:
<span
$str
</span> = <span
base64_decode
</span>(<span
$str
</span><span );
</span><span
break
</span><span ;
</span><span
case
</span>
'hex'
:
<span
$str
</span> = <span
$this
</span>->_hex2bin(<span
$str
</span><span );
</span><span
break
</span><span ;
</span><span
case
</span>
'bin'
:
<span
default
</span>:<span
}
</span><span
if
</span> (<span
$str
</span> !== <span false</span><span ){
</span><span
if
</span> (<span isset</span>(<span
$this
</span>-><span iv)) {
</span><span
$ret
</span> = mcrypt_decrypt(<span
$this
</span>->mcrypt, <span
$this
</span>-><span key</span>, <span
$str
</span>, <span
$this
</span>->mode, <span
$this
</span>-><span iv);
} </span><span
else
</span><span {
@</span><span
$ret
</span> = mcrypt_decrypt(<span
$this
</span>->mcrypt, <span
$this
</span>-><span key</span>, <span
$str
</span>, <span
$this
</span>-><span mode);
}
</span><span
if
</span> (<span
$this
</span>->mcrypt == MCRYPT_DES) <span
$ret
</span> = <span
$this
</span>->_pkcs5Unpad(<span
$ret
</span><span );
</span><span
$ret
</span> = <span trim</span>(<span
$ret
</span><span );
}
</span><span
return
</span> <span
$ret
</span><span ;
}
</span><span
private
</span> <span
function
</span> _pkcs5Pad(<span
$text
</span><span ){
</span><span
$this
</span>->blocksize = mcrypt_get_block_size(<span
$this
</span>->mcrypt, <span
$this
</span>-><span mode);
</span><span
$pad
</span> = <span
$this
</span>->blocksize - (<span
strlen
</span>(<span
$text
</span>) % <span
$this
</span>-><span blocksize);
</span><span
return
</span> <span
$text
</span> . <span
str_repeat
</span>(<span
chr
</span>(<span
$pad
</span>), <span
$pad
</span><span );
}
</span><span
private
</span> <span
function
</span> _pkcs5Unpad(<span
$text
</span><span ){
</span><span
$pad
</span> = <span ord</span>(<span
$text
</span>{<span
strlen
</span>(<span
$text
</span>) - 1<span });
</span><span
if
</span> (<span
$pad
</span> > <span
strlen
</span>(<span
$text
</span>)) <span
return
</span> <span false</span><span ;
</span><span
if
</span> (<span
strspn
</span>(<span
$text
</span>, <span
chr
</span>(<span
$pad
</span>), <span
strlen
</span>(<span
$text
</span>) - <span
$pad
</span>) != <span
$pad
</span>) <span
return
</span> <span false</span><span ;
</span><span
$ret
</span> = <span
substr
</span>(<span
$text
</span>, 0, -1 * <span
$pad
</span><span );
</span><span
return
</span> <span
$ret
</span><span ;
}
</span><span
private
</span> <span
function
</span> _hex2bin(<span
$hex
</span> = <span false</span><span ){
</span><span
$ret
</span> = <span
$hex
</span> !== <span false</span> && <span preg_match</span>(
'/^[0-9a-fA-F]+$/i'
, <span
$hex
</span>) ? <span pack</span>(
"H*"
, <span
$hex
</span>) : <span false</span><span ;
</span><span
return
</span> <span
$ret
</span><span ;
}
} </span>