Last active
April 19, 2016 06:15
-
-
Save E1101/8c1d03ebf3a26a4d90ea to your computer and use it in GitHub Desktop.
Encryption
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class Crypto { | |
/** | |
* Encrypt using 3DES | |
* | |
* @param string $clear clear text input | |
* @param string $key encryption key to retrieve from the configuration, defaults to 'des_key' | |
* @param boolean $base64 whether or not to base64_encode() the result before returning | |
* | |
* @return string encrypted text | |
*/ | |
public function encrypt($clear, $key = 'des_key', $base64 = true) | |
{ | |
if (!$clear) { | |
return ''; | |
} | |
/*- | |
* Add a single canary byte to the end of the clear text, which | |
* will help find out how much of padding will need to be removed | |
* upon decryption; see http://php.net/mcrypt_generic#68082 | |
*/ | |
$clear = pack("a*H2", $clear, "80"); | |
if (function_exists('mcrypt_module_open') && | |
($td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_CBC, "")) | |
) { | |
$iv = $this->create_iv(mcrypt_enc_get_iv_size($td)); | |
mcrypt_generic_init($td, $this->config->get_crypto_key($key), $iv); | |
$cipher = $iv . mcrypt_generic($td, $clear); | |
mcrypt_generic_deinit($td); | |
mcrypt_module_close($td); | |
} | |
else { | |
@include_once 'des.inc'; | |
if (function_exists('des')) { | |
$des_iv_size = 8; | |
$iv = $this->create_iv($des_iv_size); | |
$cipher = $iv . des($this->config->get_crypto_key($key), $clear, 1, 1, $iv); | |
} | |
else { | |
self::raise_error(array( | |
'code' => 500, 'type' => 'php', | |
'file' => __FILE__, 'line' => __LINE__, | |
'message' => "Could not perform encryption; make sure Mcrypt is installed or lib/des.inc is available" | |
), true, true); | |
} | |
} | |
return $base64 ? base64_encode($cipher) : $cipher; | |
} | |
/** | |
* Decrypt 3DES-encrypted string | |
* | |
* @param string $cipher encrypted text | |
* @param string $key encryption key to retrieve from the configuration, defaults to 'des_key' | |
* @param boolean $base64 whether or not input is base64-encoded | |
* | |
* @return string decrypted text | |
*/ | |
public function decrypt($cipher, $key = 'des_key', $base64 = true) | |
{ | |
if (!$cipher) { | |
return ''; | |
} | |
$cipher = $base64 ? base64_decode($cipher) : $cipher; | |
if (function_exists('mcrypt_module_open') && | |
($td = mcrypt_module_open(MCRYPT_TripleDES, "", MCRYPT_MODE_CBC, "")) | |
) { | |
$iv_size = mcrypt_enc_get_iv_size($td); | |
$iv = substr($cipher, 0, $iv_size); | |
// session corruption? (#1485970) | |
if (strlen($iv) < $iv_size) { | |
return ''; | |
} | |
$cipher = substr($cipher, $iv_size); | |
mcrypt_generic_init($td, $this->config->get_crypto_key($key), $iv); | |
$clear = mdecrypt_generic($td, $cipher); | |
mcrypt_generic_deinit($td); | |
mcrypt_module_close($td); | |
} | |
else { | |
@include_once 'des.inc'; | |
if (function_exists('des')) { | |
$des_iv_size = 8; | |
$iv = substr($cipher, 0, $des_iv_size); | |
$cipher = substr($cipher, $des_iv_size); | |
$clear = des($this->config->get_crypto_key($key), $cipher, 0, 1, $iv); | |
} | |
else { | |
self::raise_error(array( | |
'code' => 500, 'type' => 'php', | |
'file' => __FILE__, 'line' => __LINE__, | |
'message' => "Could not perform decryption; make sure Mcrypt is installed or lib/des.inc is available" | |
), true, true); | |
} | |
} | |
/*- | |
* Trim PHP's padding and the canary byte; see note in | |
* rcube::encrypt() and http://php.net/mcrypt_generic#68082 | |
*/ | |
$clear = substr(rtrim($clear, "\0"), 0, -1); | |
return $clear; | |
} | |
/** | |
* Generates encryption initialization vector (IV) | |
* | |
* @param int Vector size | |
* | |
* @return string Vector string | |
*/ | |
private function create_iv($size) | |
{ | |
// mcrypt_create_iv() can be slow when system lacks entrophy | |
// we'll generate IV vector manually | |
$iv = ''; | |
for ($i = 0; $i < $size; $i++) { | |
$iv .= chr(mt_rand(0, 255)); | |
} | |
return $iv; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment