mcrypt_decrypt返回奇怪的代码

时间:2010-04-09 04:49:43

标签: php

我尝试加密一个数组,然后通过调用一个函数将其解密回字符串,如果我在函数中一次加密和解密,它似乎返回正确的值,但是,如果我返回加密值,那么再次调用该函数解密它会返回一些奇怪的代码。

示例1:

public main()
{
    $dataArray = array("one"=>1, "two"=>2, "three"=>3);
    $a = $this->encryptDecryptInfo(json_encode($dataArray),$this->key);
    var_dump($a);
}

public function encryptDecryptInfo($text,$key)
{
    $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, 
    $text= base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CFB, $iv));
    return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($text), MCRYPT_MODE_CFB, $iv);       
}

这将返回正确的值 string(27)“{”one“:1,”two“:2,”three“:3}”

示例2:

public main()
{
    $dataArray = array("one"=>1, "two"=>2, "three"=>3);
    $a = $this->encryptDecryptInfo(json_encode($dataArray),$this->key,"encrypt");       
    $b = $this->encryptDecryptInfo($a,$this->key,"decrypt");
    var_dump($b);
}

public function encryptDecryptInfo($text,$key,$type)
{
    $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB), MCRYPT_RAND);
    if($type == "encrypt")
        return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CFB, $iv));
    else return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($text), MCRYPT_MODE_CFB, $iv);      
}

但是,如果我以这种方式执行我的代码,它将返回奇怪的值,就像这样 string(27)“ ÔérôŸYéXgíœÈÐN*é౜CμÖ”

有人知道为什么会这样吗?加密和解密编码在示例1和示例2中都是相同的,但为什么它会在示例中返回奇怪的代码呢?有什么方法可以解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

我认为这是编码问题,在这里寻找UTF - http://php.net/manual/en/function.base64-encode.php在注释中有一个UTF8安全编码功能。

通过左右传递参数,您将更改编码,并在翻译中将其松散。欢迎使用PHP:)

答案 1 :(得分:1)

您必须使用相同的IV进行解密。只需将其与加密数据一起保存,例如:

if($type == "encrypt") {
    $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB), MCRYPT_RAND);
    return base64_encode($iv . '@@' .
        mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CFB, $iv));
} else {
    list($iv, $data) = explode('@@', base64_decode($text));
    return mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CFB, $iv);      
}

答案 2 :(得分:0)

我有类似的问题。在数据库中,我最初将其设置为16个字符。当我改为加密时,我忘了更改该号码,因此未存储整个加密值。一旦我更正了它,它返回正常字符:)