/** * Decrypt via MCrypt * * @param string $data Encrypted data * @param array $params Input parameters * @return string */ protected function _mcrypt_decrypt($data, $params) { if (!is_resource($params['handle'])) { return FALSE; } // The greater-than-1 comparison is mostly a work-around for a bug, // where 1 is returned for ARCFour instead of 0. if (($iv_size = mcrypt_enc_get_iv_size($params['handle'])) > 1) { if (mcrypt_enc_get_modes_name($params['handle']) !== 'ECB') { $iv = self::substr($data, 0, $iv_size); $data = self::substr($data, $iv_size); } else { // MCrypt is dumb and this is ignored, only size matters $iv = str_repeat("", $iv_size); } } else { $iv = NULL; } if (mcrypt_generic_init($params['handle'], $params['key'], $iv) < 0) { if ($params['handle'] !== $this->_handle) { mcrypt_module_close($params['handle']); } return FALSE; } $data = mdecrypt_generic($params['handle'], $data); // Remove PKCS#7 padding, if necessary if (in_array(strtolower(mcrypt_enc_get_modes_name($params['handle'])), array('cbc', 'ecb'), TRUE)) { $data = self::substr($data, 0, -ord($data[self::strlen($data) - 1])); } mcrypt_generic_deinit($params['handle']); if ($params['handle'] !== $this->_handle) { mcrypt_module_close($params['handle']); } return $data; }
/** * Decrypt via MCrypt * * @param string $data Encrypted data * @param array $params Input parameters * @return string */ protected function _mcrypt_decrypt($data, $params) { if (!is_resource($params['handle'])) { return FALSE; } elseif (!isset($params['iv'])) { // The greater-than-1 comparison is mostly a work-around for a bug, // where 1 is returned for ARCFour instead of 0. if (($iv_size = mcrypt_enc_get_iv_size($params['handle'])) > 1) { if (mcrypt_enc_get_modes_name($params['handle']) !== 'ECB') { $params['iv'] = substr($data, 0, $iv_size); $data = substr($data, $iv_size); } else { // MCrypt is dumb and this is ignored, only size matters $params['iv'] = str_repeat("", $iv_size); } } else { $params['iv'] = NULL; } } // CAST-128 compatibility (http://tools.ietf.org/rfc/rfc2144.txt) // // RFC2144 says that keys shorter than 16 bytes are to be padded with // zero bytes to 16 bytes, but (surprise) MCrypt doesn't do that. if ($params['cipher'] === 'cast-128' && ($kl = strlen($params['key'])) < 16) { $params['key'] .= str_repeat("", 16 - $kl); } if (mcrypt_generic_init($params['handle'], $params['key'], $params['iv']) < 0) { if ($params['handle'] !== $this->_handle) { mcrypt_module_close($params['handle']); } return FALSE; } $data = mdecrypt_generic($params['handle'], $data); // Remove PKCS#7 padding, if necessary if (in_array(strtolower(mcrypt_enc_get_modes_name($params['handle'])), array('cbc', 'ecb'), TRUE)) { $data = substr($data, 0, -ord($data[strlen($data) - 1])); } mcrypt_generic_deinit($params['handle']); if ($params['handle'] !== $this->_handle) { mcrypt_module_close($params['handle']); } return $data; }
<?php $td = mcrypt_module_open('rijndael-128', '', MCRYPT_MODE_ECB, ''); echo mcrypt_enc_get_modes_name($td) . "\n"; $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); echo mcrypt_enc_get_modes_name($td) . "\n"; $td = mcrypt_module_open(MCRYPT_WAKE, '', MCRYPT_MODE_STREAM, ''); echo mcrypt_enc_get_modes_name($td) . "\n"; $td = mcrypt_module_open(MCRYPT_BLOWFISH, '', MCRYPT_MODE_OFB, ''); echo mcrypt_enc_get_modes_name($td) . "\n"; $td = mcrypt_module_open('des', '', 'ecb', ''); echo mcrypt_enc_get_modes_name($td) . "\n"; $td = mcrypt_module_open('des', '', 'cbc', ''); echo mcrypt_enc_get_modes_name($td) . "\n";
$CC = "4007000000027"; $encrypted = mcrypt_ofb(MCRYPT_RIJNDAEL_128, substr($key, 0, 32), $CC, MCRYPT_ENCRYPT, substr($key, 32, 16)); $decrypted = mcrypt_ofb(MCRYPT_RIJNDAEL_128, substr($key, 0, 32), $encrypted, MCRYPT_DECRYPT, substr($key, 32, 16)); VERIFY($encrypted !== $decrypted); VS($decrypted, $CC); ////////////////////////////////////////////////////////////////////// VS(mcrypt_get_block_size("tripledes", "ecb"), 8); VS(mcrypt_get_cipher_name(MCRYPT_TRIPLEDES), "3DES"); VS(mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CFB), 16); VS(mcrypt_get_iv_size("des", "ecb"), 8); VS(mcrypt_get_key_size("tripledes", "ecb"), 24); $td = mcrypt_module_open("cast-256", "", "cfb", ""); VS(mcrypt_enc_get_algorithms_name($td), "CAST-256"); $td = mcrypt_module_open("tripledes", "", "ecb", ""); VS(mcrypt_enc_get_block_size($td), 8); $td = mcrypt_module_open("cast-256", "", "cfb", ""); VS(mcrypt_enc_get_iv_size($td), 16); $td = mcrypt_module_open("tripledes", "", "ecb", ""); VS(mcrypt_enc_get_key_size($td), 24); $td = mcrypt_module_open("cast-256", "", "cfb", ""); VS(mcrypt_enc_get_modes_name($td), "CFB"); $td = mcrypt_module_open("rijndael-256", "", "ecb", ""); VS(mcrypt_enc_get_supported_key_sizes($td), array(16, 24, 32)); $td = mcrypt_module_open("tripledes", "", "ecb", ""); VS(mcrypt_enc_is_block_algorithm_mode($td), true); $td = mcrypt_module_open("tripledes", "", "ecb", ""); VS(mcrypt_enc_is_block_algorithm($td), true); $td = mcrypt_module_open("tripledes", "", "ecb", ""); VS(mcrypt_enc_is_block_mode($td), true); $td = mcrypt_module_open("tripledes", "", "ecb", ""); VS(mcrypt_enc_self_test($td), 0);
<?php $td = mcrypt_module_open(MCRYPT_DES, '', MCRYPT_MODE_ECB, ''); mcrypt_generic_init($td, '', 'a'); var_dump(mcrypt_enc_get_algorithms_name($td)); var_dump(mcrypt_enc_get_block_size($td)); var_dump(mcrypt_enc_get_iv_size($td)); var_dump(mcrypt_enc_get_key_size($td)); var_dump(mcrypt_enc_get_modes_name($td)); var_dump(mcrypt_enc_get_supported_key_sizes($td)); var_dump(mcrypt_enc_self_test($td)); var_dump(mcrypt_generic_init($td, '', 'a'));