2010-04-09 58 views
1

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

实施例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);  
} 

这将返回我正确的值,它是串(27) “{” 一 “:1,” 2 “:2”,3 “: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);  
} 

但是,如果我这样做我的代码,它将返回我奇怪的值,它是这样的字符串(27)“ÔérôŸYEX gíœÈÐN*é౜CμÖ“

Deos任何人都知道为什么会发生这种情况?编码加密和解密都与例1和例2相同,但为什么它会在例子中返回奇怪的代码呢?有什么办法解决这个问题?

回答

1

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

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

+0

@Ivo Sabev嗯...任何方式,我可以解决这个问题? – 2010-04-09 05:20:36

+0

看看我附加的链接的评论。如果您不需要UTF或查看网页的中间位置,则可以将文件更改为ANSI我指出存在UTF安全的BASE64类 - http://www.php.net/manual/en/function .base64-encode.php#78765 – 2010-04-09 05:31:31

+0

这与编码无关。显然,OP使用两个不同的初始化向量(IV)来解密和解密字符串 - 这是行不通的。请参阅stereofrog关于将IV与加密数据一起保存的答案。 – 2010-04-09 07:15:25

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);  
} 
0

我有类似的问题。在数据库中,我最初设置了16个字符。当我更改为加密时,我忘记更改该编号,以免存储整个加密值。一旦我纠正这个,它返回正常字符:)