Как зашифровать с помощью MCRYPT_ARCFOUR в WAMP? - PullRequest
1 голос
/ 07 ноября 2011

Я пытаюсь использовать алгоритм ARCFOUR в своем коде PHP:

$td = mcrypt_module_open(MCRYPT_ARCFOUR, '', MCRYPT_MODE_CBC, '');
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $key, $iv);
$output = mcrypt_generic($td, $input);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

, и проблема в том, что первая строка возвращает предупреждение:

mcrypt_module_open(): Could not open encryption module

Мои настройки:

  • Из вывода php_info ():

    команда configure: ... "--with-mcrypt = static" ...

    Если я прав, это означает, что мне не нужна DLL для расширения mcrypt.

    Поддерживаемые шифры: cast-128 gost rijndael-128 twofish arcfour cast-256 loki97 rijndael-192 saferplus wake blowfish-compat des rijndael-256 змея xtea blowfish загадка rc2 tripledes

  • PHP версия 5.3.8

  • Wamp 2.2a (32 бита)

Спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 07 ноября 2011

Начиная с 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

До тех пор, пока (если) не исправят эту ошибку или не найден обходной путь, вызахочу выбрать другой алгоритм шифрования.

1 голос
/ 15 мая 2015

Эти три являются потоковыми шифрами.Все остальные шифры являются блочными шифрами.Они не могут использовать одинаковые режимы друг с другом.

Так что просто используйте MCRYPT_MODE_STREAM, где вы используете MCRYPT_MODE_CBC, и вы должны быть золотыми.

Если нет, используйте что-то вроде этого:

/** Encrypts text with ARC4 algorithm. */
public static function encryptArc4($key, $data) {
    $iv = ""; // Empty init vector.
    return mcrypt_encrypt(MCRYPT_ARCFOUR, $key, $data, MCRYPT_MODE_STREAM, $iv);
}

/** Decrypts text with ARC4 algorithm. */
public static function decryptArc4($key, $data) {
    $iv = ""; // Empty init vector.
    return mcrypt_decrypt(MCRYPT_ARCFOUR, $key, $data, MCRYPT_MODE_STREAM, $iv);
}

У меня работает.

...