首页 文章

mcrypt_decrypt PHP正确用法

提问于
浏览
3

我认为我的PHP intall可能有问题 . 当我尝试这样做时,我得到了

警告:mcrypt_decrypt()[function.mcrypt-decrypt]:模块初始化失败

我正在编写一小段代码,它将使用模式ECB解密使用AES-128加密的以下字符串 .

密钥(以base64编码):aXJhbmRvbXNlY3VyZWtleQ ==加密字符串>(以base64编码):3l6xiNdgRG PkBw5M0lawvJ / fmuTZPRhEcbtqAmOpDI =

我一直在收到模块错误 .

这是我尝试过的:

<?PHP
$retval = mcrypt_decrypt( "AES-128",
    base64_decode( "aXJhbmRvbXNlY3VyZWtleQ=="), 
    base64_decode( "3l6xiNdgRG+PkBw5M0lawvJ/fmuTZPRhEcbtqAmOpDI") ,
    "ECB");

echo $retval;
?>

这是我的相关phpinfo . 我没看到AES-128 . 也许这就是问题所在 .

mcrypt
    mcrypt support  enabled
    Version     2.5.8
    Api No  20021217
    Supported ciphers   cast-128 gost rijndael-128 twofish arcfour      cast-256           loki97      rijndael-192 saferplus wake blowfish-compat des rijndael-256 serpent xtea blowfish enigma rc2 tripledes
    Supported modes     cbc cfb ctr ecb ncfb nofb ofb stream

1 回答

  • 5

    你很亲密,有两个小问题 .

    首先, AES-128 不是来自mcrypt的有效密码常量 . AES实际上是你支持的rijndael . AES-128的mcrypt cipher constantMCRYPT_RIJNDAEL_128 ,即字符串 rijndael-128 . 其次,mcrypt模式必须是小写的 .

    将代码更改为:

    <?php
    $retval = mcrypt_decrypt( "rijndael-128",
        base64_decode( "aXJhbmRvbXNlY3VyZWtleQ=="), 
        base64_decode( "3l6xiNdgRG+PkBw5M0lawvJ/fmuTZPRhEcbtqAmOpDI") ,
        "ecb");
    
    echo $retval;
    

    产生正确的输出: Is 3 random enough?

    就个人而言,我会使用mcrypt常量而不是实际字符串,因此将 rijndael-128 替换为 MCRYPT_RIJNDAEL_128 并将 ecb 替换为 MCRYPT_MODE_ECB .

    另外,如果要加密大量敏感信息,请考虑将CBC与IV而不是ECB一起使用 .

    Mcrypt可以使用适当的长度轻松为您创建IV . 示例代码:

    $ivsize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv     = mcrypt_create_iv($ivsize);
    

    加密和解密时使用此IV . 您可以将IV与您的数据一起作为base64编码字符串传递以实现可移植性 .

相关问题