从 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 bug 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
在(除非)他们修复此错误或找到解决方法之前,您需要选择不同的加密算法。