Начиная с PHP 5.3.6 и 5.4.0 RC6 , шифры arcfour
, wake
и enigma
mcrypt требуют использования режима stream
.Они не будут инициализировать ни один из других режимов, и никакие другие шифры не могут использовать режим stream
.
Это может быть верным и для более ранних версий PHP.
Демонстрационный код, с присутствующим @
для отключения предупреждения «Не удается открыть модуль»:
foreach(mcrypt_list_algorithms() as $alg) {
printf("\n%20s:", $alg);
foreach(mcrypt_list_modes() as $mode) {
$mc = @mcrypt_module_open($alg, null, $mode, null);
if(is_resource($mc)) echo "\t$mode";
else echo "\t!!FAIL!!:$mode";
}
}
echo "\n";
Демонстрационный выход:
cast-128: cbc cfb ctr ecb ncfb nofb ofb !!FAIL!!:stream
gost: cbc cfb ctr ecb ncfb nofb ofb !!FAIL!!:stream
rijndael-128: cbc cfb ctr ecb ncfb nofb ofb !!FAIL!!:stream
twofish: cbc cfb ctr ecb ncfb nofb ofb !!FAIL!!:stream
arcfour: !!FAIL!!:cbc !!FAIL!!:cfb !!FAIL!!:ctr !!FAIL!!:ecb !!FAIL!!:ncfb !!FAIL!!:nofb !!FAIL!!:ofb stream
cast-256: cbc cfb ctr ecb ncfb nofb ofb !!FAIL!!:stream
loki97: cbc cfb ctr ecb ncfb nofb ofb !!FAIL!!:stream
rijndael-192: cbc cfb ctr ecb ncfb nofb ofb !!FAIL!!:stream
saferplus: cbc cfb ctr ecb ncfb nofb ofb !!FAIL!!:stream
wake: !!FAIL!!:cbc !!FAIL!!:cfb !!FAIL!!:ctr !!FAIL!!:ecb !!FAIL!!:ncfb !!FAIL!!:nofb !!FAIL!!:ofb stream
blowfish-compat: cbc cfb ctr ecb ncfb nofb ofb !!FAIL!!:stream
des: cbc cfb ctr ecb ncfb nofb ofb !!FAIL!!:stream
rijndael-256: cbc cfb ctr ecb ncfb nofb ofb !!FAIL!!:stream
serpent: cbc cfb ctr ecb ncfb nofb ofb !!FAIL!!:stream
xtea: cbc cfb ctr ecb ncfb nofb ofb !!FAIL!!:stream
blowfish: cbc cfb ctr ecb ncfb nofb ofb !!FAIL!!:stream
enigma: !!FAIL!!:cbc !!FAIL!!:cfb !!FAIL!!:ctr !!FAIL!!:ecb !!FAIL!!:ncfb !!FAIL!!:nofb !!FAIL!!:ofb stream
rc2: cbc cfb ctr ecb ncfb nofb ofb !!FAIL!!:stream
tripledes: cbc cfb ctr ecb ncfb nofb ofb !!FAIL!!:stream
Похожевы (и я) видите PHP ошибку 49311 , которая была закрыта после отсутствия обратной связи в 2009 году. RC4 , WAKE и Enigma сломаны.Код для демонстрации проблемы:
foreach(mcrypt_list_algorithms() as $algo) {
echo $algo;
$td = mcrypt_module_open($algo, '', MCRYPT_MODE_CBC, '');
echo "\n";
}
Вывод на мою систему из интерактивного приглашения PHP:
cast-128
gost
rijndael-128
twofish
arcfourPHP Warning: mcrypt_module_open(): Could not open encryption module in php shell code on line 1
PHP Stack trace:
PHP 1. {main}() php shell code:0
PHP 2. mcrypt_module_open() php shell code:1
cast-256
loki97
rijndael-192
saferplus
wakePHP Warning: mcrypt_module_open(): Could not open encryption module in php shell code on line 1
PHP Stack trace:
PHP 1. {main}() php shell code:0
PHP 2. mcrypt_module_open() php shell code:1
blowfish-compat
des
rijndael-256
serpent
xtea
blowfish
enigmaPHP Warning: mcrypt_module_open(): Could not open encryption module in php shell code on line 1
PHP Stack trace:
PHP 1. {main}() php shell code:0
PHP 2. mcrypt_module_open() php shell code:1
rc2
tripledes
До тех пор, пока (если) не исправят эту ошибку или не найден обходной путь, вызахочу выбрать другой алгоритм шифрования.