【问题标题】:How to encrypt with MCRYPT_ARCFOUR in WAMP?如何在 WAMP 中使用 MCRYPT_ARCFOUR 进行加密?
【发布时间】:2011-12-23 20:43:23
【问题描述】:

我正在尝试在我的 PHP 代码中使用 ARCFOUR 算法:

$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() 输出:

    命令配置:...“--with-mcrypt=static”...

    如果我是正确的,这意味着我不需要用于 mcrypt 扩展的 DLL。

    支持的密码: cast-128 gost rijndael-128 twofish arcfour cast-256 loki97 rijndael-192 safeplus wake blowfish-compat des rijndael-256 serpent xtea blowfish enigma rc2 Tripledes

  • PHP 版本 5.3.8

  • Wamp 2.2a(32 位)

感谢您的帮助!

【问题讨论】:

  • phpinfo() 是否有一个用于 mcrypt 的 专用部分,还是只是将其包含在配置行中?如果没有专门的部分,则扩展程序未正确加载。
  • 有专门的部分。它包含我在上面的问题中添加的受支持的密码。
  • 我正要说“好吧,这就解释了,那里没有 RC4”,但它正好位于 Twofish 和 CAST-256 之间。您的示例代码对我来说也失败了。 5.3.6.

标签: php cryptography wamp mcrypt


【解决方案1】:

从 PHP 5.3.6 和 5.4.0 RC6 开始arcfourwakeenigma 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 年没有反馈后关闭。RC4WAKE 和 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

在(除非)他们修复此错误或找到解决方法之前,您需要选择不同的加密算法。

【讨论】:

  • 我也找到了“PHP bug 49311”页面,但我希望不是我的情况。谢谢你的测试。 RC6、IDEA 和 CRYPT 也坏了(在我的系统上)。实际上,它甚至不适用于 5.3.8-pl0-gentoo。
  • 是的,很明显这是 mcrypt 扩展的一般问题,并且回复该错误的人甚至没有费心进行复制或故障排除。
  • 我将此问题发布到了 bugtracker。希望它会得到修复。但我现在需要这些算法,所以运气不好。
  • @MartyIX:如果您特别需要 RC4,在 PHP 中实现它应该不会太难,例如the pseudocode on Wikipedia。或者只使用您可以通过Googling for "php rc4" 找到的现有实现之一。它可能不会很快,但它应该可以完成这项工作。
  • phpseclib.sourceforge.net - 我找到了这个项目,明天我会测试它。
【解决方案2】:

这三个是流密码。所有其他密码都是块密码。它们不能使用彼此相同的模式。

所以只要在你使用 MCRYPT_MODE_CBC 的地方使用 MCRYPT_MODE_STREAM 就可以了。

如果没有,请使用以下内容:

/** 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);
}

为我工作。

【讨论】:

  • 函数有参数$data,但在正文中使用$text
  • @wqw 已修复,谢谢!其中一个 cmets 也有错误。
猜你喜欢
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 2022-01-13
相关资源
最近更新 更多