mcrypt_encrypt乱码文本

时间:2013-01-07 11:07:29

标签: php encryption

首先,请原谅这个问题,这可能是一个简单的问题,但我理解加密方法时遇到了麻烦。

我正在使用以下功能加密/解密:

private function encodemc($value,$skey){ 
    if(!$value){return false;}
    $skey = substr($skey, 2, 4);
    $text = $value;
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $skey, $text, MCRYPT_MODE_ECB, $iv);
    return trim($this->safe_encode($crypttext)); // safe_encode adds another encoding using `base64_encode`
}

private function decodemc($value,$skey){
    if(!$value){return false;}
    $skey = substr($skey, 2, 4);
    $crypttext = $this->safe_decode($value);
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $skey, $crypttext, MCRYPT_MODE_ECB, $iv);
    return trim($decrypttext);
}

$key如下所示:570c45546dwq45gjk191

我将要加密的值传递给第一个函数,然后将其保存到db,然后从db中检索它,我将其解密并将其显示为html文本。

问题在于某些文本没有得到正确的解密/加密,并且它在html页面中显示,就好像它的文本编码错误一样。

奇怪的部分是10个项目中,只有2或3个是乱码,具体取决于密钥。 此外,有时只有一部分字符串是乱码。

我发现造成乱码的原因是一些随机字母。例如,当使用上面的键时,字母S会破坏代码并且文本会出现乱码。

然后我将substr($skey, 2, 4);应用于密钥以查看是否有任何更改。事实证明,如果我更改密钥,则破坏代码的字符会有所不同。

但是,即使使用长度== 1的键,问题仍然存在。

知道问题是什么?

编辑:

这是代码的其余部分。

private function safe_encode($string) {
    $data = base64_encode($string);
    $data = str_replace(array('+','/','='),array('-','_',''),$data);
    return $data;
}

private function safe_decode($string) {
    $data = str_replace(array('-','_'),array('+','/'),$string);
    $mod4 = strlen($data) % 4;
    if ($mod4) {
        $data .= substr('====', $mod4);
    }
    return stripslashes(base64_decode($data));
}

1 个答案:

答案 0 :(得分:0)

这似乎是一个非常奇怪的问题。

我没有给你一个明确的答案,但这里有几件你可以尝试的事情。

  1. 无需转到数据库即可加密/解密。如果问题消失,那么数据库处理通过加密函数输出的字符就会出现问题。
  2. 在加密之前修剪该值。如果问题消失,那么加密后的修剪是错误的。
  3. 删除safe_encodesafe_decode代码。如果问题消失,那么这些功能就是添加/删除重要的东西。
  4. 重要的是,您可以一次完成上述所有操作,因为可能存在多个问题。如果上述步骤删除了问题,请一次重新引入一个问题,以确定导致问题的原因。